1. 세션의 기본 정의
- 클라이언트 마다 서로 다른 정보를 저장할 수 있는 서버 저장소
- 서버에 접속한 클라이언트의 수 만큼 세션을 생성해야 할 수도 있다
- 세션에 유효시간을 설정하여 일정 시간 이후 자동으로 로그아웃을 구현할 수 있다
- 서버에는 다수의 세션이 있어서, 이를 구분하기 위한 id가 있다
2. 세션 내장 메소드
<h3>1) 세션 ID : <%=session.getId() %></h3>
<h3>2) 쿠키에 저장된 세션 ID : ${cookie.JSESSIONID.value }</h3>
<!-- 쿠키에 마지막으로 쓰인 세션의 ID가 저장된다. -->
<!-- 두번째 방문에 쿠키가 저장된다 -->
<h3>3) 세션 생성 시간 : <%=session.getCreationTime() %></h3>
<h3>4) 세션 마지막 사용 시간 : <%=session.getLastAccessedTime() %></h3>
<h3>4 - 3) <%=(session.getLastAccessedTime() - session.getCreationTime()) / 1000 %></h3>
<h3>세션 최대 유지 시간 : <%=session.getMaxInactiveInterval() %></h3>
<!-- 0을 넣을시 사라지지않는 대기시간 무한대를 가지게 된다 (쿠키와 다름) -->
<!-- session.invalidate()을 이용해서 없애야 한다. -->
<!-- 세션쿠키 : 활성 웹 브라이저 세션이 있는 기간 동안 저장되는 쿠키
<%
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(60);
response.addCookie(cookie);
%>
<a href="ex01-invalidate.jsp"><button>세션 제거 (로그아웃)</button></a>
- 세션 삭제
<%
session.invalidate();
response.sendRedirect("ex01.jsp");
%>
3. 세션과 쿠키를 이용하여 자동로그인 구현
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" session="true" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex02-form.jsp</title>
</head>
<body>
<%
// 쿠키를 이용하여 이전에 사용했던 세션을 불러오는 과정 (deprecated)
Cookie[] cookies = request.getCookies();
for(int i = 0; cookies != null && i < cookies.length; i++) {
Cookie cookie = cookies[i];
if(cookie.getName().equals("JSESSIONID")) {
System.out.println("1)" + session.getId());
System.out.println("2)" + cookie.getValue());
// session = session.getSessionContext().getSession(cookie.getValue());
// System.out.println("2)" + session.getId());
}
}
HttpSession newSession = request.getSession();
/*
Returns the current session associated with this
request, or if the request does not have a session, creates one
*/
System.out.println();
%>
<%
if(session.getAttribute("login") != null) {
response.sendRedirect("ex02-main.jsp");
return; // 현재 실행중인 함수를 종료하는 제어문
// 스크립틀릿은 서블릿의 service() 메서드내부이기 때문에 사용 가능
}
%>
<h1>세션쿠키를 활용한 자동 로그인</h1>
<hr>
<form action="ex02-action.jsp" method="POST">
<p><input type="text" name="userid" placeholder="ID" required autofocus></p>
<p><input type="password" name="userpw" placeholder="Password" required></p>
<p>
<label>
<input type="checkbox" name="autologin" value="on">자동 로그인
</label>
</p>
<p><input type="submit" value="로그인"></p>
</form>
</body>
</html>
<%@ page import="day09.Member"%>
<%@ page import="day09.Handler"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex02-action.jsp</title>
</head>
<body>
<%--
form에서 입력받은 데이터로 로그인을 판별하여 세션에 저장
필요하다면 쿠키도 활용하여 처리함
성공하면 main 으로 이동
실패하면 form 으로 다시 이동
자동로그인에 체크했다면 현재 세션의 id를 쿠키에 저장(24시간)
--%>
<%
Handler handler = (Handler)application.getAttribute("handler");
if(handler == null) {
handler = new Handler();
application.setAttribute("handler", handler);
}
%>
<jsp:useBean id="user" class="day09.Member" />
<jsp:setProperty property="*" name="user"/>
<%
Member login = handler.login(user);
if(login == null) {
response.sendRedirect("ex02-form.jsp");
}
else {
session.setAttribute("login", login);
if(request.getParameter("autologin") != null) {
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(60 * 60 * 24);
response.addCookie(cookie);
}
response.sendRedirect("ex02-main.jsp");
}
%>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex02-logout.jsp</title>
</head>
<body>
<%--
main에서 로그아웃 버튼을 통해 로그아웃으로 이동
현재 세션을 무효화시키고, 다시 로그인 페이지(form)로 이동
--%>
<%
session.invalidate();
response.sendRedirect("ex02-form.jsp");
%>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex02-main.jsp</title>
</head>
<body>
<%--
로그인에 성공하면 main으로 이동한다
main에서는 로그아웃 버튼으로 로그아웃 가능
현재 로그인한 사용자의 이름과 id를 출력해야 한다
--%>
<%
if(session.getAttribute("login") == null) {
response.sendRedirect("ex02-form.jsp");
return;
}
%>
<h1>ex02-main.jsp</h1>
<hr>
<h3>
${login.username }
(${login.userid })
님 로그인 성공, 안녕하세요
</h3>
<p>
<a href="ex02-logout.jsp"><button>로그아웃</button></a>
</p>
</body>
</html>
자바 코드(자바빈즈, 핸들러)
package day09;
public class Member {
// 자바 빈즈 클래스의 멤버 필드 이름은 input 태그의 name과 일치해야 하며
// getter/setter도 같은 형식의 이름을 유지해야 한다
private String userid; // getUserId()
private String userpw;
private String username;
public Member() {
// TODO Auto-generated constructor stub
}
public Member(String userid, String userpw, String username) {
super();
this.userid = userid;
this.userpw = userpw;
this.username = username;
}
public String getUserid() {
return userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
public String getUserpw() {
return userpw;
}
public void setUserpw(String userpw) {
this.userpw = userpw;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
package day09;
import java.util.ArrayList;
import java.util.Arrays;
public class Handler {
ArrayList<Member> list;
public Handler() {
Member[] arr = {
new Member("test", "1234", "테스트"),
new Member("admin", "1", "관리자"),
new Member("itbank", "it", "아이티뱅크"),
};
list = new ArrayList<Member>(Arrays.asList(arr));
// Member[] -> List<Member> -> ArrayList<Member>
// List<T>로 받을 경우,
}
// 로그인에 성공한 객체를 반환하도록 만들자
// boolean 만 반환하면, 성공 실패는 판별할 수 있으나, 어느 계정인지 확인할 수 없다
public Member login(Member user) {
Member login = null;
for(Member mem : list) {
if(mem.getUserid().equals(user.getUserid())) {
if(mem.getUserpw().equals(user.getUserpw())) {
login = mem;
login.setUserpw(null);
break;
}
}
}
return login;
}
}
'개발자 > JSP' 카테고리의 다른 글
[SQL] DB Table 제약조건 (0) | 2022.12.09 |
---|---|
[JDBC] 자바와 sql 연결 후 출력하는 방법 (0) | 2022.12.06 |
[JSP] 쿠키(Cookie) (0) | 2022.12.02 |
[JSP]Attribute 속성 활용 (0) | 2022.11.28 |
JSP에서 자바빈을 사용하기 위한 액션태그 (0) | 2022.11.24 |