본문 바로가기

WEB

[JSP/Servlet] session 구현해보기 / 로그인 유지하는 방법

오늘은 JSP와 Servlet에서 로그인을 유지할때 사용하는 세션객체에 대해서 알아봅시다.

 

 

웹 브라우저에 들어가면 일정시간동안 로그인이 유지되다가 아무 반응도 하지 않으면 로그인이 풀리는 것을 볼 수 있습니다. 이러한 기능을 세션으로 구현합니다. 로그인 유지와 더불어 로그인이 풀리는 시점까지 설정할 수 있습니다.


 

웹서버는 여러 클라이언트와 통신하기 때문에 데이터를 request에 담아서 구현하면 그림과 같은 분홍색 영역처럼 잠깐 저장이 됩니다. 잠깐 필요로하는 데이터면 문제가 없겠지만 로그인과 같이 일정시간동안 필요로하는 작업이면 문제가 많을 것 입니다. 

 

 

 

 


 

 

 

 

Client3에서 세션을 사용한 모습입니다. Client3에서 보면 request1에서 session.setAtrribute()를 사용하여 저장했던 데이터를 reques2 요청에서도 사용하는 것을 볼 수 있습니다. 이렇게 세션은 동일한 클라이언트가 다음 요청을 할 때 기억하여 다시 쓸 수 있습니다.

클라이언트마다 각각의 고유한 세션 영역이 있기 때문에 동일한 클라이언트에서는 접근할 수 있지만 다른 클라이언트에서는 접근이 불가능 합니다. 

 

 

 

 


1. JSP에서 세션 구현하기

 

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>index.jsp</title>
</head>
<body>
   <h3>폼을 jsp 페이지에 제출</h3>
   <form action="test/save.jsp" method="post">
      <input type="text" name="nick" placeholder="닉네임 입력..."/>
      <button type="submit">닉네임을 session 영역에 저장하기</button>
   </form>
   
   <%
      //session 영역에 "nick" 이라는 키값으로 저장된 문자열이 있는지 읽어와 본다.
      String nick=(String)session.getAttribute("nick");
   %>
   <%if(nick != null){ %>
      <p> 당신의 닉네임은 <strong><%=nick %></strong> 이군요 ^^</p>
   <%} %>
</body>
</html>

세션에 nick 속성이 있으면 출력해줍니다.

 

 

save.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
   //post 방식 전송했을때 한글 깨지지 않도록
   request.setCharacterEncoding("utf-8");
   //nick 이라는 파라미터명으로 전달된 파라미터 추출
   String nick=request.getParameter("nick");
   //session 영역에 "nick" 이라는 키값으로 추출한 내용을 담기
   session.setAttribute("nick", nick);
   //session 영역에 저장한 데이터 유지시간 지정하기
   session.setMaxInactiveInterval(60); //60초동안 어떤 요청도 하지 않으면 자동 삭제된다.(설정하지 않으면 30분)
   /*
      session scope (세션 영역) 에 담은 데이터가 삭제 되는 경우는
      1. 새로운 요청을 하지 않고 30분이 경과 했을때 (기본시간)
      2. 웹브라우저를 닫았을때
      3. HttpSession 객체의 메소드를 이용해서 강제로 삭제 했을때
   */
%>        
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>/test/save.jsp</title>
</head>
<body>
   <p> <strong><%=nick %></strong> 이라는 닉네임을 기억 하겠습니다.</p>
   <p>60초 동안 아무런 요청을 하지 않거나 웹브라우저를 닫으면 자동 삭제 됩니다.</p>
   <a href="../index.jsp">인덱스로 가기</a>
</body>
</html>

index.jsp에서 폼으로 전달한 nick을 getParameter로 전달받습니다. 전달받은 nick을 setAttribute를 사용하여 세션에 저장합니다. setMaxInactiveInterval을 사용하면 유지시간도 설정할 수 있습니다.

 

 


 

2. Servlet에서 세션 구현하기

 

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>index.jsp</title>
</head>
<body>
   <h3>폼을 서블릿에 제출</h3>
   <form action="test/save" method="post">
      <input type="text" name="nick" placeholder="닉네임 입력..."/>
      <button type="submit">닉네임을 session 영역에 저장하기</button>
   </form>
   
   <%
      //session 영역에 "nick" 이라는 키값으로 저장된 문자열이 있는지 읽어와 본다.
      String nick=(String)session.getAttribute("nick");
   %>
   <%if(nick != null){ %>
      <p> 당신의 닉네임은 <strong><%=nick %></strong> 이군요 ^^</p>
   <%} %>
</body>
</html>

세션에 nick 속성이 있으면 출력해줍니다.

 

 

 

SaveServlet.java

package test.servlet;

import java.io.IOException;

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;

@WebServlet("/test/save")
public class SaveServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		req.setCharacterEncoding("utf-8");
		String nick=req.getParameter("nick");
		//session scope에 저장하기 (어떻게 저장하지?)
		HttpSession session = req.getSession();
		session.setAttribute("nick", nick);
		
		/*
		 * 클라이언트에게 특정 경로로 요청을 다시하라는 응답
		 * 
		 * redirect 이동
		 */
		
		//context 경로를 HttpServletRequest 객체의 메소드를 이용해서 얻어온다.
		String cPath = req.getContextPath();
		//요청을 다시하라는 응답을 한다.
		resp.sendRedirect(cPath+"/index.jsp");
	}
}

index.jsp에서 폼으로 전달한 nick을 getParameter로 전달받습니다. 전달받은 닉을 setAttribute를 사용하여 세션에 저장합니다.

sendRedirect를 사용하여 index.jsp를 요청할 것 입니다. 이때 req.getContextPath()를 사용하여  프로젝트의 경로를 얻어내서 경로지정을 해줍니다.