Eggs Sunny Side Up
본문 바로가기
Web/JSP_Servlet

Session

by guswn100059 2023. 4. 19.

Cookie와 Session의 제일 큰 차이점 (저장 데이터 타입)
 : Session의 데이터 타입은 Object(최상위 클래스)
Session 장점 : 업캐스팅(자식->부모) 모든 데이터 타입을 전부 저장할 수 있다.
Session 단점 : 모든 데이터를 Object로 저장(저장 단계에서 업캐스팅이 일어남) -> 문제 발생 : 부모클래스인 Object의 기능만 남음, 최상위 객체라 몇 가지 기능이 없다. (저장은 했으나 못 쓰는 형태가 된다 -> 꺼내서 사용하려면 다운 캐스팅이 필요)

Session은 로그인에 많이 쓰인다.


데이터선언, 세션 저장_ jsp)

<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		// 1. 저장할 데이터
		String name = "꼬기";
	
		ArrayList<String> list = new ArrayList<String>();
		list.add("복숭아");
		list.add("청포도");
		list.add("딸기");
		
		// 2. 세션에 저장
		// ① 세션 객체 생성
		// 내장객체이므로 따로 생성하지 않아도 됨.
		// HttpSession session = request.getSession();
		
		// ② 데이터 저장
		// .setAttribute("name", object타입으로 저장할 데이터);
		// 저장시에 Object타입으로 업캐스팅 => 모든 데이터타입을 저장할 수 있다.
		session.setAttribute("name", name);
		session.setAttribute("list", list);
		
		// JSP 내장객체의 영역(유효 범위) - Scope
		// setArrtribute, getAttribute, removeAttribute는 공통 메소드
		
		// pageContext(page scope)
		// : 하나의 jsp페이지 안에서만 유효
		pageContext.setAttribute("page", "page scope");
		
		// request(request scope)
		// : 한 번의 요청이 출발하고, 응답을 받기 전까지 유효
		request.setAttribute("req", "request scope");
		
		// session(session scope)
		// : 하나의 브라우저가 열려있는 동안 유효
		
		// application(application scope)
		// : 하나의 웹 어플리케이션 내(톰켓서버가 실행되는 동안 어디서든지)
		// 	 모든 사용자에게 같은 정보를 출력시킬 때 
		application.setAttribute("app", "application scope");
		
		// response.sendRedirect("Ex05SelectSession.jsp");
		// Forward
		RequestDispatcher rd = request.getRequestDispatcher("Ex05SelectSession.jsp");
		rd.forward(request, response);
	
	%>
	
	<a href="Ex05SelectSession.jsp">세션 조회</a>
	
	
</body>
</html>

세션 값, scope 데이터 조회_jsp)

<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		// 1. 세션 값 조회하기
		// Object타입으로 저장되기 때문에 다운캐스팅은 필수
		String name = (String)session.getAttribute("name");
	
		ArrayList<String> list = (ArrayList<String>)session.getAttribute("list");
		
		// 2. scope에 저장된 데이터 가져오기
		// page는 내장객체임.
		String page1 = (String)pageContext.getAttribute("page");
		
		// request
		// String req = (String)request.getAttribute("req");
		
		// application
		String app = (String)application.getAttribute("app");
	
	%>
	
	<h1><%=name %></h1>
	<h1><%=list %></h1>
	
	<hr>
	
	<h4><%=page1 %></h4>
	
	<!-- 
		<EL방식>
		String req = (String)request.getAttribute("req");
		표현식 + req
		==> !${name}
	
	 -->
	 <h4>${req}</h4>
	 
	 <h4><%=app %></h4>
	 
	 <a href="ex06">세션 수정/삭제</a>
	
</body>
</html>

데이터 수정, 삭제_java)

package Ex0418;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebServlet("/ex06")
public class Ex06UpdateSession extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		// 1. 세션 객체 생성
		HttpSession session = request.getSession();
		
		// 2. 세션 데이터 수정
		// "꼬기" ==> "참돔"
		session.setAttribute("name", "참돔");
		
		// 3. 세션 데이터 삭제
		session.removeAttribute("list");
		// session.invalidate(); => 세션을 닫아버리는 메소드
		
		response.sendRedirect("Ex05SelectSession.jsp");
	}

}

 


예제) Login

jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		// 1. 세션에서 사용자의 정보를 꺼내오기
		// null => 로그인 X
		// id => 로그인 O
		String id = (String)session.getAttribute("id");
		
		// 만약에 사용자가 로그인 한 상태라면
		// <h1> (id)님 환영합니다. </h1>
		// 로그인하지 않았다면
		// 로그인 form을 그대로 출력
	%>
	
	<% if(id == null){ %>
	<h1>로그인</h1>
	<form action="ex07" method="post">
	
		아이디 : <input type="text" name="id">
		비밀번호 : <input type="number" name="pw">
		
		<input type="submit" value="로그인">
	
	</form>
	<%}else { %>
		<h1><%=id %>님, 환영합니다.</h1>
	<%} %>
	
	
</body>
</html>

java

package Ex0418;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebServlet("/ex07")
public class Ex07Login extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		// 1. id, pw 수집
		
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		
		// 2. 로그인 확인
		// 로그인 조건 (아직 db가 없음)
		// 만약에 id가 smhrd이고, 비밀번호가 1234와 같다면 로그인 성공
		// 그 외 나머지 경우는 실패로 판단
		// => console 창에 출력
		
		response.setContentType("text/html ; charset=utf-8");
		
		PrintWriter out = response.getWriter();
		
		if(id.equals("smhrd") && pw.equals("1234")) {
			
			// session에 사용자의 id만 저장
			// 1) 세션 객체  생성
			HttpSession session = request.getSession();
			// 2) 세션에 데이터 저장
			session.setAttribute("id", id);
			
			out.print("로그인 성공");
		} else {
			out.print("로그인 실패");
		}
		
		// 3. View 선택
		response.sendRedirect("Ex07Login.jsp");
		
	}

}

'Web > JSP_Servlet' 카테고리의 다른 글

MVC_로그인/로그아웃 시스템  (0) 2023.04.25
MVC_회원가입 시스템  (0) 2023.04.24
객체실습_html에서 값 입력 후 jsp에서 출력  (1) 2023.04.19
쿠키  (0) 2023.04.18
forward & redirect  (0) 2023.04.18

댓글