티스토리 뷰

Servlet

서블릿 - 세션 로그인 예제

dev23 2024. 8. 12. 21:53
반응형

- 실제 사이트에서 DB 연동한 세션을 이용해 로그인 상태를 유지하는 예제다.

- 로그인 폼을 만든다.

 

- DB 연동 관련 작업은 다음 글을 참고한다.

https://dev1023.tistory.com/72

 

DataSource를 이용한 DB 연동

DataSource- 웹 애플리케이션이 실행됨과 동시에 연동할 DB와의 연결을 미리 설정한다.- 필요할 때 마다 미리 연결해 놓은 상태를 이용해 빠르게 DB와 연동하여 작업한다.- 미리 데이터베이스와 연결

dev1023.tistory.com

 

* 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
링크
«   2024/11   »
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
글 보관함