티스토리 뷰

JSP/인프런 JSP

12. 세션

GrapeMilk 2020. 2. 15. 12:29

1. 세션이란?

- 로그인 정보 및 클라이언트의 정보를 저장하는 방법

- 쿠키와 마찬가지로 웹브라우저와 서버와의 관계를 유지하는 수단.

- 쿠키는 클라이언트의 정보를 클라이언트의 특정 위치에 저장하지만, 세션은 서버상에 객체로 존재

- 세션은 서버에서만 접근이 가능하여 보안이 좋고, 저장할 수 있는 데이터에 한계가 없음.

 

2. 세션 vs 쿠키

2-1 쿠키

 - 서버와 클라이언트의 관계를 지속적으로 이어줌

 - 보안에 취약함(WAS에서 생성 -> local에 저장). 다른 사람이 내 로컬 경로를 따라 쿠키데이터를 확인하면 정보가 노출될 수 있음.

 - 용량이 적음(1.2m) 

 

2-2 세션

 - 서버에 객체로 존재하기 때문에, 보안에 강함.

 - JSP를 통해서만 접근이 가능하기 떄문에. 용량의 제한이 없음.

 - 브라우저의 요청 마다 세션객체가 생성되어(자동으로 JSP컨테이너에서 생성해줌) 유니크한 세션아이디를 생성함.

 - 로그인이나 정보를 유지하려할때 많이 사용됨.

 

3. 세션문법

 - 세션은 클라이언트의 요청이 발생하면 자동생성(JSP웹어플리케이션 컨테이너).

 - JSP가 session이라는 내부 객체를 지원하여 세션의 속성 설정 가능 

 

3-1 세션관련 메소드

 - setAttribute() : 세션에 데이터를 저장 ex) id= abcd, pw = 1234

 - getAttribute() : 세션에서 데이터를 얻음

 - getAttributeNames() : 세션에 저장되어 있는 모든 데이터의 이름(유니크한 키값)을 얻음. 

 - getId() : 자동 생선된 세션의 유니크한 아이디를 얻음

 - isNew() : 세션이 최초 생성되었는지, 이전에 생성된 세션인지를 구분 (판단하는 메서드, boolean)

 - getMaxInactiveInterval() : 세션의 유효시간을 얻음. 가장 최근 요청시점을 기준으로 카운트 됨.

(C:\Users\Sungwon\Desktop\eclipse-java-2019-06-R-win32-x86_64\apache-tomcat-7.0.99\apache-tomcat-7.0.99\conf\web.xml <- 파일을 확인하면 session값이 defalut로 30분설정 돼 있는 것을 알 수 있음. 수정가능)

 - removeAttribute() : 세션에서 특정 데이터를 제거

 - invalidate() : 세션의 모든 데이터를 삭제

 

3-2 세션 예제

 

1) session Init

 - setAttribute를 통해 세션에 속성의 이름과 값 저장

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>

	
  <%// 속성의 이름, 값
    session.setAttribute("mySessionName", "mySessionData"); 
    //session : 내부객체 JSP컨테이너에서 Servlet으로 만들때 자동으로 만들어 주기 떄문에 선언을 안해도 바로 사용 가능
    session.setAttribute("myNum", 12345); //여러개 지정 가능 
  %>

  <a href="sessionGet.jsp">session get</a> <!--session get으로 넘어감  --> 
</body>
</html>

2) sessionGet.jsp

 - sessionInit에서 저장한 값을 받고 출력함.

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@ page import= "java.util.Enumeration"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>

  <%
    Object obj1 = session.getAttribute("mySessionName"); //getAttribute로 받아온 값은 Object 타입임.
    String mySessionName = (String) obj1; //원하는 데이터 값으로 캐스팅해서 사용 (String)
    out.println(mySessionName + "<br/>");
    
    Object obj2 = session.getAttribute("myNum"); //set때는(보낼 때) int지만 get할때는 Object로 받아옴 
    Integer myNum = (Integer)obj2;
    out.println(myNum + "<br/>");
    
    out.println("******************* <br/>");
    
    String sName;
    String sValue;
    Enumeration enumeration = session.getAttributeNames(); // 모든 값을 받기 위해 직렬화 객체 Enumeration 사용 
    while(enumeration.hasMoreElements()){
    	sName =enumeration.nextElement().toString();
    	sValue = session.getAttribute(sName).toString();
    	out.println("sName : " + sName + "<br/>");
    	out.println("sValue : " +sValue + "<br/>");
    }
    
    out.println("******************* <br/>");
    
    String sessionID = session.getId(); //유니크한 ID값을 얻음
    out.println("sessionID : " + sessionID + "<br/>");
    int sessionInter = session.getMaxInactiveInterval(); //요청시간을 얻음
    out.println("sessionInter : " + sessionInter + "<br/>");
    
    out.println("******************* <br/>");
    
    session.removeAttribute("mySessionName"); //해당 name("mySessionName")의 값만 삭제
    Enumeration enumeration1 = session.getAttributeNames();
    while(enumeration1.hasMoreElements()){
    	sName = enumeration1.nextElement().toString();
    	sValue = session.getAttribute(sName).toString();
    	out.println("sName : " + sName + "<br/>");
    	out.println("sValue : " + sValue + "<br/>");
    }
    
    out.println("******************* <br/>");
    
    session.invalidate(); //값 전체 삭제
    if(request.isRequestedSessionIdValid()){ 
    	out.println("session valid");
    } else {
    	out.println("session invalid");
    }
    
  %>

