티스토리 뷰
반응형
- 실제 웹 사이트에서 DB와 연동한 후 세션을 이용해 로그인 상태를 유지하는 예제다.
- 로그인 폼을 만든다.
- DB 연동 관련 작업은 다음 글을 참고한다.
https://dev1023.tistory.com/72
* login.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인</title>
</head>
<body>
<form name="frmLogin" method="post" action="login" encType="UTF-8">
아이디 : <input type="text" name="user_id" /><br>
비밀번호 : <input type="password" name="user_pw" /><br>
<input type="submit" value="로그인" />
<input type="reset" value="다시 입력" />
</form>
</body>
</html>
- 로그인 기능을 담당하는 서블릿을 작성한다.
* LoginServlet.java
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Servlet implementation class LoginServlet
*/
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doHandle(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doHandle(request, response);
}
public void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String user_id = request.getParameter("user_id");
String user_pw = request.getParameter("user_pw");
// MmeberVO 객체를 생성하고 속성에 ID와 비밀번호를 설정한다.
MemberVO vo = new MemberVO();
vo.setId(user_id);
vo.setPwd(user_pw);
MemberDAO dao = new MemberDAO();
// MemberDAO의 isExisted() 메서드를 호출하면서 memberVO를 전달한다.
boolean result = dao.isExisted(vo);
if(result) {
// 조회 결과가 true이면 isLogOn 속성을 true로 세션에 저장한다.
HttpSession session = request.getSession();
session.setAttribute("isLogon", true);
// ID와 비밀번호도 같이 저장한다.
session.setAttribute("login.id", user_id);
session.setAttribute("login.pw", user_pw);
out.print("<html><body>");
out.print("안녕하세요 " + user_id + "님!");
out.print("<a href='show'>회원정보 보기</a>");
out.print("</body></html>");
}else {
out.print("<html><body><center>회원 아이디가 틀립니다.");
out.print("<a href='login.html'>다시 로그인하기</a>");
out.print("</body></html>");
}
}
public void destroy() {
System.out.println("destroyed");
}
}
* MemberVO.java
package vo;
import java.sql.Date;
public class MemberVO {
private String id;
private String pwd;
private String name;
private String email;
private Date joinDate;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getJoinDate() {
return joinDate;
}
public void setJoinDate(Date joinDate) {
this.joinDate = joinDate;
}
}
* MemberDAO.java
package dao;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import vo.MemberVO;
public class MemberDAO {
private Connection conn;
private PreparedStatement pstmt;
private DataSource dataFactory;
public MemberDAO() {
Context ctx;
try {
// JNDI에 접근하기 위해 기본 경로("java:/comp/env")를 지정
ctx = new InitialContext();
Context envContext = (Context)ctx.lookup("java:/comp/env");
// 톰캣 context.xml에 설정한 name 값인 jdbc/mysql을 이용해 톰캣이 미리 연결한 DataSource를 받아 옴.
dataFactory = (DataSource)envContext.lookup("jdbc/mysql");
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
// 회원 존재 여부 확인 메서드
public boolean isExisted(MemberVO member) {
boolean result = false;
String id = member.getId();
String pw = member.getPwd();
try {
conn = dataFactory.getConnection();
String query = "SELECT IF(COUNT(*) = 1, 'TRUE', 'FALSE') AS RESULT "
+ "FROM java_web.t_member "
+ "WHERE id = ? AND pwd = ?";
System.out.println("query : " + query);
pstmt = conn.prepareStatement(query);
pstmt.setString(1, id);
pstmt.setString(2, pw);
ResultSet rs = pstmt.executeQuery();
rs.next();
result = Boolean.parseBoolean(rs.getString("RESULT"));
System.out.println("result = " + result);
}catch(Exception e) {
e.printStackTrace();
}
return result;
}
}
- 로그인 성공 여부를 출력하는 showMember.java 서블릿을 만든다.
* ShowMember.java
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Servlet implementation class ShowMember
*/
@WebServlet("/show")
public class ShowMember extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String id = "", pw = "";
Boolean isLogon = false;
// 세션이 존재하면 세션을 반환하고, 없으면 null을 반환
HttpSession session = request.getSession(false);
if(session!=null) {
// isLogOn 속성을 가져와 로그인 상태를 확인
isLogon=(Boolean)session.getAttribute("isLogon");
if(isLogon != null) {
id = (String)session.getAttribute("login.id");
pw = (String)session.getAttribute("login.pw");
out.print("<html><body>");
out.print("아이디: " + id + "<br>");
out.print("비밀번호 : " + pw + "<br>");
out.print("</body></html>");
}else {
// 로그인 상태가 아니면 로그인 페이지로 이동
response.sendRedirect("login3.html");
}
}else {
// 세션이 생성되지 않았으면 로그인 페이지로 이동
response.sendRedirect("login3.html");
}
}
}
- 코드 작성 후 톰캣을 재시작하고 브라우저에 localhost:[port]/[project_name]/login.html 를 입력해 로그인 페이지에 접속한다.
- DB에 저장되어 있는 회원의 정보와 일치하게 아이디와 비밀번호를 입력하고 로그인한다면 다음과 같은 화면이 나타날 것이다.
- "회원정보 보기" 링크를 클릭하면 다음과 같이 회원 정보가 나타난다.
- 반면에 일치하지 않는 정보로 로그인을 시도하면 다음과 같은 페이지가 나타날 것이다.
반응형
'Servlet' 카테고리의 다른 글
서블릿 속성 및 스코프 (0) | 2024.08.13 |
---|---|
encodeURL() (0) | 2024.08.13 |
세션 트래킹 - 세션 (0) | 2024.08.12 |
세션 트래킹 - 쿠키 (0) | 2024.08.12 |
세션 트래킹 (0) | 2024.08.12 |
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Network
- 서브넷팅
- javaserverpage
- 서블릿
- 스프링
- html css
- 네트워크
- CSS
- 리액트
- Spring
- script element
- react
- Binding
- JSP
- httpServletRequest
- Redux
- HTML
- 제이쿼리
- CSS 속성
- 세션
- Java Server Page
- 미들웨어
- Spring MVC
- a 태그
- el
- Servlet
- 내장객체
- FMT
- Session
- nodejs
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함