개발자/JSP

[JSP] 세션(session)

푸루닉 2022. 12. 5. 16:15

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