JSP

[JSP]session

MoZZANG 2022. 5. 3. 19:26
세션이란?

: 클라이언트가 서버에 접속해 있는 상태를 말하는것으로 방문자가 웹 브라우저를 열어 서버에 접속하고 다시 웹브라우저를 닫아 서버와의 연결을 종료하는 하나의 단위를 세션이라 함. 즉 접속한 상태의 유지기간을 의미함.

 

 

- 클라이언트의 상태정보를 저장하기 위한 기술.  내장 개체중 session개체에 정보가 저장됨.
- 쿠키는 클라이언트에 저장되지만 session은 서버에 저장된다.
- session 개체는 웹브라우저당 1개의 개체가 할당되어 사용자 인증에 관련된 작업을 수행 시 주로 사용한다.
- page 지시자의 session 속성이 "true"인 경우에만 사용 가능.(기본값 true)
- seeeion개체는 일정시간동안 아무런 요청도 하지 않으면 자동적으로 삭제 된다.(기본: 30분)
- 세션 설정시 내부적으로 JSESSIONID라는 쿠키명으로 세션아이디값을 쿠키값으로 설정한다.

 

session개체의 주요 메서드

String getId() : 해당 세션의 세션 ID를 return
long getCreationTime() : session의 생성된 시간을 1970년 1월1일 이후 흘러온 시간을 1/1000초단위로  return
long getLastAccessedTime() : 웹 브라우저의 요청이 마지막으로 시도된 시간을 1970년 1월1일 이후 흘러온 시간                                                   을 1/1000초단위로  return
void setMaxInactiveInterval(time) : session을 유지할 시간을 초 단위로 설정
int getMaxInactiveInterval() : 세션유지 시간 얻기
void invalidate() : 세션 기본개체가 삭제됨. 즉 할당된 세션의 속성값을 모두 제거,주로 세션을 종료할 때 사용
boolean isNew() : 새로운 클라이언트인지 판단. 즉 새로운 세션이면 true ,아니면 false 리턴


- 세션 유효 시간 설정

가) web.xml에서 WEB-INF/web.xml에 <session-config>엘리먼트에서 설정(분 단위)
<session-config>
 <session-timeout>20</session-timeout>
</session-config>


나) session개체의 메서드로 설정(초 단위)

session.setMaxInactiveInterval(60*20);

- 세션개체에 값 저장시(로그인 처리)

session.setAttribute(String key,Object value)

- 값 읽어 올때(로그인 여부 판단)
Object value=session.getAttribute(String key);

- 세션 개체의 특정 속성  삭제

session.removeAttribute(속성명);

-  세션개체에 저장된 모든 속성 삭제시(로그아웃 처리)
session.invalidate();

 

 

SessionIndex.jsp
<%@page import="java.util.Date"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>SessionIndex.jsp</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
<style>
  /*점보트론 세로폭 줄이기*/
  .jumbotron {
    padding-top: 1rem;
    padding-bottom: 1rem;
  }
</style>
</head>
<body>
	<!-- 
	세션이 삭제되는 경우
	1.유효시간동안 서버에 아무런 요청을 보내지 않았을때
	2.브라우저를 닫았을때
	※현재 브라우저 안에서 모든 JSP(서블릿)은 동일한 세션영역에 있다
	 -->
	<div class="jumbotron jumbotron-fluid bg-warning">
	    <div class="container-fluid">
	      <h1>세션</h1>      
	    </div><!--container-fluid-->
  	</div><!--jumbotron-fluid--> 
  	<div class="container">    
    	<fieldset class="form-group border p-3">
    		<legend class="w-auto p-3">session(HttpSession)내장 객체의 주요 메소드</legend>
    		<ul class="list-unstyled">
    			<li>세션의 유효시간(web.xml:분단위) : <%=session.getMaxInactiveInterval() %>초</li>
    			<% session.setMaxInactiveInterval(60);//60초 %>
    			<li>세션아이디 : <a href="SessionResult.jsp"><%=session.getId() %></a></li>
    			<%
    				//세션의 최초 생성시간
    				long createTime=session.getCreationTime();
    				SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    				String createTimeString= dateFormat.format(new Date(createTime));
    				//클라이언트가 서버로  마지막으로  요청한 시간
    				long accessTime=session.getLastAccessedTime();
    				String accessTimeString= dateFormat.format(new Date(accessTime));
    			%>
    			<li>세션의 최초 생성시간:<%=createTimeString %></li>
    			<li>클라이언트의 최근 요청 시간:<%=accessTimeString %></li>
    		</ul>
    		<h2>세션 및 리퀘스트 영역에 속성 저장</h2>
    		<%
    			request.setAttribute("requestScope", "리퀘스트 영역입니다");
    			session.setAttribute("sessionScope", "세션 영역입니다");
    		%>
    	</fieldset>
  	</div><!-- container -->