</body>
</html>

  - 첫번째 출력에서는 myNum과 mySessionName전부 출력 

  - remove후 myNum만 출력

  - invailed 이후 전체 삭제되어 아무것도 출력 x

3-3 세션 활용 login예제 

 

1) login.html

<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>

  <form action= "loginOk.jsp" method="post">
     	아이디 : <input type="text" name="id" size="10"><br/>
     	비밀번호 : <input type="password" name="pw" size="10"><br/>
     	<input type="submit" value="로그인">
   
   
  </form>

</body>
</html>

 

2) loginOk.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
 <%!
 	String id, pw;
 %>
 <%
 	id = request.getParameter("id");
 	pw = request.getParameter("pw"); 
 	
 	if(id.equals("abcde") && pw.equals("12345")){
 		session.setAttribute("id", id); //아이디와 패스워드가 일치하면 세션에 id값 저장 
 		response.sendRedirect("welcome.jsp"); 
 	} else {
 		response.sendRedirect("login.html");
 	}
 %>
 

</body>
</html>

 

3) welcome.jsp

<%@page import="java.util.Enumeration" %>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>

	<%
    	Enumeration enumeration = session.getAttributeNames(); //모든 브라우저에 존재하면 세션 네임을  다 받아오고 
		while(enumeration.hasMoreElements()){ //반복을 돌림
			String sName = enumeration.nextElement().toString(); 
			String sValue = (String)session.getAttribute(sName);
			
			if(sValue.equals("abcde")) out.println(sValue + "님 안녕하세요." + "<br/>"); //해당 세션이 존재하면 인삿말 출력
			//if(sValue.equals("abcde")) session.removeAttribute(sName);
		}
	%>
	
	<a href="logout.jsp">로그아웃</a>

</body>
</html>

 

4) logout.jsp

<%@page import="java.util.Enumeration" %>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>

	<%
    	Enumeration enumeration = session.getAttributeNames(); //모든 브라우저에 존재하면 세션 네임을  다 받아오고 
		while(enumeration.hasMoreElements()){ //반복을 돌림
			String sName = enumeration.nextElement().toString(); 
			String sValue = (String)session.getAttribute(sName);
			
			if(sValue.equals("abcde")) session.removeAttribute(sName); //id삭제 = 로그아웃
		}
	%>
	
	<a href="sessiontest.jsp">sessionTest</a>

</body>
</html>

5) sessiontest.jsp

<%@page import="java.util.Enumeration" %>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>

	<%
    	Enumeration enumeration = session.getAttributeNames(); 
		int i = 0;
		while(enumeration.hasMoreElements()){ 
			i++;
		
			String sName = enumeration.nextElement().toString(); 
			String sValue = (String)session.getAttribute(sName);
			
		 	out.println("sName : " + sName + "<br/>");
		 	out.println("sValue : " + sValue + "<br/>");
			
			
			
		}
		
		if(i == 0) out.println("해당 세션이 삭제 되었습니다.");
	%>
	
	

</body>
</html>

 

*enumeration?

*enumeration 오류 해결 

 -> <%@ page import= "java.util.Enumeration"%>를 빼먹음! 

 

 

'JSP > 인프런 JSP' 카테고리의 다른 글

14. 자바 빈  (0) 2020.02.19
13. 예외 페이지  (0) 2020.02.18
11. 쿠키  (0) 2020.02.13
10. 액션태그  (0) 2020.02.12
9. JSP 본격적으로 살펴보기 -3  (0) 2020.02.07
댓글