📌쿠키 및 세션
- HTTP 서비스는 서버와 클라이언트가 지속적인 연결이 이루어 지지 않는다.
(클라이언트 요청에 대한 서버 응답후 연결 해제)
=> 서버와 클라이언트의 연결을 유지하기 위해 쿠키 또는 세션을 사용한다. - 쿠키(Cookie) : 클라이언트에 저장되는 정보(문자열)
- 세션(Session) : 서버에 저장되는 정보(객체)
-> 클라이언트의 중요한 정보들은 세션에 저장하는것이 좋다(클라이언트의 인증정보정도를 저장한다)
📌 Servlet에서의 쿠키와 세션
1) 클라이언트에 처음 요청 확인 => 클라이언트에 쿠키 저장(response 객체 이용 - JSESSIONID)
※ 쿠키 생성 시 세션 등록 => 세션 바인딩을 하기 위해
2) 클라이언트 요청시 쿠키 확인 => 클라이언트의 쿠키 정보를 활용한 처리
※ 세션 등록된 정보를 활용 => 장바구니객체(MAP을 사용) : session tracking 작업
📌쿠키 생성, 활용, 삭제
※ 주의) 호스트명이 ip주소인 경우 쿠키 사용이 제한 된다. ex) 172.16.6.6 > localhost로 변경
※ 쿠키정보경로 => C:\Users\user\AppData\Roaming\Microsoft\Windows\Cookies
📌세션 생성, 활용, 삭제 ★★★
1) 클라이언트 > 서버의 페이지 요청(처음 요청) > Cookie(JSESSIONID) 확인 > Cookie(JSESSIONID)가 없는 경우 JSESSIONID 생성
> HttpSession객체를 생성하여 JSESSIONID 등록(Session) : 세션객체(장바구니객체, 사물함객체)
> Cookie객체를 생성하여 JSESSIONID 등록(Cookie)하여 클라이언트에게 전송 : 클라이언트의 구분
2) 클라이언트 > 서버의 페이지 요청 : 제품 요청(JSESSIONID가 등록된 Cookie 전송) > Cookie(JSESSIONID) 확인 >
> Cookie(JSESSIONID)가 있는 경우 Cookie에 저장된 JSESSIONID 값 얻기
> 세션 바인딩(binding) : 얻어낸 JSESSIONID를 이용하여 서버에 저장된 HttpSession객체(세션객체) 반환
> 세션객체에 제품 담기 : MAP의 형태로 데이타 저장(키 및 값 저장) > 응답
1. 쿠키클래스 인스턴스를 생성
Cookie(String name, String value)
name : 쿠키명. 쿠키값을 구분하기 위한 고유값이며 쿠키값을 전달한다.
쿠키명과 쿠키값은 영문자 숫자, 일부 특수문자 사용가능
create
package site.itwill.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//쿠키를 생성하여 클라이언트에게 전달하는 서블릿
@WebServlet("/create.itwll")
public class CookieCreateServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
//Cookie 인스턴스 생성
// => Cookie : 클라이언트와의 연결 지속성을 제공하기 위한 값을 저장한 인스턴스
// => 쿠키명(쿠키값을 구분하기 위한 고유값)과 쿠키값을 전달하는 생성자 이용 : Cookie(String name,String value)
// => 쿠키명과 쿠키값은 영문자,숫자,일부 특수문자만 사용 가능
Cookie idCookie=new Cookie("id", "abc123");
Cookie countCookie=new Cookie("count", "0");
//클라이언트에 저장될 쿠키의 유지시간 변경
//Cookie.setMaxAge(int expiry) : 쿠키 유지시간(초)을 변경하는 메소드
//쿠키 유지시간 변경하지 않을 경우 기본값은 -1로 설정
// => 유지시간이 -1로 설정된 쿠키는 브라우저가 종료될 경우 소멸
countCookie.setMaxAge(24*60*60);//유에게 전달 - 클라이언트는 전달받은 쿠키 저장
// => 유지시간을 변경하지 않은 쿠키는 브라우저 메모리에 저장
// => 유지시간을 변경한 쿠키는 쿠키파지시간을 1일로 변경
//쿠키(Cookie 인스턴스)를 클라이언트일에 저장
//HttpServletResponse.addCookie(Cookie cookie) : 클라이언트에게 쿠키를 전달하는 메소드
response.addCookie(idCookie);
response.addCookie(countCookie);
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<meta charset='UTF-8'>");
out.println("<title>Servlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>쿠키 전달</h1>");
out.println("<hr>");
out.println("<p>네 안에 쿠키 있다.</p>");
out.println("<hr>");
out.println("<p><a href='read.itwill'>쿠키 읽기</a></p>");
out.println("</body>");
out.println("</html>");
}
}
read
package site.itwill.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//클라이언트에서 보내온 쿠키를 읽어 클라이언트에게 전달하는 서블릿
//=> 클라이언트는 서버 자원을 요청할 때 서버에 의해 저장된 쿠키를 무조건 제공한다
@WebServlet("/read.itwill")
public class CookieReadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
//클라이언트에서 보내온 모든 쿠키를 반환받아 저장
//httpServletRequest.getCookies() : 클라이언트에서 보내온 모든 쿠키를 Cookie인스턴스 배열로 반환하는 메소드
Cookie[] cookies = request.getCookies();
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<meta charset='UTF-8'>");
out.println("<title>Servlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>쿠키 전달</h1>");
out.println("<hr>");
out.println("<p>네 안에 쿠키 있다.</p>");
out.println("<hr>");
if(cookies == null) {
out.println("<p>쿠키 없따</p>");
}else {
String id = "";
String count = "";
//클라이언트에서 보내온 쿠키 중 원하는 쿠키값만 반환받아 저장
for(Cookie cookie : cookies) {
if(cookie.getName().equals("id")) {
//Cookie.getName() : 쿠키명을 반환하는 메소드
id = cookie.getValue();//쿠키값을 반환하는 메소드
}else if (cookie.getName().equals("count")) {
count = cookie.getValue();
}
}
//클라이언트에게 쿠키값을 전달
if(!id.equals("")) {//쿠키값이 있는 경우
out.println("<p>아이디 = " + id + "</p>");
}
if(!count.equals("")) {//쿠키값이 있는 경우
int cnt = Integer.parseInt(count)+1;
out.println("<p>요청횟수 = " + cnt + "</p>");
//클라이언트에게 쿠키 인스턴스를 저장
//=> 쿠키명이 같은 경우에는 덮어씌우기가 된다.
Cookie cookie = new Cookie("count", ""+cnt);
cookie.setMaxAge(24*60*60);
response.addCookie(cookie);
}
out.println();
}
out.println("<p><a href='create.itwill'>쿠키 전달</a></p>");
out.println("<p><a href='remove.itwill'>쿠키 제거</a></p>");
out.println("</body>");
out.println("</html>");
}
}
remove
package site.itwill.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//클라이언트에 저장된 쿠키를 제거하는 메소드
//=>유지시간이 없는 쿠키를 전달하여 기존 쿠키를 덮어씌우기
@WebServlet("/remove.itwill")
public class CookieRemoveServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
//클라이언트에게 보내온 모든 쿠키를 반환받아저장
Cookie[] cookies = request.getCookies();
if(cookies != null) {
//클라이언트에 저장된 모든 쿠키 제거 - 반복 처리
//=>클라이언트에 저장된 쿠키의 유지시간 변경하여 전달
//=>유지시간이 지난 쿠키는 클라이언트에서 자동 소멸된다.
for(Cookie cookie : cookies) {
cookie.setMaxAge(0);
response.addCookie(cookie);
}
}
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<meta charset='UTF-8'>");
out.println("<title>Servlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>쿠키 제거</h1>");
out.println("<hr>");
out.println("<p>이제 이안에 쿠키 없다.</p>");
out.println("<p><a href='create.itwill'>쿠키 전달</a></p>");
out.println("</body>");
out.println("</html>");
}
}
request.getSession()
setAttribute() : 세션을 공유하는 메소드
getAttribute() : 공유된 세션을 가져다 사용하는 메소드
removeAttribute() : 세션을 제거하는 메소드
package site.itwill.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
//세션을 바인딩하여 클라이언트에게 세션정보를 전달하는 서블릿
//세션 바인딩(Session Binding) : 세션을 서블릿에서 사용할 수 있도록 연결하는 작업 - WAS에 의해 처리
// => 클라이언트에서 JSESSIONID 쿠키를 제공받지 않은 경우 세션 생성 후 바인딩 처리
// => 클라이언트에서 JSESSIONID 쿠키를 제공받은 경우 세션 트렉킹 후 바인딩 처리
//세션 트렉킹(Session Tracking) : JSESSIONID 쿠키값과 모든 세션의 아이디와 비교하는 작업
// => JSESSIONID 쿠키는 기본적으로 유지시간이 -1로 설정되어 브라우저 종료시 자동 소멸
@WebServlet("/session.itwill")
public class SessionServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
//HttpServletRequest.getSession() : 바인딩 처리된 HttpSession 인스턴스를 반환하는 메소드
// => HttpSession 인스턴스를 생성하여 바인딩 하거나 기존 HttpSession 인스턴스를 바인딩하여 반환
// => 클라이언트에는 JSESSIONID 쿠키로 세션 아이디를 저장하여 전달
//HttpSession : 연결 지속성을 제공하기 위한 정보를 저장하기 위한 인스턴스
// => WAS에 의해 관리(생성,사용,소멸)
HttpSession session=request.getSession();
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<meta charset='UTF-8'>");
out.println("<title>Servlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>세션(Session)</h1>");
out.println("<hr>");
//HttpSession.isNew() : 세션 트렉킹하여 바인딩된 경우 false 반환
//, 세션 생성하여 바인딩된 경우 true를 반환하는 메소드
if(session.isNew()) {
out.println("<p>세션을 생성하여 바인딩 되었습니다.</p>");
//JSESSIONID 쿠키의 유지시간을 변경하여 클라이언트에게 전달
// => 브라우저 종료 후에도 세션 바인딩하여 사용 가능
Cookie cookie=new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(60*60);
response.addCookie(cookie);
} else {
out.println("<p>세션을 트렉킹하여 바인딩 되었습니다.</p>");
}
//HttpSession.getId() : 세션의 고유값을 반환하는 메소드
out.println("<p>세션 아이디 = "+session.getId()+"</p>");
//HttpSession.getCreationTime() : 세션이 생성된 시간(TimeStamp)을 반환하는 메소드
out.println("<p>세션 생성시간 = "+session.getCreationTime()+"</p>");
//HttpSession.getMaxInactiveInterval() : 세션 유지시간(초)을 반환하는 메소드
out.println("<p>세션 유지시간 = "+session.getMaxInactiveInterval()+"</p>");
//session.setAttribute(name, value) : 바인딩된 세션에 고유값과 인스턴스를 전달하여 저장하는 메소드
//=>고유값이 중복된 경우 기본 이느턴스대신 새로운 인스턴스를 사용?
//=> 다른 프로그램에서 세션에 저장된 인스턴스 사용 가능
session.setAttribute("now", new Date());
//HttpSession.getAttribute(String name) : 바인딩된 세션에 저장된 인스턴스를 고유값을 이용하여 반환하는 메소드
//=> 다른 프로그램에서 세션에 저장한 인스턴스 사용 가능
//=> 저장된 인스턴스를 Object타입으로 반환하므로 명시적 객체 형변환 후 사용한다
//=> 고유값이 없는 경우 null반환
Date now = (Date)session.getAttribute("now");
out.println("<p> 세션에 저장된 인스턴스 = " + now+ "</p>");
//removeAttribute(String name) : 바인딩된 세션에 저장된 인스턴스를 고유값을 이용하여 제거하는 메소드
session.removeAttribute("now");
//invalidate() : 바인딩된 세션에 저장된 언바인딩 처리(unBinding)하는 메소드
//=>세션을 제거하진 못해도 바인딩한것을 없애는 메소드 ==> 트랙킹이 안됨.
//=> 로그아웃할때 주로 사용
session.invalidate();
out.println("</body>");
out.println("</html>");
}
}
package site.itwill.servlet;
import java.io.IOException;
import java.io.PrintWriter;
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;
//테이블에 저장된 모든 행을 검색하여 클라이언트에게 전달하는 서블릿 - jdbc사용
@WebServlet("/old.itwill")
public class PhonebookOldServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
// 1.OracleDriver클래스를 읽어 메모리에 저장 - 클래스 로딩작업
// =>OracleDriver인스턴스가 생성되어 JDBC 드라이버로 등록
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
//2.Oracle DBMS Server에 접속하여 Connection 인스턴스를 반환받아 저장
String url="jdbc:oracle:thin:@localhost:1521:xe";
String user="scott";
String password="tiger";
con=DriverManager.getConnection(url, user, password);
// 3.sql명령을 저장한 preparedStatement인스턴스를 반환받아 저장
String sql = "select * from phonebook order by name";
pstmt = con.prepareStatement(sql);
// 4.sql명령을 전달하여 실행된 결과를 반환하여 저장
rs = pstmt.executeQuery();
// 5.반환받은 결과를 이용한 처리 작업 - 클라이언트에게 결과를 HTML로 전달
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<meta charset='UTF-8'>");
out.println("<title>Servlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>전화번호부(JDBC)</h1>");
out.println("<hr>");
out.println("<table border='1' cellspacing='0' width='600'>");
out.println("<tr>");
out.println("<th>전화번호</th><th>이름</th><th>주소</th>");
out.println("</tr>");
while (rs.next()) {
out.println("<tr align='center'>");
out.println("<td>" + rs.getString("phone") + "</td>");
out.println("<td>" + rs.getString("name") + "</td>");
out.println("<td>" + rs.getString("address") + "</td>");
out.println("</tr>");
}
out.println("</table>");
out.println("</body>");
out.println("</html>");
} catch (ClassNotFoundException e) {
System.out.println("[에러]OracleDriver 클래스를 찾을 수 없습니다.");
} catch (SQLException e) {
System.out.println("[에러]SQL 오류 = " + e.getMessage());
}
}
}
'💻 수업정리 (2020) > Servlet' 카테고리의 다른 글
[7/28] (0) | 2020.07.28 |
---|---|
[7/24] (0) | 2020.07.24 |
[7/23] 서블릿 (0) | 2020.07.23 |