* 브라우저별로 세션이 생긴다.
- 서버 세션을 사용하면 클라이언트의 상태를 저장할 수 있다.
- 쿠키와의 차이점 : 세션은 브라우저가 아니라 서버에 값을 저장한다는 점
1. 세션 사용하기 : session 기본 객체
- 웹 컨테이너에서 클라이언트의 정보를 보관할 때 사용
- 오직 서버에서만 생성
- 클라이언트마다 세션이 생성
[ 1. 세션 생성하기 ]
- JSP에서 세션을 생성하려면 다음과 같이 page 디렉티브의 session 속성을 "true"로 저장하면 된다.
* true가 디폴트 값이다.
<% page contentType = "text/html; charset=utf-8" %>
<%@ page session = "true" %>
<%
...
session.setAttribute("userInfo", userInfo);
...
%>
[ 2. session 기본 객체 ]
- 웹 서버는 웹 브라우저에 세션 ID를 전송한다.
웹 브라우저는 웹 서버에 연결할 때마다 매번 세션 ID를 보내서 웹 서버가 어떤 서버가 어떤 세션을 사용할지 판단할 수 있게 한다.
* 새로운 브라우저마다 session이 새롭게 생성된다.
* 브라우저가 죽으면 세션도 죽는다 (사라진다).
* 브라우저가 계속 떠있다고 세션이 그대로 있느냐? 그것도 아니다!
--> 최근 접속시간과 실시간 현재 시간과의 차이가 어느정도 일정 시간이 지나면
그 브라우저의 세션을 없애버린다.
--> [ 5. 세션 유효시간 ] 참고
// sessionInfo.jsp 코드
<%@ page contentType="text/html; charset=utf-8"%>
<%@ page session="true"%>
<%@ page import="java.util.Date"%>
<%@ page import="java.text.SimpleDateFormat"%>
<%
Date time = new Date();
SimpleDateFormat formatter =
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
%>
<html>
<head>
<title>세션정보</title>
</head>
<body>
세션ID:
<%= session.getId() %>
<br>
<%
time.setTime(session.getCreationTime());
%>
세션생성시간:
<%= formatter.format(time) %>
<br>
<%
time.setTime(session.getLastAccessedTime());
%>
최근접근시간:
<%= formatter.format(time) %>
</body>
</html>
[ 3. 기본 객체의 속성 사용 ]
- 한 번 생성된 세션은 지정한 유효 시간 동안 유지된다.
// setMemberInfo.jsp 코드
<%@ page contentType="text/html; charset=utf-8"%>
<%
session.setAttribute("MEMBERID", "madvirus");
session.setAttribute("NAME", "최범균");
%>
<html>
<head>
<title>세션에 정보 저장</title>
</head>
<body>세션에 정보를 저장하였습니다.
</body>
</html>
// viewMemberInfo.jsp 코드
<%@ page contentType="text/html; charset=utf-8"%>
<html>
<head>
<title>세션 정보 조회</title>
</head>
<body>
MEMBERID =
<%=session.getAttribute("MEMBERID")%><br /> NAME =
<%=session.getAttribute("NAME")%>
</body>
</html>
* 브라우저가 죽지 않는 한 session에 MEMBERID 에는 "madvirus"가 NAME 에는 "최범균"이라는 값이 들어있을 것이다.
* // A.jsp
request.setAttribute("name", "hong");
// B.jsp
String name = request.getAttribute("name");
* 페이지가 바뀌면 request 객체도 달라지기 때문에 원래 데이터를 서로 볼 수가 없다. 하지만 session이 같으면 request 객체도 같아지기 때문에 데이터를 서로 볼 수가 있고 공유할 수 있게 된다..?
[ 4. 세션 종료 ]
* 세션 종료는 그냥 브라우저를 종료하면 종료가 된다. 하지만 코드로 우리가 직접 종료시킬 수 있다.
* 브라우저 죽이지 않아도 session.invalidate( ) 해주면 세션을 죽이게 된다. 즉, 그 세션ID를 날린것!!
그래서 그 세션에서 있는 request 객체가 가지고 있는 데이터 값이 사라지게 된다.
// closeSession.jsp 코드
<%@ page contentType = "text/html; charset=utf-8" %>
<%
session.invalidate();
%>
<html>
<head><title>세션 종료</title></head>
<body>
세션을 종료하였습니다.
</body>
</html>
[ 5. 세션 유효 시간 ]
- 세션은 최근 접근 시간을 갖는다. getLastAccessedTime() 메서드는 최근에 session 기본 객 체에 접근한 시간을 나타낸다. session.setMaxInactiveInterval() 메서드는 초 단위로 유효 시간을 설정한다.
* 일정한 기간동안 그 브라우저에 접속을 안하게 되면 그 세션을 날리겠다!!
이게 바로 세션에 유효 시간을 준 것이다.
* 30분동안 브라우저에 접속을 안하게 되면 그 브라우저의 세션이 삭제된다.
// 세션의 최근 접근 시간
session.getLastAccessedTime();
// 세션의 유효 시간을 30분으로 지정 (방법1)
session.setMaxInactiveInterval(60*30);
- 세션 유형 시간을 web.xml 파일에 다음과 같이 태그를 사용하여 지정할 수 도 있다. 이 값의 단위는 분이다. (방법2)
// WEB-INF/web.xml 코드
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<session-config>
<session-timeout>30</session-timeout>
</session-config>
</web-app>
[ 6. request.getSession( ) 을 이용한 세션 생성 ]
- HttpSession을 생성하는 또 다른 방법은 request 기본 객체의 getSession() 메서드를 사용하 는 것이다.
2. 세션 사용한 로그인 상태 유지
- 세션을 사용해서 로그인을 처리하는 방식은 쿠키를 사용한 방식과 비슷하다.
- 1. 로그인에 성공하면 session 기본 객체의 특정 속성에 데이터를 기록한다.
2. 이후로 session 기본 객체의 특정 속성이 존재하면 로그인한 것으로 간주한다.
3. 로그아웃할 경우 session.invalidate() 메서드를 호출하여 세션을 종료한다.
[ 1. 인증된 사용자 정보 session 기본 객체에 저장하기 ]
// sessionLoginForm.jsp 코드
<%@ page contentType="text/html; charset=utf-8"%>
<html>
<head>
<title>로그인폼</title>
</head>
<body>
<form action="<%= request.getContextPath() %>/member/sessionLogin.jsp"
method="post">
아이디 <input type="text" name="id" size="10"> 암호 <input
type="password" name="password" size="10"> <input
type="submit" value="로그인">
</form>
</body>
</html>
//sessionLogin.jsp 코드
<%@ page contentType = "text/html; charset=utf-8" %>
<%
String id = request.getParameter("id");
String password = request.getParameter("password");
if (id.equals(password)) {
session.setAttribute("MEMBERID", id);
%>
<html>
<head><title>로그인성공</title></head>
<body>
로그인에 성공했습니다.
</body>
</html>
<%
} else { // 로그인 실패시
%>
<script>
alert("로그인에 실패하였습니다.");
history.go(-1);
</script>
<%
}
%>
[ 2. 인증 여부 판단 ]
// sessionLoginCheck.jsp 코드
<%@ page contentType="text/html; charset=utf-8"%>
<%
String memberId = (String)session.getAttribute("MEMBERID");
boolean login = memberId == null ? false : true;
%>
<html>
<head>
<title>로그인여부 검사</title>
</head>
<body>
<%
if (login) {
%>
아이디 "<%= memberId %>"로 로그인 한 상태
<%
} else {
%>
로그인하지 않은 상태
<%
}
%>
</body>
</html>
[ 3. 로그아웃 처리 ]
// sessionLogout.jsp 코드
<%@ page contentType = "text/html; charset=utf-8" %>
<%
session.invalidate();
%>
<html>
<head><title>로그아웃</title></head>
<body>
로그아웃하였습니다.
</body>
</html>
3. 연관된 정보 저장을 위한 클래스 작성
<%
String id = (String)session.getAttribute("id");
String name = (String)session.getAttribute("name");
String email = (String)session.getAttribute("email");
String name = (String)session.getAttribute("male");
int age = (String)session.getAttribute("age");
%>
public class Memberinfo {
private String id;
private String name;
private String email;
private String male;
private int age;
// get 메서드
}
4. 서블릿 컨텍스트와 세션
- 서로 다른 두 웹 어플리케이션이 다른 세션 ID를 사용하고 다른 JSESSIONID 쿠키를 사용한 다.
다시 말하면 서로 다른 웹 어플리케이션이 세션을 공유하지 않음을 의미한다.
'Language > JSP' 카테고리의 다른 글
10장_표준 태그 라이브러리(JSTL) (0) | 2023.01.26 |
---|---|
09장_표현언어(Expression Language) (0) | 2023.01.26 |
03장_JSP로 시작하는 웹 프로그래밍 (0) | 2023.01.19 |