티스토리 뷰

 

 

 

📌 등장배경

http 프로토콜의 connectionLESS, stateLESS 특징으로서 각 페이지마다 이전 페이지에서 했던 데이터 및 기능들을 현재 페이지에서 알 수가 없다.

알 수 있도록 처리 (세션관리)

 

 

 

 

1️⃣ HttpSession 이용

  • 서버에 데이터를 저장
      ⇒ setAttribute(key, Object)
  • HttpSession API 애용
Http의 특성
1. HTTP는 무상태(Stateless) 프로토콜이다.
2. 클라이언트와 서버가 요청과 응답을 주고 받으면 연결이 끊어진다.
3. 클라이언트가 다시 요청하면 서버는 이전 요청을 기억하지 못한다.
4. 클라이언트와 서버는 서로 상태를 유지하지 않는다.


session의 특성
1. 클라이언트가 처음 서버에 연결을 하면 어떤 하나의 session ID가 생성된다.
2. 이 아이디는 고유한 아이디 이다.
3. 이 아이디를 통해서 서버는 요청에 대한 응답을 하게 된다.
4. 즉, 클라이언트는 주민등록번호와 같은 것을 갖고 있는 것이다.
  • 저장되는 데이터는 모든 데이터가 가능하다.
  • 웹 브라우저와 동일 lifecycle 갖는다. ( 보안 이슈로 time-out 지원 )
  • 주요 메서드
    • HttpSession session = request.getSession();
    • session.setAttribute(key, value); 
      key를 사용하여 객체를 세션에 바인딩한다.
      value는 값으로 들어올 자료형을 예측할 수 없기에 Object형으로 업캐스팅하여 모두 받아낸다.
    • session.getAttribute(key);
      key로 바인딩된 객체를 돌려주고, 없다면 null을 돌려준다.
      value는 세션을 저장할 때 업캐스팅을 했으므로 가져올 땐 원래대로 다운캐스팅 해야한다.
    • session.removeAttribute(key);
      값 제거
    • session.invalidate();
      session 종료 (로그아웃)
    • session.setMaxInactiveInterval (second);
      client가 설정 시간 동안 request가 없으면 session 만료 (time-out)
    • session.getId();
      세션 id값 얻기
    • session.isNew();
      새로운 세션이냐
    • session.getCreationTime();
      세션이 생성된 시간을 long 반환
    • session.getLastAccessedTime();
      가장 마지막 요청 시간을 long 반환
  • 용도 : 로그인, 장바구니






📝실습

 

<%@ 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>
<h2>GET-로그인화면</h2>
<form action="login" method="get">
아이디: <input type="text" name="userid"><br>
비번: <input type="text" name="passwd"><br>
<input type="submit" value="로그인">
</form>

</body>
</html>
package com.servlet;

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("/login")
public class LoginServlet extends HttpServlet {

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
		String userid = request.getParameter("userid");
		String passwd = request.getParameter("passwd");
		
		// DB 연동해서 confirm 함. (인증완료)
		
		// 세션얻기
		HttpSession session = request.getSession();
		System.out.println("세션의 id값: " + session.getId());  // ID 부여
		
		// 세션에 로그인 정보 저장
		session.setAttribute("user", userid);
		
		// 로그인 이후의 응답처리
			response.setContentType("text/html;charset=utf-8");
			PrintWriter out = response.getWriter();
			 out.print("<html><head>");
			 out.print("<meta charset=\"UTF-8\">");
			 out.print("<title>Insert title here</title>");				 out.print("</head>");
			 out.print("</head>");
			 out.print("<body>");
				 
			 out.print("<h1>로그인성공</h1>");		 
			 out.print("안녕하세요. " + userid +"님");		 
			 out.print("<a href='mypage'>mypage</>");
				 
				 out.print("</body></html>");
			}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}
package com.servlet;

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("/logout")
public class LogoutServlet extends HttpServlet {

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
		String userid = request.getParameter("userid");
		String passwd = request.getParameter("passwd");
		
		// DB 연동해서 confirm 함. (인증완료)
		
		// 세션얻기
		HttpSession session = request.getSession();
		
		// 세션에 로그인 정보 얻기
		String id = (String)session.getAttribute("user");
		
		if(id != null) {
			// 로그인 한 경우로서 응답처리
			session.invalidate();
			// 로그아웃 이후의 화면 선택
			response.sendRedirect("loginForm.jsp");
		}else {
			// id값이 null => 로그인을 위한 경우 또는 했는데 time-out 
			response.sendRedirect("loginForm.jsp");
			// 로그인 이후의 응답처리
		}
			}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

 

 

 

 


 

 

 

