세션이란 ?
- 둘 이상의 page request에서 사용자를 식별하거나, 웹 사이트를 방문하고 해당 사용자에 대한 정보를 저장하는 방법을 제공한다.
- Servlet container는 HttpSession을 사용하여 Http client - HTTP server간의 세션을 생성한다.
- 세션은 한 명의 사용자에 해당한다. (브라우저 당 하나의 세션 객체가 생성된다.)
- 서버는 Cookie, rewriting URL과 같은 방법으로 세션을 유지하면서 관리할 수 있다.
- 객체를 세션에 바인딩하여 사용자 정보를 유지할 수 있다.
톰캣의 세션 동작 원리
- session.isNew() 메소드는 세션이 생성된 곳에서 아직 클라이언트가 세션 ID를 모르는 상태(최초 접속 상태)의 경우 "true"를 반환한다.
- 이 경우 아직 클라이언트 정보가 서버에 유지되지 않기 때문에, 서버는 Response Headers에 JSESSIONID 이라는 이름으로 쿠키 정보를 client로 전달한다.
- session.isNew() 메소드는 "false"를 반환하면 이미 세션이 설정되어있는 경우이며, 이 경우 client브라우저는 로컬에 저장되어 있는 JSESSIONID 쿠키 값을 request header에 담아 서버로 전송한다.
- 서버는 client로 부터 JSESSJIONID 쿠키 값을 전달 받으면 response로 JSESSIONIS 쿠키 값을 client로 보내지 않는다.
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>
<h3> 세션 동작 원리 </h3>
<!-- isNew() : 클라이언트가 세션 ID를 모르는 상태(최초 접속)인 경우 true를 반환 --%>
<!-- isNew()가 true를 반환하면 클라이언트 정보가 서버에 저장되지 않은 상태이다. -->
<p> isNew() : <%= session.isNew() %></p>
<hr>
<h4>쿠키 내용</h4>
<%
Cookie[] cc = request.getCookies();
if(cc != null) {
for(Cookie c : cc) {
String name = c.getName();
String value = c.getValue();
out.print("<p>"+name+" : "+ value + "</p>");
}
}
%>
</body>
</html>
쿠키를 사용하지 않는 세션 ID의 관리
- 휴대 기기 등 모든 단말이 쿠키를 사용할 수 있는 것은 아니다.
- 쿠키를 사용할 수 없는 경우 URL에 직접 세션 ID를 작성하여 세션 ID를 클라이언트 측에 유지시킨다.
구체적으로는 HttpServletResponse의 encodeURL (String url) 메소드를 사용한다.
PrintWriter writer = response.getWriter();
String link = "/main";
link = response.encodeURL(link);
writer.println("<a href = '"+link+"'>메인</a>");
encodeURL() 메소드를 사용하면 지정된 인수에 대해 다음의 값을 추가하며, 쿠키를 사용 못해도 클라이언트측에서 세션 ID를 보유할 수 있다.
jsessionid = 세션id
예제
sessionEx2
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>
<h3>session : 클라이언트의 정보를 서버에 저장</h3>
<!-- 세션은 일반적으로 로그인 처리 등에서 이용된다. -->
<p>
<a href="sessionSet.jsp">세션 설정</a> |
<a href="sessionInfo.jsp">세션 확인</a> |
<a href="sessionRemove.jsp">세션 제거</a>
</p>
</body>
</html>
sessionSet
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%
// session : 세션을 나타내는 JSP 내장 객체(HttpSession)
// 서블릿에서 세션 객체 구하기 : HttpSession sess = request.getSession();
// EL에서의 세션 객체 : sessionScope
// 세션 유지시간 설정(톰캣 기본 세션 유지시간 : 30분)
session.setMaxInactiveInterval(60*20); // 단위 : 초
session.setAttribute("name", "홍자바");
session.setAttribute("age", 20);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>
<h3>session 설정</h3>
<p>
<a href="sessionEx2.jsp">돌아가기</a>
</p>
</body>
</html>
sessionInfo
<%@page import="java.util.Date"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%
String name = "";
int age = 0;
try {
// 세션에 설정한 값 가져오기
name = (String)session.getAttribute("name");
age = (Integer)session.getAttribute("age");
} catch(Exception e) {
}
// 세션 유지시간
int interval = session.getMaxInactiveInterval();
// 세션 아이디
String id = session.getId();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
// 세션 생성 시간
Date date1 = new Date(session.getCreationTime());
String create_date = sdf.format(date1);
// 세션 마지막 접속 시간
Date date2 = new Date(session.getLastAccessedTime());
String last_date = sdf.format(date2);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>
<h3>session 정보</h3>
<p> 이름과 나이 : <%=name%>, <%=age%> </p>
<p> EL을 이용하여 세션 값 가져오기 : ${sessionScope.name}, ${sessionScope.age}</p>
<p> 세션 최대 유지시간 : <%=interval / 60 %>분 </p>
<p> 세션 아이디 : <%=id%></p>
<p> 세션 생성 시간 : <%=create_date %></p>
<p> 세션 마지막 접속 시간 : <%=last_date %></p>
<hr>
<p>
<a href="sessionEx2.jsp">돌아가기</a>
</p>
</body>
</html>
sessionRemove
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%
// 세션에 저장된 속성값 지우기
session.removeAttribute("name");
session.removeAttribute("age");
// 세션에 저장된 모든 속성값을 지우고 세션을 초기화
session.invalidate();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>
<h3> session 지우기</h3>
<p>
<a href="sessionEx2.jsp">돌아가기</a>
</p>
</body>
</html>
'쌍용강북교육센터 > 10월' 카테고리의 다른 글
1027_jQuery : jQuery, Core (0) | 2021.10.28 |
---|---|
1022_JSP/Servlet : 파일처리 (0) | 2021.10.25 |
1021_JSP/Servlet : 쿠키 Cookie (0) | 2021.10.25 |
1018~1019_JSP/Servlet : 자유게시판 만들기 :: ★중요★흐름, 파라미터생각해보기 (0) | 2021.10.20 |
1018_JSP/Servlet : 게시판 페이징 처리 클래스만들기 // 복습 (0) | 2021.10.20 |