쿠키의 단점을 보완하기 위한 상태 유지 방법 중 하나
프로세스들 사이에서 통신하기위해 메시지 교환을 통해 서로를 인식한 이후부터 통신을 마칠때까지 기간
서버 주고받는 과정에서 서버 접속시 세션 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");
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>
<%@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>
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();
}
}
}
}
<%@ 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>
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;
}
}
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생성
<%@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 -> 문서 전체 오류 잡아줌
request.setAttribute("name","value");
데이터타입 변수명 = (자식타입 형변환)request.getAttribute();
<%@ 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>