</body>
</html>

 

 

 

SessionResult.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>SessionResult.jsp</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
<style>
  /*점보트론 세로폭 줄이기*/
  .jumbotron {
    padding-top: 1rem;
    padding-bottom: 1rem;
  }
</style>
</head>
<body>
	<!-- 
	세션이 삭제되는 경우
	1.유효시간동안 서버에 아무런 요청을 보내지 않았을때
	2.브라우저를 닫았을때
	※현재 브라우저 안에서 모든 JSP(서블릿)은 동일한 세션영역에 있다
	 -->
	<div class="jumbotron jumbotron-fluid bg-warning">
	    <div class="container-fluid">
	      <h1>세션</h1>      
	    </div><!--container-fluid-->
  	</div><!--jumbotron-fluid--> 
  	<div class="container">    
    	<fieldset class="form-group border p-3">
    		<legend class="w-auto p-3">세션 확인</legend>
    		<ul class="list-unstyled">
    			
    			<li>세션 아이디 : <%=session.getId() %></li>
    			<li>세션 유효시간 : <%=session.getMaxInactiveInterval() %>초</li>
    			<li>리퀘스트 영역 : <%=request.getAttribute("requestScope") %></li>
    			<li>세션 영역 : <%=session.getAttribute("sessionScope") %></li>
    		</ul>
    	</fieldset>
  	</div><!-- container -->
</body>
</html>

▲Index페이지에서 a태그를 눌렀을 때 이동하는 페이지

 

▲a태그를 이용한 페이지 이동은 새로운 페이지를 요청해서 받는 것으므로 리퀘스트영역은 null이 나온다.

 

 

 

 

 

 

 

 

 

 

예제를 보자

 

Login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<jsp:include page="/Template/Top.jsp"/>

	<div class="jumbotron jumbotron-fluid bg-warning">
		<div class="container-fluid">
			<h1>한국소프트웨어 인재개발원</h1>
			<p>https://www.ikosmo.co.kr/</p>
		</div>
		<!--jumbotron-->
	</div>
	<!--container-->
	<div class="container">
		<h2>로그인</h2>
		<span class="font-weight-bold text-danger"><%=request.getAttribute("NOT-LOGIN")==null?"":request.getAttribute("NOT-LOGIN") %></span>
		<form class="form-inline" action="LoginProcess.jsp" method="POST">
			<label>아이디</label> 
			<input type="text" name="id" class="form-control mx-2" value="<%=request.getParameter("id")==null?"":request.getParameter("id") %>" /> 
			<label>비밀번호</label> 
			<input type="password" name="pwd" class="form-control mx-2" value="<%=request.getParameter("pwd")==null?"":request.getParameter("pwd") %>" /> 
			<input type="submit" class="btn btn-danger mx-2" value="로그인" />
		</form>
	</div>

<jsp:include page="/Template/Footer.jsp"/>

▲ Top과 Footer는 include액션태그로 따로 뺐다.

 

Top.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="en">
<head>
<title>한소인</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- CDN -->

<link rel="stylesheet"
	href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
<link rel="stylesheet"
	href="https://fonts.googleapis.com/icon?family=Material+Icons">
<script
	src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.slim.min.js"></script>
<script
	src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
<script
	src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
<style>
.jumbotron {
	padding-top: 1rem;
	padding-bottom: 1rem;
}

