22.03.03 세션 정보 가져오기

최고고·2022년 3월 3일
2

세션 Session

  • 쿠키의 단점을 보완하기 위한 상태 유지 방법 중 하나

  • 프로세스들 사이에서 통신하기위해 메시지 교환을 통해 서로를 인식한 이후부터 통신을 마칠때까지 기간

  • 서버 주고받는 과정에서 서버 접속시 세션 id 발급받음 => 세션 id를 쿠키에 저장하고 서버에서 클라이언트에 보내줌

  • 서버에 정보를 저장할 수 있는 내장객체 영역 중 하나

  • 데이터 한계 없음 서버에서만 존재하는 객체이므로 서버에서만 접근

  • 세션의 대표적 예 : 로그인 페이지 >> 로그인 권한이 생기면 로그인 상태가 유지되기 때문에 다른 페이지로 갔다 돌아올 수 있다.

  • 한 브라우저에 한개씩만 존재 -> 새로운 브라우저에 다시 로그인해야만 그 사이트를 이용할 권한이 생기는 것!

  • 쿠키는 가져오고 보낼때 인코딩, 디코딩 필요했다면, 세션은 데이터 타입에 따라 형변환을 해줘야됨

  • 세션의 정보는 Object타입으로 저장되어있음 - 부모클래스를 가져와 사용하는 형식
    -> Type mismatch: cannot convert from Object to String 오류 : 값을 가져올때 다운캐스팅 - 자식클래스의 타입으로 형변환해줘야됨

  • jsp 에서 서블릿 파일로 변환되는 과정에서 내장객체가 생성되는데 session도 jsp에서 내장객체처럼 쓸 수 있다. 서블릿에서는 객체 생성해줘됨 HttpSession변수명 = request.getSession(); 변수명.setAttribute("name","value"); (객체를 얻어와서, 세션을 저장 )

  • 세션 설정
    session.setAttribute("name", "Object value");
    (문자열이름, 오브젝트(object-최상위클래스) 값)
    "문자열","값"

  • 세션의 유효기간 설정-초단위
    session.setMaxInactiveInterval();

  • 세션 가져오기
    String id = (String) session.getAttribute("name"); =>다운캐스팅해주기
    가져올때 다운캐스팅 - 자식클래스의 타입으로 형변환

  • 삭제방법
    1 이름에대한정보를 가져와서 정보를 삭제
    session.removeAttribute("name");

  1. 모든세션 삭제 ->지양하기 (잘 안씀)
    session.invalidate();

세션 만들고 조회하기, 삭제하고 조회하기

<%@ 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>
	<h1>세션만들기</h1>
	<%
	//세션 : 서버에 정보를 저장할 수 있는 내장객체 영역
	//jsp에선 내장객체인 session으로 바로사용가능
	//서블릿에서는 객체 생성해줘야됨
	
	session.setAttribute("id", "smart");
	
	//세션의 유효기간 설정 초단위설정
	session.setMaxInactiveInterval(60);
	
	
	%>
</body>
</html>
<%@ 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>
	<h1>세션의 정보 가져오기</h1>
	<%
		//세션의 정보는 Object타입으로 저장되어있음
		//다운 캐스팅 : 자식클래스의 변수 = (자식클래스 타입) 부모타입의 데이터
		String id = (String) session.getAttribute("id");
		out.print(id);
	%>
</body>
</html>
<%@ 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>
	<h1>세션 삭제하기</h1>
	<%
	//삭제방법 1 이름에대한정보를 가져와서 정보를 삭제
	session.removeAttribute("id");
	
	//삭제 방법2 모든세션 삭제 ->지양하기 (잘 안씀)
	//session.invalidate();
	%>
</body>
</html>


main.jsp를 새로만들어, 기존에 만들었던 Main.html (회원 정보관리)를 복붙하기 ==> 세션의 값을 주고 받기 위해 새로운 Main. jsp파일을 만드는 것!!

  • 로그아웃기능 추가하기 (세션 id 삭제)
  • 세션에 id라는 이름 저장된 정보를 가져오는 getAttribute("id") =>jsp생성
