[JSP] Session(세션)

max9106·2020년 1월 13일
0

[JSP]JSP기초

목록 보기
12/19

Session이란?

쿠키와 마찬가지로, 클라이언트와 서버의 연결을 유지시켜주는 방법 중 하나이다.

http 프로토콜은 요청(클라이언트 -> 서버) 한 번과, 응답(서버 -> 클라이언트) 한 번이 이루어지면, 연결을 해제한다. 연결을 계속 유지시 서버 과부하가 걸릴 수 있기 때문이다.

그래서, 기존 정보를 계속 유지할 방법이 필요하다. 요청과 응답이 이루어지고 나면 session을 사용하여 해당 정보를 저장하고 있는다.

쿠키와 달리, 세션은 웹 컨테이너, 즉 서버에서 만들어진다.

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");
    }
}
profile
이전 블로그: https://blog.naver.com/max9106

0개의 댓글