body {
	padding-top: 65px;
}
</style>
</head>
<body>


	<nav class="navbar navbar-expand-sm bg-secondary navbar-dark fixed-top">
		<a class="navbar-brand" href="#"> <i class="material-icons"
			style="font-size: 2rem">home</i>
		</a>

		<!-- Toggler/collapsibe Button -->
		<button class="navbar-toggler" type="button" data-toggle="collapse"
			data-target="#navbar-link">
			<span class="navbar-toggler-icon"></span>
		</button>

		<div class="collapse navbar-collapse justify-content-end"
			id="navbar-link">
			<ul class="navbar-nav">
				<% if(session.getAttribute("USER-ID")==null){ %>
				<li class="nav-item"><a class="nav-link active" href="<%=request.getContextPath() %>/Session06/Login.jsp">로그인</a></li>
				<%}else{ %>
				<li class="nav-item"><a class="nav-link" href="<%=request.getContextPath() %>/Session06/Logout.jsp">로그아웃</a></li>
				<%} %>
				<li class="nav-item"><a class="nav-link" href="#">마이페이지</a></li>
				<li class="nav-item"><a class="nav-link" href="#">게시판</a></li>
				<li class="nav-item"><a class="nav-link" href="<%=request.getContextPath() %>/BuiltInObject03/RequestForParameterIndex.jsp">회원가입</a></li>
				<li class="nav-item dropdown"><a
					class="nav-link dropdown-toggle" href="#" data-toggle="dropdown">
						인재채용 </a>
					<div class="dropdown-menu">
						<a class="dropdown-item" href="#">인재상</a> <a class="dropdown-item"
							href="#">채용정보</a> <a class="dropdown-item" href="#">입사지원</a>
					</div></li>
				<li class="nav-item">
					<form class="form-inline" action="#">
						<input class="form-control mr-sm-2 mt-1" type="text"
							placeholder="검색어 입력">
						<button class="btn btn-success mt-1" type="submit">확인</button>

					</form>
				</li>
			</ul>
		</div>
	</nav>

 

 

 

Footer.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- Footer -->
	<footer class="page-footer font-small blue">
		<!-- Copyright -->
		<div class="footer-copyright text-center py-3">
			© 2022 (주)한국소프트웨어아이엔씨 (153-759) 서울시 금천구 가산동 426-5 월드메르디앙 2차 413호 <a href="/"> ikosmo.co.kr</a>
		</div>
		<!-- Copyright -->
	</footer>
	<!-- Footer -->

</body>
</html>

 

 

 

LoginProcess.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//사용자 입력값 받기
	String id= request.getParameter("id");
	String pwd= request.getParameter("pwd");
	//아뒤가 KIM이고 비번이 1234면 회원이라고 가정]	
	if("KIM".equals(id.trim()) && "1234".equals(pwd.trim())){//회원
		//실제 테이블과 연동]
		
		//1.로그인 처리]-세션영역에 속성(주로 식별자만) 저장
		session.setAttribute("USER-ID", id);
		//2.로그인 처리후 마이 페이지로 이동]
		response.sendRedirect("MyPage.jsp");
	}
	else{//아이디 비번 불일치
		//리퀘스트 영역에 필요한 데이터 저장
		request.setAttribute("NOT-LOGIN","아이디 비번 불일치");
		//로그인 페이지로 포워드
		request.getRequestDispatcher("Login.jsp").forward(request, response);
	}
%>

▲쿠키포스팅때 했던 내용들과동일하다.

 

 

Logout.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//로그아웃 처리-]-세션영역에 저장된 속성 삭제
	session.invalidate();
	//로그아웃 처리후 로그인 페이지로 이동]
	response.sendRedirect("Login.jsp");
%>

 

 

 

MyPage.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<jsp:include page="/Template/Top.jsp"/>

	<div class="jumbotron jumbotron-fluid bg-warning">
		<div class="container-fluid">
			<h1>마이 페이지 <small><%=session.getAttribute("USER-ID") %></small></h1>			
		</div>
		<!--jumbotron-->
	</div>
	<!--container-->
	<div class="container">
		<a class="btn btn-info" href="Logout.jsp">로그 아웃</a>	
	</div>

<jsp:include page="/Template/Footer.jsp"/>

▲로그인 성공시 이동하는 마이페이지

 

 

 

'JSP' 카테고리의 다른 글

[JSP]Expression Language(EL : 표현언어)  (0) 2022.05.06
[JSP]Action Tag  (0) 2022.05.03
[JSP]Cookie로 간단한 쇼핑몰 만들기 예제  (0) 2022.05.03
[JSP]Cookie  (0) 2022.05.03
[JSP] 내장객체의 영역  (0) 2022.05.02