<%@page import="com.example.MemberVO"%>
<%@ 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 = (String)session.getAttribute("id");
	//자식클래스 변수 String = (자식타입) 부모타입 데이터
	if(id != null){
		out.print(id + "님 환영합니다.");
	} else {
		out.print("로그인상태가 아닙니다.");
	}
	
	%>
	
<h1>메인페이지</h1>
	<a href="join.html">회원가입 페이지</a><br>
	<a href="login.html">회원로그인 페이지</a><br>
	<a href="logout.jsp">로그아웃</a><br>
	<a href="delete.html">회원삭제 페이지</a><br>
	<a href="update.html">회원수정 페이지</a><br>
	<a href="selectAll.jsp">회원전체검색 페이지</a>
</body>
</html>
  • 세션을 사용하기위해서 서블릿에서는 session 객체생성
    HttpSession session = request.getSession();
    ㄴ리턴타입이 HttpSession
    session.setAttribute("id", uid);
    ㄴid라는 이름으로 변수 uid 이라는 값을넣었음 "uid"를 쓰면 문자열이 담김
package com.example;

import java.io.IOException;
import java.net.URLEncoder;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

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("/logincheck")
public class logincheck extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// post방식 인코딩
		request.setCharacterEncoding("euc-kr");

		// ID,PW파라미터 수집
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");

		Connection conn = null;
		PreparedStatement psmt = null;
		ResultSet rs = null;
		String nick = null;
		String uid = null;
		String upw = null;

		// DB에 내가 입력받은 ID,PW있는지 확인
		try {
			// 2-1 DB연결
			Class.forName("oracle.jdbc.driver.OracleDriver");
			// 해당 클래스 찾아가는 경로
			String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe"; // DB주소
			String dbid = "hr";
			String dbpw = "hr";

			conn = DriverManager.getConnection(url, dbid, dbpw);

			if (conn != null) {
				System.out.println("DB연결 성공");
			} else {
				System.out.println("DB연결 실패");
			}
			// 2-2 : SQL문 통해 id, pw 조회
			String sql = "select * from web_member where id=? and pw=?";
			// 작성한 sql문DB로 전달, 제대로 전달이 된다면 PreparedStatement 객체로 변환됨!
			psmt = conn.prepareStatement(sql);
			// ?에 값 채우기 : ?-바인드변수
			psmt.setString(1, id);
			psmt.setString(2, pw);
			// sql문실행
			rs = psmt.executeQuery(); // DB변화x, 테이블형태 ResultSet형태로 리턴

			if (rs.next()) {
				// .next() :값이 있는지 확인해줌
				uid = rs.getString("id"); 	
				upw = rs.getString("pw");
				nick = rs.getString("nick");
				// 컬럼 순서로 가져오거나, 특정 컬럼명을 지정해서 가지고올수있음
				// 세션을 사용하기위해서 서블릿에서는 session 객체생성
				
				HttpSession session =  request.getSession(); 
				//리턴타입이 HttpSession
				session.setAttribute("id", uid);
				//id라는 이름으로 변수 uid 이라는 값을넣었음 "uid"쓰면 문자열이 담김
				//세션에 id를 담고 페이지 이동..
				response.sendRedirect("Main.jsp");
				//세션에 id라는 이름이 저장된 정보를 가져오는 getAttribute("id") =>jsp생성
				
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (psmt != null) {
					psmt.close();
				}
				if (conn != null) {
					conn.close();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

	}

}
  • 로그아웃 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>
	<%
	//세션 삭제하고 페이지 이동하기
	session.removeAttribute("id");
	//세션이름이 "id"인것을 삭제함
	response.sendRedirect("Main.jsp");
	
	%>
</body>
</html>

MemberVO 클래스 생성

  • loginCheck.java 서블릿파일이 있는 패키지에 새로운 클래스 만들기
  1. 클래스는 자료형이다 => 새로운 자료형 MemberVO 만들어줌
  2. private으로 필드에 접근제한자
  3. getter, setter 생성하고, 사용자정의 생성자 만들어줌
package com.example;

public class MemberVO {
	//외부에서 필드값 접근할 때 
	//getter,setter 통해 접근하도록 접근제한자 private사용함
	
	private String id;
	private String pw;
    private String nick;
	
	public MemberVO(String id, String pw) {
		super();
		this.id = id;
		this.pw = pw;
	}
	public MemberVO(String id, String pw, String nick) {
		super();
		this.id = id;
		this.pw = pw;
		this.nick = nick;
	}
	
	//객체에 저장된 필드값들을 출력해 확인하는 용도 toString
	@Override
	public String toString() {
		return "MemberVO [id=" + id + ", pw=" + pw + ", nick=" + nick + "]";
	}
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPw() {
		return pw;
	}
	public void setPw(String pw) {
		this.pw = pw;
	}
	public String getNick() {
		return nick;
	}
	public void setNick(String nick) {
		this.nick = nick;
	}
	
}
  • MemberVO객체를 통해 세션 값 가져오기
  1. loginCheck.java서블릿파일에서 세션 객체 생성, (세션을 사용하기위해서 서블릿에서는 session 객체생성)
    HttpSession session = request.getSession();
    ㄴ리턴타입이 HttpSession
  2. MemberVO 객체 생성
    MemberVO vo = new MemberVO(uid, upw);
    session.setAttribute("vo", vo); -->vo라는 변수를 넣어줌
SQL문 통해 id, pw 조회
		String sql = "select * from web_member where id=? and pw=?";
	// 작성한 sql문DB로 전달, 제대로 전달이 된다면 PreparedStatement 객체로 변환됨!
		psmt = conn.prepareStatement(sql);
		// ?에 값 채우기 : ?-바인드변수
		psmt.setString(1, id);
		psmt.setString(2, pw);
		// sql문실행
		rs = psmt.executeQuery(); // DB변화x, 테이블형태 ResultSet형태로 리턴

if (rs.next()) {
			// .next() :값이 있는지 확인해줌
			uid = rs.getString("id"); 	
			upw = rs.getString("pw");
			nick = rs.getString("nick");
			// 컬럼 순서로 가져오거나, 특정 컬럼명을 지정해서 가지고올수있음
            
			// 세션을 사용하기위해서 서블릿에서는 session 객체생성
			HttpSession session =  request.getSession(); 
			//리턴타입이 HttpSession
			//만들어놓은 MemberVO객체에 id, pw를 데이터 이동 또는 세션에 저장
			//MemberVO 객체 생성
			MemberVO vo = new MemberVO(uid, upw);
			session.setAttribute("vo", vo);
				
			response.sendRedirect("Main.jsp");
			//세션에 id라는 이름 저장된 정보를 가져오는 getAttribute("id") =>jsp생성
				
				
  • 아래는 vo객체를 넣어준 Main.jsp
<%@page import="com.example.MemberVO"%>
<%@ 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 = (String) session.getAttribute("id");
	//자식클래스 변수 String = (자식타입) 부모타입 데이터


	//추가된 부분 
	MemberVO vo = (MemberVO) session.getAttribute("vo");
	//세션에 저장된 "vo"이름의 정보를 MemberVO 타입으로 가져옴
	if (vo != null) {
		System.out.print("현재 로그인된 사람의 정보는 : " + vo.getId() + vo.getPw() + vo.getNick());
	}
	

	if (id != null) {
		out.print(id + "님 환영합니다.");
	} else {
		out.print("로그인상태가 아닙니다.");
	}
	%>

	<h1>메인페이지</h1>
	<a href="join.html">회원가입 페이지</a>
	<br>
	<a href="login.html">회원로그인 페이지</a>
	<br>
	<a href="logout.jsp">로그아웃</a>
	<br>
	<a href="delete.html">회원삭제 페이지</a>
	<br>
	<a href="update.html">회원수정 페이지</a>
	<br>
	<a href="selectAll.jsp">회원전체검색 페이지</a>
</body>
</html>

세미콜론 빼먹거나 변수를 잘못 담으면 -> 실행이 되기전에 오류

DB연결하려면 일단 실행을 해야 오류가 날지 알수있음 ==>예외처리
예외처리 1) try ~catch -> 해당 부분만 오류 잡아줌
2) throws -> 문서 전체 오류 잡아줌


