쿠키와 마찬가지로, 클라이언트와 서버의 연결을 유지시켜주는 방법 중 하나이다.
http 프로토콜은 요청(클라이언트 -> 서버) 한 번과, 응답(서버 -> 클라이언트) 한 번이 이루어지면, 연결을 해제한다. 연결을 계속 유지시 서버 과부하가 걸릴 수 있기 때문이다.
그래서, 기존 정보를 계속 유지할 방법이 필요하다. 요청과 응답이 이루어지고 나면 session을 사용하여 해당 정보를 저장하고 있는다.
쿠키와 달리, 세션은 웹 컨테이너, 즉 서버에서 만들어진다.
로그인 할 때 정보저장을 session을 사용해서 해보려고한다.(cookie에서 했던 실습이랑 내용은 동일하다.)
로그인 form을 만든다. submit시, loginCheck라는 servlet으로 mapping된다.
request객체의 getParameter 메서드를 이용하여 데이터가 제대로 넘어옴을 확인할 수 있다.
이 정보를 session에 저장해보려고 한다.
session 정보는 HttpSession이라는 interface를 이용해 담을 수 있고, request 객체에서 얻어올 수 있다.
session에 정보를 저장할 때는 setAttribute 메서드를 이용한다.
session에 정보 저장이 끝나면, loginOk.jsp 페이지로 응답해준다.
loginOk.jsp 페이지에서는 request 객체의 getSession 메서드를 이용하여, session 값들을 불러오고, 확인해준다.
login form에서 입력한 값이 출력됨을 볼 수 있다.
로그아웃하는 경우, session을 날려주어야한다. loginOk.jsp 페이지에 로그아웃 버튼을 하나 추가하여, 그 버튼을 누를 시, logoutCheck servlet으로 mapping 시켜주겠다.(logoutCheck이라는 servlet을 만들어준다.)
HttpSession interface에 request 객체를 사용하여 session값을 가져오고, invalidate 메서드를 사용하여 해당 session을 날려준 후, login페이지로 응답해준다.
*맨 처음 login.jsp 페이지에서 해줘야하는 일이 한 가지 더있다. session값이 있는지 확인하여, 있으면 login form을 띄워주는 것이 아니라 자동으로 로그인이 되어있게 해줘야한다.
요새 추세는 쿠키보다 세션을 많이 사용한다. 쿠키는 보안에 취약하기 때문이다.
// login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Login</title>
</head>
<body>
<%
// session 객체에 memberId라는 session이 있으면,
if(session.getAttribute("memberId") != null){
// loginOk.jsp로 응답
response.sendRedirect("loginOk.jsp");
}
%>
<form action="loginCheck" method="post">
ID: <input type="text" name="userID"><br>
Password: <input type="password" name="userPwd"><br>
<input type="submit" value="login">
</form>
</body>
</html>
// loginCheck.java
package com.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/loginCheck")
public class loginCheck extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
String userId = request.getParameter("userID");
String userPwd = request.getParameter("userPwd");
out.println(userId);
out.println(userPwd);
HttpSession session = request.getSession();
session.setAttribute("memberId", userId);
// view 페이지로 응답해줌
response.sendRedirect("loginOk.jsp");
}
}
//loginOk.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Login OK </title>
</head>
<body>
<%
session = request.getSession();
out.print("member ID: "+ session.getAttribute("memberId") + "<br>");
%>
<form action="logoutCheck" method="post">
<input type="submit" value="log out">
</form>
</body>
</html>
// logoutCheck.java
package com.servlet;
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;
import java.io.IOException;
@WebServlet("/logoutCheck")
public class logoutCheck extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//request 객체에서 session을 가져옴
HttpSession session = request.getSession();
// 해당 session을 날려버림
session.invalidate();
//다시 login.jsp 페이지로 응답
response.sendRedirect("login.jsp");
}
}