2️⃣ Cookie 이용

  • Cooke API 이용
  • 클라이어튼(브라우저 또는 PC)에 데이터를 저장
  • 저장되는 데이터는 문자열만 저장 가능하다.
  • 도메인(웹사이트)당 300개까지만 저장 가능하다.
  • setMaxAge(값);
    • 양수 : 지정된 양수값만큼 쿠키 정보 유지
    • 음수 : 브라우저와 동일한 lifecycle
    • 0 : 쿠키 즉시 삭제
  • 주요 메서드
    • Cookie c = new Cookie(String key, String value);
    • response. addCookie(c); //생성된 쿠키 저장
    • Cookie [] x = request.getCookies(); //쿠키 조회
    • String key = c.getName();
    • String value = c.getValue();
    • c.setMaxAge(값);
  • 가장 큰 단점은 보안 취약, 클라이언트가 쿠키 사용 여부 결정한다.
  • 용도 : 로그인 아이디 저장, 이전에 봤던 상품 목록 보여주기

 

 

 


 

 

 

 

📝 실습

<%@ 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>
<h2>GET-로그인화면</h2>
<form action="login" method="get">
아이디: <input type="text" name="userid"><br>
비번: <input type="text" name="passwd"><br>
<input type="submit" value="로그인">
</form>

</body>
</html>
package com.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;
import javax.servlet.http.HttpSession;

@WebServlet("/login")
public class LoginServlet extends HttpServlet {

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
		String userid = request.getParameter("userid");
		String passwd = request.getParameter("passwd");
		
		// DB연동해서 인증작업 완료
		
		// 쿠키에 로그인 정보 저장
		// 쿠키 생성
		Cookie c = new Cookie("user", userid);
		
		// 쿠키 응답
		response.addCookie(c);
		
		// 로그인 이후의 응답처리
					response.setContentType("text/html;charset=utf-8");
					PrintWriter out = response.getWriter();
					 out.print("<html><head>");
					 out.print("<meta charset=\"UTF-8\">");
					 out.print("<title>Insert title here</title>");				 out.print("</head>");
					 out.print("</head>");
					 out.print("<body>");
						 
					 out.print("<h1>로그인성공</h1>");		 
					 out.print("안녕하세요. " + userid +"님");		 
					 out.print("<a href='mypage'>mypage</>");
						 
						 out.print("</body></html>");
		
			}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}
package com.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;
import javax.servlet.http.HttpSession;

@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 쿠키얻기, 최대 300개
				Cookie [] cookies = request.getCookies();
				
				// 로그인 정보 얻기
				String id = null;
				Cookie xxx = null;
				for(Cookie c: cookies) {
					if("user".equals(c.getName())) {
						id = c.getValue();
						xxx = c;
					}
				}
				
				// 로그인 유무 확인
				if(id != null) {
					//응답처리
					xxx.setMaxAge(0);    // 쿠키 삭제
					response.addCookie(xxx);   // 쿠키 응답
					// 로그아웃 이후의 화면 선택
					response.sendRedirect("loginForm.jsp");
				}else {
					response.sendRedirect("loginForm.jsp");
				}
				
			}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}
package com.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;
import javax.servlet.http.HttpSession;

@WebServlet("/mypage")
public class MyPageServlet extends HttpServlet {

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
		String userid = request.getParameter("userid");
		String passwd = request.getParameter("passwd");
		
		// DB 연동해서 confirm 함. (인증완료)
		
		// 쿠키얻기, 최대 300개
		Cookie [] cookies = request.getCookies();
		
		// 로그인 정보 얻기
		String id = null;
		for(Cookie c: cookies) {
			if("user".equals(c.getName())) {
				id = c.getValue();
			}
		}
		
		// 로그인 유무 확인
		if(id != null) {
			//응답처리
			// 로그인 한 경우로서 응답처리
						response.setContentType("text/html;charset=utf-8");
						PrintWriter out = response.getWriter();
						 out.print("<html><head>");
						 out.print("<meta charset=\"UTF-8\">");
						 out.print("<title>Insert title here</title>");
						 out.print("</head>");
						 out.print("<body>");
						 out.print("<h1>mypage</h1>");		 
						 out.print("안녕하세요. " + id +"님");		 
						 out.print("<a href='logout'>로그아웃</>");		 
						 
						 out.print("</body></html>");
		}else {
			response.sendRedirect("loginForm.jsp");
		}
		

		
	}


	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

 

 

 




 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함