오늘은 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()를 사용하여 프로젝트의 경로를 얻어내서 경로지정을 해줍니다.
'WEB' 카테고리의 다른 글
[WEB] HTML, JSP에서 JQuery 사용법 / chainAction 속성 (0) | 2021.11.29 |
---|---|
[Eclipse] 프로젝트 import 할 때 나타나는 버전 오류 해결법 (0) | 2021.11.29 |
[WEB] JSP를 사용하여 동적 웹 사이트 만들어보기/ JSP와 Servlet 비교 (1) | 2021.11.26 |
[WEB] GET과 POST의 차이 (0) | 2021.11.26 |
[WEB] Servlet을 사용하여 동적 웹 사이트 만들어보기 (0) | 2021.11.26 |