세션 로그인 예제

코코·2020년 8월 8일
0

Servlet/JSP

목록 보기
12/20

서블릿과 DB를 연동해서 ID 체크를 하고,
로그인 상태를 유지하는 예제다.

순서는 이렇다.

  1. login.html에서 아이디와 비밀번호를 입력한다.
  2. LoginServlet은 입력 받은 ID로 DB에 조회한다.
  3. 없는 아이디라면 login.html로 돌려보낸다.
  4. 있는 아이디라면 /show로 이동하여 회원 정보를 확인할 수 있다.

VO

public class MemberVO {
	private String id;
	private String pwd;
	private String name;
	private String email;
	private Date regdate;
	
        //Getter Setter 생략...
        ...
        ...
}

DAO

public class MemberDAO {
	private Connection con;
	private PreparedStatement pstmt;
	private DataSource ds;
	public boolean isExisted(MemberVO vo) {
		boolean result = false;
		String id = vo.getId();
		String pwd = vo.getPwd();
		
		try {
			//db - servlet 연결
			con = ds.getConnection();
			
			//조회하는 ID가 있으면  'true', 없으면 'false' (as result는 레코드 이름)
			String sql = "SELECT IF(COUNT(*) = 1 , 'true', 'false') AS RESULT"
					+ " FROM t_member"
					+" WHERE id = ? AND pwd = ?";
			
			//SQL문을 PrepareStatement에 등록하고 각각의 자리(?)를 채운다.
			pstmt = con.prepareStatement(sql);
			pstmt.setString(1, id);			
			pstmt.setString(2, pwd);
			
			//DB에 쿼리를 전송하고, 결과 값을 받는다.
			ResultSet rs = pstmt.executeQuery();

			rs.next();	//커서를 첫 번째 레코드에 위치한다.
			
			//'result'라는 레코드의  값을 boolean으로 변환
			result = Boolean.parseBoolean(rs.getString("result"));
			
			System.out.println("result : " + result);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}
}

LoginServlet

WebServlet("/login")
public class LoginServlet extends HttpServlet {
	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);
	}

	private 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 id = request.getParameter("id");
		String pwd = request.getParameter("password");
		
		MemberVO vo = new MemberVO();
		MemberDAO dao = new MemberDAO();
		boolean result = false;
		
		//vo객체에 id, pw를 저장
		vo.setId(id);
		vo.setPwd(pwd);
		
		//해당 id가 있으면 ture를, 없으면 false를 반환한다.
		result = dao.isExisted(vo);
		
		if(result) {
			HttpSession session = request.getSession();
			session.setAttribute("isLogOn", true);	//세션에 isLogOn이라는 이름으로 true를 저장
			session.setAttribute("login.id", id);	//id와 pw를 세션에 저장.
			session.setAttribute("login.pwd", pwd);
			
			out.print("<html><body><h1>안녕하세요 "+id+"님!</h1><br><h3><a href='/show'>회원정보</a></h3></body></html>");
			
		} else {
			out.print("<html><body><h1>아이디가 틀립니다.</h1><br><h3><a href='/login.html'>다시</a></h3></body></html>");
		}
	}
}

ShowMember.java

@WebServlet("/show")
public class ShowMember extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		String id = "", pwd = "";
		Boolean isLogOn = false;
		
		//이미 세션이 존재하면 세션을 반환, 없으면 null.
		HttpSession session = request.getSession(false);
		
		if(session != null) { //세션이 생성 됐는지 확인
			//LogOn속성을 가져와 로그인상태 확인
			isLogOn = (Boolean)session.getAttribute("isLogOn");
			
			if(isLogOn) {
				//Session에서 id와 pwd값을 가져온다.
				id = (String)session.getAttribute("login.id");
				pwd = (String)session.getAttribute("login.pwd");
				out.print("<html><body>아이디 : "+id+"<br>비밀번호 : "+pwd+"</body></html>");
			} else {
				response.sendRedirect("/login.html");
			}
		} else {
			response.sendRedirect("/login.html");
		}
	}
}

MySQL IF()

책 예제에서는 DB가 ORACLE이어서 DECODE()함수를 썼다.
MYSQL에서는 IF()로 비슷한 결과물을 얻을 수 있었다.

우선 책 예제에는 oracle의 decode()를 썼따.

-- ORACLE
SELECT DECODE(COUNT(*), 1, 'true', 'false') as result
from t_member
where id = 'hong'
and pwd = '1234';

where조건절에서 검색한 결과의 개수가 1이라면 'true'를 아니면 'false'를 result라는 레코드에 담아서 반환하는 쿼리문이다.
MySQL IF()함수로 써서 바꿔보면 이렇다.

-- MySQL
SELECT IF(COUNT(*) = 1, 'true', 'false') as result
from t_member
where id ='hong';


result라는 레코드로 true를 반환했다.

우선 '=='가 아니라 '='라는 것에 주의해야 한다.
이 쿼리의 결과물은 decode()를 이용한 결과와 같다.
id가 pk이므로 pwd까지 굳이 조회할 필요가 없어서 pwd를 조건 검사하는 절은 뺐다.

0개의 댓글