주다람
개미는 뚠뚠🎵 오늘도 뚠뚠🎵 열심히 개발하네✨
주다람
전체 방문자
오늘
어제
  • 분류 전체보기
    • 💭 기록해보자
      • BackEnd
      • FrontEnd
      • 회고
    • 💻 수업정리 (2020)
      • 오라클
      • 자바
      • CSS & HTML
      • JavaScript
      • Servlet
      • JSP
    • 📚 알고리즘
      • DP(다이나믹 프로그래밍)
      • 탐색(BFS,DFS)
      • 다익스트라
      • 순열과 조합
      • 백트래킹
      • 이분탐색(binarySearch)
      • 탐욕(Greedy)
      • 스택,큐,덱(Stack,Queue,Deque)
      • 유니온파인드(Union-Find)

블로그 메뉴

  • 홈

공지사항

인기 글

태그

  • 숫자함수
  • 함수
  • 일반함수
  • 그룹함수
  • 날짜함수
  • background-gradient
  • 오라클
  • 변환함수
  • oracle
  • 문자함수
  • group by
  • 박스모델

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
주다람

개미는 뚠뚠🎵 오늘도 뚠뚠🎵 열심히 개발하네✨

[7/27] 쿠키와 세션
💻 수업정리 (2020)/Servlet

[7/27] 쿠키와 세션

2020. 7. 27. 18:44

📌쿠키 및 세션

  •  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
    '💻 수업정리 (2020)/Servlet' 카테고리의 다른 글
    • [7/28]
    • [7/24]
    • [7/23] 서블릿
    주다람
    주다람
    신입 어린이 -> 주니어개발자 성장중

    티스토리툴바