티스토리 뷰

728x90
반응형

세션이란 서버 측의 컨테이너에서 관리되는 정보로, 이 정보는 컨테이너에서 접속해서 종료되기까지 유지되며 접속 시간에 제한을 두어 일정 시간 응답이 없다면 정보가 더 이상 유지되지 않도록 설정할 수 있다.

따로 시간 설정을 하지 않으면 기본 시간은 30분이다.

또한, 페이지와 관련없이 연결이 되어 있으면 그 값이 유지된다. 

로그인 이후 아무런 액션이 일어나지 않으면 자동으로 로그아웃되는 경우와, 로그인 이후 페이지를 이동해도 로그인이 유지되는 것이 바로 위의 예시이다.


session scope 데이터 삭제되는 경우

 

1. 새로운 요청을 하지 않고 30분이 경과했을 때 (기본시간)

2. 웹 브라우저를 닫았을 때

3. HttpSession 객체의 메소드를 이용해서 강제로 삭제했을 때

 


request와 session의 비교

 

웹 서버는 여러 명의 클라이언트를 상대한다.

클라이언트가 요청을 하면 연두색의 어떠한 과정을 거쳐 응답을 받게 된다.

연두색의 하나의 과정 속에서 request.setAttribute() 를 한다면 딱 분홍색까지만 유효하다(데이터를 기억한다).

따라서 응답을 하고나면 싹 사라진다. (일회성 데이터

session에 담는다면, 즉 session.setAttribute()로 담은 데이터는 주황색 선처럼 응답을 하고 나서도 유효하다. 

즉, 동일한 클라이언트(client3)가 두번째 요청을 했을 때도, 어떠한 과정을 거쳐 응답을 할텐데 응답되는 과정에서 이전 요청을 처리할 때 세션에 담았던 내용을 읽어낼 수 있다.

또한, 다른 클라이언트와는 별개의 영역으로 각 클라이언트는 고유한 세션을 가진다. 


세션의 몇가지 메소드를 알아보자.

메소드 설명
getId() 반환값: String
세션의 ID 반환
setAttribute() 세션에 데이터 저장
removeAttribute() 세션에서 특정 데이터 제거
invalidate() 세션의 모든 데이터 삭제
getValueNames() 반환값: String[]
세션에 연결된 모든 객체의 이름을 배열로 반환 

 

 


그럼 이제 세션을 구현해보자.

 

1. jsp에서 세션 구현하기

Step04_Scope - 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>
	<h1>인덱스 페이지입니다.</h1>
	
	<h3>폼을 jsp 페이지에 제출</h3>
	<form action="test/save.jsp" method = "post">
		<input type="text" name ="nick" placeholder="닉네임 압력..." />
		<button type="submit">닉네임을 session 영역에 저장하기</button>
	</form>
	
	<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이라는 파라미터 명으로 닉네임을 전달한다.

 


이제 test 폴더의 save.jsp를 만들어보자.

jsp에서는 세션이 기본 객체 이므로 편리하게 사용할 수 있다.

 

1. 인코딩 설정

request.setCharacterEncoding("utf-8");

 

2. nick 이라는 파라미터명으로 전달된 파라미터 추출

//nick 이라는 파라미터명으로 전달된 파라미터 추출
String nick = request.getParameter("nick");

 

 

3. session 영역에 "nick"이라는 키값으로 추출한 내용 담기

session.setAttribute("nick", nick);

 

 

4. session 영역에 저장한 데이터 유지시간 설정하기

//60초동안 어떤 요청도 하지 않으면 자동 삭제된다.(설정하지 않으면 30분)
session.setMaxInactiveInterval(60);

 


전체 코드

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>


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>
	<h1>인덱스 페이지입니다.</h1>
	
	<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>


Java Resources - SaveServlet.java

 

1. 인코딩 설정 & nick 이라는 파라미터명으로 전달된 파라미터 추출

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		req.setCharacterEncoding("utf-8");
		String nick = req.getParameter("nick");
        
 }

 

2. session scope에 저장하기

jsp에서는 session이 기본 객체였지만 servlet에서는 getSession()을 해주어야 한다.

HttpSession session = req.getSession();
session.setAttribute("nick",nick);

 

3. index 페이지로 redirect하기

//context 경로를 HttpServletRequest 객체의 메소드를 이용해서 얻어온다.
String cPath = req.getContextPath();
//요청을 다시하라는 응답을 한다.
resp.sendRedirect(cPath+"/index.jsp");

 

redirect클라이언트에게 특정 경로로 요청을 다시하라는 응답이다. 

즉, 처리할 것을 처리하고 해당 경로로 요청을 다시하라고 강요하는 것이다.


전체 코드

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;

import org.apache.catalina.Session;
@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");
	}

}

 


참고 : https://do-hyeon.tistory.com/130

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함