forward()

  • sendRedirect와 달리 url주소가 그대로
  • request, response 정보를유지
  • 클라이언트 요청을 내부 WAS에서 다른 페이지로 전달
    1) 일종의 교통수단인 RequestDispatcher객체 필요
    2) RequestDispatcher rd = request.getRequestDispatcher("이동 경로 설정");
    3) rd.forward메소드
  • forward방식으로 데이터를 전송할 때 :
    request.setAttribute("name","value");
    이동한 페이지에서 값을 얻어올때 - 다운캐스팅:
    데이터타입 변수명 = (자식타입 형변환)request.getAttribute();
    sendRedirect방식은 한글 데이터 전송할때 인코딩 URLEncoder.encode(값,"형식")해줬지만, foward방식은 안해도됨

scope 내장객체 영역

  • 내장객체 영역 ?
    -톰캣 서버가 관리하는 영역이 있는데, 무언갈 담아서 서버가 쓸 수 있는 공간
    -웹 서버에서 객체 또는 변수가 생성된 후 유효할 수 있는 범위 ->객체의 유효기간
    -page : jsp페이지 처리할때 사용영역, request : 하나의 요청을 처리할때 사용영역, session : 브라우저와 관련영역, application : 하나의 웹어플리케션 WAS가 종료되기 전까지

