쿠키와 세션 : 개념 / 공통점 / 차이점
- 클라이언트와 서버 간에 정보를 교환 시, 클라이언트 PC 또는 서버의 메모리에 저장해 두고 사용하면 프로그램 속도를 향상시킬 수 있음
- 공통점 : 웹 통신간 유지하려는 정보 저장을 위해 사용 (로그인 정보 등)
- 차이점 : 저장위치, 저장형식, 용량제한, 만료시점 등
- 쿠키 : 개인 PC에 저장
- 세션 : 접속중인 웹 서버에 저장
HTTP 프로토콜
- 서버-클라이언트 통신 시 stateless 방식으로 통신
- 브라우저에서 새 웹페이지를 열면 기존의 웹페이나 서블릿에 관한 어떤 연결 정보도 유지되지 않음
- 새로 열린 페이지에서 어떤 정보도 알 수 없음
- 페이지가 서로 독립적이어서 서로의 상태를 알 수 없음
웹 페이지 사이에 또는 서블릿 간에 상태 및 정보 공유를 위해서는 웹 페이지를 연결시켜 주는 기능 필요 (세션 트래킹)
웹 페이지를 연결하기 위한 방법
: 페이지 간에 정보를 교환하거나 데이터를 공유하기 위한 방법
(1) <hidden> 태그 사용
- <input type=’hidden’ value=’${id}’> 태그 사용
- 현재 페이지에 데이터를 숨겨놓고, 연결된 다음 페이지로 데이터를 보내는 방법
- 두 웹 페이지가 데이터를 공유
- GET 방식으로 전송 : 데이터 노출, 길이 제한, 보안 문제
- ex) 페이지1에서 <input type=’hidden’ name=’id’ value=’abcd’>로 데이터 숨겨 놓음
- 페이지2에서 request.getParameter()로 받아서 사용할 수 있음
(2) URL Rewriting
- GET 방식으로 전송할 때 데이터가 URL 뒤에 붙어서 다음 페이지로 전송
- 다음 페이지에서 request.getParameter()로 받아서 사용할 수 있음
- GET 방식으로 전송 : 데이터 노출, 길이 제한, 보안 문제
- ex) second02?name=lee
(3) 쿠키
- 클라이언트 PC의 Cookie 파일에 정보를 저장한 후 웹 페이지 공유
(4) 세션
- 서버 메모리에 정보를 저장한 후 웹 페이지 공유
웹 페이지 연결 예제 - 1 : hidden
login-hidden.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인창</title>
</head>
<body>
<form name="formLogin" method="post" action="loginHidden" >
아이디 :<input type="text" name="user_id"><br>
비밀번호:<input type="password" name="user_pw" ><br>
<input type="submit" value="로그인"> <input type="reset" value="다시입력">
<!-- hidden 태그 -->
<input type="hidden" name="user_address" value="서울시 종로구">
<input type="hidden" name="user_email" value="test@naver.com">
<input type="hidden" name="user_hp" value="010-1111-1111">
</form>
</body>
</html>
LoginHiddenServlet : /loginHidden
package sec01;
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;
/**
* Servlet implementation class LoginHiddenServlet
*/
@WebServlet("/loginHidden")
public class LoginHiddenServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String user_id = request.getParameter("user_id");
String user_pw = request.getParameter("user_pw");
String user_address = request.getParameter("user_address");
String user_email = request.getParameter("user_email");
String user_hp = request.getParameter("user_hp");
String data = "<html><body>";
data+="안녕하세요!<br> 로그인하셨습니다.<br><br>";
data+="아이디 :" + user_id + "<br>";
data+="비밀번호 :" + user_pw + "<br>";
data+="주소 :" + user_address + "<br>";
data+="이메일 :" + user_email + "<br>";
data+="휴대전화 :" + user_hp;
data+="</body></html>";
out.print(data);
}
}
웹 페이지 연결 예제 - 2 : URL Rewriting
login.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인창</title>
</head>
<body>
<form name="formLogin" method="post" action="login" >
아이디 :<input type="text" name="user_id"><br>
비밀번호:<input type="password" name="user_pw" ><br>
<input type="submit" value="로그인"> <input type="reset" value="다시입력">
<!-- hidden 태그 -->
<input type="hidden" name="user_address" value="서울시 종로구">
<input type="hidden" name="user_email" value="test@naver.com">
<input type="hidden" name="user_hp" value="010-1111-1111">
</form>
</body>
</html>
LoginServlet : /login
package sec01;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class LoginServlet
*/
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String user_id = request.getParameter("user_id");
String user_pw = request.getParameter("user_pw");
String user_address = request.getParameter("user_address");
String user_email = request.getParameter("user_email");
String user_hp = request.getParameter("user_hp");
if(user_id!=null && user_id.length()!=0) {
String data = "<html><body>";
data+="안녕하세요!<br> 로그인하셨습니다.<br><br>";
data+="아이디 :" + user_id + "<br>";
data+="비밀번호 :" + user_pw + "<br>";
data+="주소 :" + user_address + "<br>";
data+="이메일 :" + user_email + "<br>";
data+="휴대전화 :" + user_hp;
data+="</body></html>";
out.print(data);
// URL Rewriting 방식 이용
user_address = URLEncoder.encode(user_address, "utf-8");
out.print("<a href='/Servlet02/second?user_id=" + user_id
+ "&user_pw=" + user_pw
+ "&user_address=" + user_address
+ "'><br>두 번째 서블릿으로 보내기</a>");
data = "</body></html>";
} else {
out.println("로그인 하지 않았습니다.<br><br>");
out.println("다시 로그인 하세요<br><br>");
out.println("<a href='/Servlet02/login.html'>");
}
}
}
웹 페이지 연결 예제 - 3 : URL Rewriting
package sec01;
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;
/**
* Servlet implementation class SecondServlet
*/
@WebServlet("/second")
public class SecondServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String user_id = request.getParameter("user_id");
String user_pw = request.getParameter("user_pw");
String user_address = request.getParameter("user_address");
out.println("<html><body>");
if(user_id!=null && user_id.length()!=0) {
out.println("이미 로그인 상태입니다.<br><br>");
out.println("첫 번째 서블릿에서 넘겨준 아이디 : " + user_id + "<br>");
out.println("첫 번째 서블릿에서 넘겨준 비밀번호 : " + user_pw + "<br>");
out.println("첫 번째 서블릿에서 넘겨준 주소 : " + user_address + "<br>");
out.println("</body></html>");
} else {
out.println("로그인 하지 않았습니다.<br><br>");
out.println("다시 로그인 하세요<br><br>");
out.println("<a href='/Servlet02/login.html'>");
}
}
}
쿠키 (Cookie)
- 서버 측에서 클라이언트 측에 상태 정보를 저장하고 추출하기 위한 메커니즘
- 서버에서 생성하여, 클라이언트 측에 저장됨
- 서버에 요청할 때마다 쿠키의 속성 값을 참조하거나 변경
- 크기는 4kb 용량
- 클라이언트에 300개까지 쿠키 저장 가능
- 하나의 도메인 당 20개의 값만 저장
- 클라이언트에 저장되므로 보안상의 문제 발생
- 따라서 민감한 정보는 쿠키 내에 저장하지 않음
- 쿠키는 사용자가 거부할 수 있으면 256문자 이하의 text 데이터만 저장됨
쿠키 생성 및 저장 과정
서버에서 쿠키 생성
- Cookie 클래스로부터 쿠키 객체 생성
- Cookie cookie = new Cookie(이름, 값);
속성 설정
- setter 사용해서 쿠키 객체의 유효기간 설정
- cookie.setMaxAge(유효기간);
클라이언트에 전송되어 저장
- response 내장 객체의 addCookie() 메소드로 전송
- response.addCookie(쿠키객체);
클라이언트 - 서버 간 Cookie 흐름
쿠키 동작 방식
- 클라이언트가 페이지 요청
- 서버에서 쿠키 생성 / HTTP 헤더에 쿠키를 포함시켜 응답 (브라우저가 종료되어도 쿠키 만료기간이 남아있다면 클라이언트에서 보관하고 있음)
- 다시 요청을 할 경우 HTTP 헤더에 쿠키를 함께 보냄 (서버에서 쿠키를 읽어 이전 상태 정보를 변경할 필요가 있을 때, 쿠키를 업데이트하여 변경된 쿠키를 HTTP 헤더에 포함시켜 응답)
- 이후 요청 받은 페이지 응답
쿠키 관련 주요 메소드
- setMaxAge() : 유효 기간 설정
- setValue() : 쿠키 값 설정
- sevVersion() : 쿠키 버전 설정
- setPath(0 : 쿠키 사용의 유효 디렉터리 설정
- getMaxAge() : 유효 기간 반환
- getName() : 쿠키 이름 반환
- getValue() : 쿠키 값 반환
- 등등
- 쿠키 제거 : cookie.setMaxAge(0) 으로 설정
- 클라이언트에 전송되어 변경된 값으로 저장 : response.addCookie(cookie)
쿠키 유형
Persistence 쿠키
- setMaxAge(양수) 메소드를 사용해서 양수값으로 지정해서 파일로 저장하면 지속해서 남아있음
- 유효 기간 동안 지속됨
Session 쿠키
- 브라우저가 사용하는 메모리에 생성되는 쿠키로
- 브라우저가 종료되면 메모리의 Session 쿠키도 자동으로 소멸
- setMaxAge(음수) : Session 쿠키로 생성
쿠키 예제
SetCookieValue 서블릿 : /setCookie
package sec02;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;
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;
/**
* Servlet implementation class SetCookieValue
*/
@WebServlet("/setCookie")
public class SetCookieValue extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
Date d = new Date();
// Cookie 객체 생성 후 cookieTest 이름으로 한글 정보 인코딩하여 쿠키에 저장
Cookie cookie = new Cookie("cookieTest", URLEncoder.encode("Cookie 테스트입니다.", "utf-8"));
cookie.setMaxAge(24*60*60); // 유효기간 설정 : 하루 = 24시간 * 60분 * 60초
response.addCookie(cookie); // 생성한 쿠키를 브라우저로 전송하여 저장
out.println("현재 시간 : " + d); //
out.println("<br> Cookie에 저장");
}
}
GetCookieValue 서블릿 : getCookie
package sec02;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
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;
/**
* Servlet implementation class GetCookieValue
*/
@WebServlet("/getCookie")
public class GetCookieValue extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
// 가져올 때는 한 개를 가져오더라도 배열로 가져와야 함
Cookie[] allValues = request.getCookies();
for (int i=0; i<allValues.length; i++) {
if(allValues[i].getName().equals("cookieTest")) {
out.println("<h2>Cookie 값 가져오기 : " + URLDecoder.decode(allValues[i].getValue(), "utf-8"));
}
}
}
}
쿠키 이용해서 팝업창 제어
팝업창 제어는 서버에서 쿠키를 다루지 않고, 자바스크립트를 이용해서 쿠키에 접근
팝업창 제어 예제 : popUp.html
- 체크박스 체크하여 쿠키 설정 : 오늘 더 이상 팝업창 띄우지 않기
- 쿠키이름=값;패스=/;유효기간=값
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
<script type="text/javascript">
function setPopUpStart(obj) {
if(obj.checked == true) {
var expireDate = new Date();
alert(expireDate); // 현재 날짜
var days = 1;
expireDate.setDate(expireDate.getDate() + days);
alert(expireDate); // 오늘 날짜 + 1일
// 쿠키 값 설정 : 쿠키 이름, 패스, 유효 기간
document.cookie = "notShowPop=" + "true" + ";path=/;expires="+
expireDate.toGMTString();
// 팝업창 닫기
window.close();
}
}
</script>
</head>
<body>
알림 팝업창입니다. <br><br><br><br><br><br>
<form>
<input type="checkbox" onClick="setPopUpStart(this)"> 오늘 더 이상 팝업창 띄우지 않기
</form>
</body>
</html>
팝업창 제어 예제 : popUpTest.html
- 페이지 로드 하면서 쿠키 읽어 옴
- 설정한 값이 아니면 팝업창 열림
- 설정한 값이 있으면 유효기간 전에는 팝업창 안 열림
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>popUpTest</title>
<script type="text/javascript">
// 시작 시 페이지 로드 함수 호출
window.onload = pageLoad;
// 페이지 로드 함수 : 팝업창(popUp.html) 띄우는 함수
function pageLoad() {
// 쿠키 읽어오는 함수 getCookieValue() 호출하여 저장된 쿠키 읽어오기
var notShowPop = getCookieValue();
// 읽어온 쿠키 값이 "true"가 아니면 popUp.html 열기
if(notShowPop!="true") {
window.open("popUp.html", "pop", "width=400, height=500, history=no, resizable=no, status=no, scrollbars=yes, menubar=no");
}
}
// 쿠키 읽어오는 함수
function getCookieValue(){
var result = "false"; // default
// 쿠키 존재 여부 확인 : 쿠키가 존재하면
if(document.cookie!="") {
// 구분자를 세미콜론(;)으로 하여 각 값을 배열로 저장
cookie = document.cookie.split(";");
for(var i=0; i<cookie.length; i++) {
// 구분자 = 를 기준으로 각 값을 배열로 저장
element = cookie[i].split("=");
value = element[0];
value = value.replace(/^\s*/,''); // 앞 공백 제거 정규식
// 쿠키 이름이 notShowPop 이면
if(value=="notShowPop") {
result = element[1]; // 쿠키 값 가져오기 ("true") (배열 두 번째 요소)
}
}
}
return result;
}
// 쿠키 삭제하는 함수 : 유효 기간을 -1로 설정
function deleteCookie() {
document.cookie = "notShowPop=" + "false" + ";path=/;expires=-1";
}
</script>
</head>
<body>
<form>
<input type="button" value="쿠키 삭제" onClick="deleteCookie()">
</form>
</body>
</html>
공백제거 정규식
- replace(' ', '') : 첫 번째 공백 제거
- replace(/^\s*/,'') : 앞에 있는 모든 공백 제거
- replace(/\s*$/,'') : 뒤의 모든 공백 제거
세션 (Session)
- 클라이언트와 웹 서버 간에 네트워크로 연결이 지속적으로 유지되고 있는 상태
- 쿠키와 마찬가지로 서버와의 관계를 유지하기 위한 수단
- 쿠키와 달리 클라이언트 측에 저장되는 것이 아니라 서버 상에 객체로 존재
- 따라서 세션은 서버에서만 접근이 가능하여 보안이 좋음
- 서버에서 사용자의 정보를 유지 관리
- 사용자 인증 후 여러 페이지에 걸쳐 정보를 공유해서 사용할 수 있게 해줌
- Session은 서버 측에서만 설정이 가능
- 브라우저 당 한 개씩 생성
세션 생성 및 사용 과정
- 클라이언트가 서버에 페이지 요청
- Session 자동 생성
- Session 속성 설정 (session 내부 객체의 메소드 사용)
세션 ID
- 클라이언트가 처음 접속하면 서버(컨테이너)로 부터 유일한 ID를 부여 받게 되는데 이를 세션 ID라고 함
- 클라이언트가 재 접속했을 때 클라이언트를 구분하기 위한 수단으로 사용됨
- 서블릿에서 생성된 세션 id는 브라우저로 전송되어 세션 쿠키에 JSESSIONID 라는 이름의 쿠키로 저장됨
- F12 개발자도구 / Application / Cookies에서 확인 가능
세션 관련 메소드
- setAttribute(이름, 값) : 세션 이름과 값 설정
- getAttribute(이름) : 이름에 해당된 값 반환
- getAttributeNames() : 모든 세션 이름 반환
- getId() : 세션 ID 반환
- isNew() : 새로 생성되었는지 여부 반환
- getMaxInactiveInterval() : 설정된 유효기간 반환
- removeAttribute() : 설정된 속성값 제거
- invalidate() : 실행 중인 세션 종료. 모든 데이터 삭제. 로그아웃 시 사용
- isRequestedSessionIdValid() : 유효한 세션 ID가 있는 여부 반환
세션 값 설정
- session.setAttribute(“SID”, “abcd”)
- session : 내장 객체
세션 값 알아오기
- Object obj = session.getAttribute(“SID”);
- Object 타입 반환 (사용 시 형 변환)
세션 속성 제거
- session.removeAttribute(“SID”);
세션 종료
- session.invalidate()
- 또는 설정된 유효 기간이 만료되면 종료
세션 무효화
- invalidate() 메소드를 사용해서 바로 무효화시킬 수 있음
- web.xml 파일에서 session-timeout 설정해서 시간을 정할 수 있음
- setMaxInactiveInterval()를 사용해서 시간 지정 가능
- 기본 세션은 마지막 요청으로부터 30분 경과 후 자동 소멸됨
- 세션 유효 기간을 따로 설정하지 않으면 톰캣에서 설정한 기본 유효 시간 30분 적용
<!-- web.xml 중 다음과 일치하는 코드 내용 일부를 수정하여 유효기간 설정 가능 -->
<session-config>
<session-timeout>30</session-timeout>
</session-config>
세션 예제
SessionTest 서블릿 : /sess : 세션 아이디, 최소 생성 시간, 접근 시간, 유효 시간, isNet() 확인
package sec03;
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.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Servlet implementation class SessionTest
*/
@WebServlet("/sess")
public class SessionTest extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession();
out.println("세션 아이디 : " + session.getId() + "<br>");
out.println("최초 세션 생성 시각 : " + new Date(session.getCreationTime()) + "<br>");
out.println("최근 세션 접근 시각 : " + new Date(session.getLastAccessedTime()) + "<br>");
out.println("세션 유효 시간 : " + session.getMaxInactiveInterval() + "<br>");
if(session.isNew()) {
out.println("새 세션이 만들어졌습니다.");
}
// 동일 브라우저 + 유효기간 내에서는 웹 브라우저를 껐다 켜도 세션 아이디 동일 (다른 웹 브라우저로 재실행하면 아이디 다름 = 새 세션 생성)
}
}
SessionTest2 서블릿 : /sess2 : 세션 유효 시간 5초로 설정
package sec03;
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.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Servlet implementation class SessionTest2
*/
//세션 유효 시간을 5초로 설정
@WebServlet("/sess2")
public class SessionTest2 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession();
out.println("세션 아이디 : " + session.getId() + "<br>");
out.println("최초 세션 생성 시각 : " + new Date(session.getCreationTime()) + "<br>");
out.println("최근 세션 접근 시각 : " + new Date(session.getLastAccessedTime()) + "<br>");
out.println("기본 세션 유효 시간 : " + session.getMaxInactiveInterval() + "<br>");
session.setMaxInactiveInterval(5); // 세션 유효 시간을 5초로 설정
out.println("변경 세션 유효 시간 : " + session.getMaxInactiveInterval() + "<br>");
if(session.isNew()) {
out.println("새 세션이 만들어졌습니다.");
}
// 5초 지난 후 새로 실행 -> 새 세션 생성됨
// 5초 지나기 전에 새로 실행 -> 새 세션 생성되지 않음
}
}
SessionTest3 서블릿 : /sess3 : invalidate() 호출해서 사용자가 세션을 강제로 삭제 + 세션 이용한 로그인/로그아웃 기능
package sec03;
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.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Servlet implementation class SessionTest3
*/
// invalidate() 호출해서 생성된 세션 객체를 강제로 삭제 : 세션 무효화
@WebServlet("/sess3")
public class SessionTest3 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession();
out.println("세션 아이디 : " + session.getId() + "<br>");
out.println("최초 세션 생성 시각 : " + new Date(session.getCreationTime()) + "<br>");
out.println("최근 세션 접근 시각 : " + new Date(session.getLastAccessedTime()) + "<br>");
out.println("세션 유효 시간 : " + session.getMaxInactiveInterval() + "<br>");
if(session.isNew()) {
out.println("새 세션이 만들어졌습니다.");
}
session.invalidate();
// 생성된 세션 객체를 강제로 삭제
// 실행할 때마다 매번 세션 새로 생성
}
}
sessionLogin.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인창</title>
</head>
<body>
<form name="frmLogin" method="post" action="logInOut" >
아이디 :<input type="text" name="user_id"><br>
비밀번호:<input type="password" name="user_pw" ><br>
<input type="submit" value="로그인"> <input type="reset" value="다시입력">
</form>
</body>
</html>
LoginLogout 서블릿 : /logInOut
package sec03;
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;
/**
* Servlet implementation class LoginLogout
*/
@WebServlet("/logInOut")
public class LoginLogout extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession();
String user_id = request.getParameter("user_id");
String user_pw = request.getParameter("user_pw");
// 처음 접속이면
if(session.isNew()) {
// user_id 입력 값이 있으면
if(user_id != null) {
// (세션 첫 생성 + 아이디 값이 있는 경우)
// SID 이름, user_id 값으로 세션 변수 생성
session.setAttribute("SID", user_id);
// 다시 실행시켜서 SID 확인
out.print("<a href='logInOut'>로그인 상태 확인</a>");
}else { // user_id 입력 값이 없으면
// (세션 첫 생성 + 아이디 값이 없는 경우)
out.print("<a href='sessionLogin.html'>다시 로그인 하세요!</a>");
session.invalidate(); // 현재 접속해있는 세션 끊어버림 -> 다시 로그인하라고
}
} else { //아니고 세션이 있으면
user_id = (String) session.getAttribute("SID"); // 오브젝트 반환하기 때문에 string 형변환
if(user_id != null && user_id.length() != 0) {
out.print("안녕하세요 " + user_id + "님!!");
out.print("<br><a href='logout'>로그아웃</a>");
} else {
out.print("<a href='sessionLogin.html'>다시 로그인 하세요!</a>");
session.invalidate();
}
}
}
}
SessionLogout 서블릿 : /logout
package sec03;
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;
/**
* Servlet implementation class SessionLogout
*/
@WebServlet("/logout")
public class SessionLogout extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession();
session.invalidate(); // 세션 무효화
out.print("로그아웃 되었습니다. <br>");
out.print("<a href='sessionLogin.html'>로그인</a>");
}
}
'Backend > Servlet' 카테고리의 다른 글
서블릿 포워드와 바인딩 (0) | 2021.12.29 |
---|---|
커넥션 풀 (DBCP : DataBase Connection Pool) (0) | 2021.12.28 |
서블릿 DB 연동 (0) | 2021.12.28 |
DTO vs VO (0) | 2021.12.28 |
자바스크립트로 서블릿에 요청하기 예제 (0) | 2021.12.27 |