<%@ 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>

	<h1>스코프 영역 실습</h1>
	<%
	//1.Scope에 값을 넣기
	//값을 넣는 메소드 setAttribute(name,value)
	
	//page scope
	pageContext.setAttribute("page", "페이지스코프입니다.");
	//request scope
	request.setAttribute("request", "리퀘스트스코프입니다.");
	//session scope
	session.setAttribute("session", "세션 스코프 입니다.");
	//applicaton scope
	application.setAttribute("application", "어플리케이션스코프입니다.");
	
	
	//2. Scope영역에서 값 꺼내오기 다운캐스팅 필요함
	String pageS = (String)pageContext.getAttribute("page");
	String requestS = (String)request.getAttribute("request");
	String sessionS = (String)session.getAttribute("session");
	String applicationS = (String)application.getAttribute("application");
	
	out.print(pageS+"<br>"+requestS+"<br>"+sessionS+"<br>"+applicationS);
	
	//페이지이동방식1
	//forward() => url변경 되지 않음, request, response 정보를유지
	//1)일종의 교통수단인 RequestDispatcher객체 필요
	//2)request.getRequestDispatcher("이동 경로 설정");
	//3)forward메소드
	RequestDispatcher rd = request.getRequestDispatcher("ex02selectScope.jsp");
	rd.forward(request, response);
	
	
	
	//페이지 이동 2
	//sendRedirect()이용 -> url변경일어나고 정보 유지 안됨
	//response.sendRedirect("ex03selectScope.jsp");
	
	
	
	%>
	
</body>
</html>
<%@ 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>
	<h1>스코프 영역 차이 비교하기</h1>
	<%
	String pageS = (String)pageContext.getAttribute("page");
	String requestS = (String)request.getAttribute("request");
	String sessionS = (String)session.getAttribute("session");
	String applicationS = (String)application.getAttribute("application");
	
	out.print(pageS+"<br>"+requestS+"<br>"+sessionS+"<br>"+applicationS);
	//출력스트림으로 잘 나오는지 보기
	//한번의 요청 응답이 되면서 새로운 request가 sendRedirect를 했기 때문에 null 
	//페이지는 다른곳으로 넘어가지 못함->null
	%>
</body>
</html>

0개의 댓글