백엔드 프로그래밍

백엔드 (3) - 서블릿 포워드, 쿠키와 세션

hyovvely 2021. 12. 29. 23:47

서블릿 포워드 방법

  1. rediret : HttpServletResponse 객체의 sendRedirect() 메소드 사용
    • 형식 : sendRedirect ( "포워드할 서블릿 또는 JSP");
  2. refresh : HttpServletResponse 객체의 addHeader() 메소드 사용
    • 형식 : response.addHeader ("Refresh", 경과시간(초);url=요청할 서블릿 또는 JSP);
  3. location : 자바스크립트 location 객체의 href 속성 이용
    • 형식 : location.href = "요청할 서블릿 또는 JSP";
  4. dispatch : 일반적으로 포워딩 기능 지칭
    • 형식 : RequestDispatcher dis = request.getRequestDispatcher ("포워드할 서블릿 또는 JSP");
      • dis.forward(request, response);

redirect, refresh, location

  • 서블릿이 웹 브라우저를 거쳐 다른 서블릿이나 JSP에게 요청하는 방법

dispatch

  • 클라이언트를 거치지 않고 서블릿에서 바로 다른 서블릿에게 요청하는 방법

포워딩 예제 : sec08

  • redirect 이용한 포워딩
    `protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {`
​
    `// 서버 -> 클라이언트로 setContentType`
    `response.setContentType("text/html;charset=utf-8");`
    `response.sendRedirect("second01");`
    `}`
`}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 서버 -> 클라이언트로 setContentType
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();

out.println("<html><body>");
out.println("sendRedirect를 이용한 redirect 포워딩");
out.println("</body></html>");
}
}
  • refresh 이용한 포워딩
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.addHeader("Refresh","2;url=second02");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 서버 -> 클라이언트로 setContentType
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();

out.println("<html><body>");
out.println("refresh를 이용한 redirect 포워딩");
out.println("</body></html>");
}
}
  • location 이용한 포워딩
// location을 이용한 포워딩
// 자바스크립트의 location 객체 사용 
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();

out.println("<script type='text/javascript'>");
out.println("location.href='second03';");
out.println("</script>");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();

out.println("<html><body>");
out.println("location.href를 이용한 포워딩");
out.println("</body></html>");
}
}
  • 포워딩 하면서 데이터 전달
  • redirect 이용
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.sendRedirect("second04?name=hong");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();

// url 뒤에 붙어서 전송된 데이터 받기 : "second04?name=hong"
String name = request.getParameter("name");

out.println("<html><body>");
out.println("이름 : " + name);
out.println("</body></html>");
}
}
  • dispatch 이용한 포워딩
  • url 안 바뀜 : http://localhost:8080/Servlet01/first05
    • /second05로 이동된 페이지 내용 출력되지만 url은 first05 그대로
    • 클라이언트를 안거쳐 가서!!!
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
RequestDispatcher dispatch = request.getRequestDispatcher("second05?name=lee");
dispatch.forward(request, response);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();

// url 뒤에 붙어서 전송된 데이터 받기 : "second05?name=lee"
String name = request.getParameter("name");

out.println("<html><body>");
out.println("이름 : " + name);
out.println("<br> dispath 이용한 포워딩");
out.println("</body></html>");
}

GET 방식으로 데이터 전달 시 문제

  • 대량의 데이터를 전달할 때 : 길이 제한, 안전성, 불편..
  • 바이딩(binding) 기능 사용
    • 바인딩 방법
      • 포워딩할 때 setAttribute("바인딩이름", 데이터) 메소드 사용해서
      • 바인딩이름과 데이터를 묶어서 설정한 후
      • 포워딩된 문서에서 getAttribute("바인딩이름") 메소드를 이용해서
      • 바이딩된 데이터를 추출해서 사용
  • redirect 방식으로는 서블릿에서 바인딩한 데이터를 다른 서블릿으로 전송할 수 없음
  • dispatch 포워딩 방법일 경우에만 바인딩 가능

바인딩 예제 : sec08 -> 06

  • redirect 방식으로 바인딩 : 바인딩 안 되는 것 보여주는 예제
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");

request.setAttribute("address", "서울시 강남구");
response.sendRedirect("second06");
}
}
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 address = (String)request.getAttribute("address");

out.println("<html><body>");
out.println("주소 : " + address);
out.println("<br> redirect를 이용한 바인딩");
out.println("</body></html>");
}
}

  • dispatch 방식으로 바인딩
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");

request.setAttribute("address", "서울시 강남구");

RequestDispatcher dispatch = request.getRequestDispatcher("second07");
dispatch.forward(request, 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 address = (String)request.getAttribute("address");

out.println("<html><body>");
out.println("주소 : " + address);
out.println("<br> dispatch를 이용한 바인딩");
out.println("</body></html>");
}
​
}

  • 데이터베이스의 회원 정보를 ArrayList 객체에 저장한 후 바인딩
(3) 데이터베이스의 회원 정보를 ArrayList 객체에 저장한 후 바인딩 (setAttribute())
ViewServlet에서 getAttribute() 사용해서 회원 정보 가져와서 출력
sec09
복사
MemberVO 
MemberDAO 
추가
MemberBindingServlet : /memBinding
MemberViewServlet : /memView
  • MemberBindingServlet
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
​
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doProcess(request, response);
}

protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
MemberDAO dao = new MemberDAO();
ArrayList<MemberVO> memList = dao.memberSelect();

request.setAttribute("memList", memList); // 이름, 데이터 

RequestDispatcher dispatch = request.getRequestDispatcher("memView");
dispatch.forward(request, response);
}
​
}
  • MemberViewServlet
protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// (1) 요청 받음
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();

// (2) 비즈니스 로직 처리 : DAO 호출하고 결과 받아옴
List memList = (List) request.getAttribute("memList");
// ArrayList<MemberVO> memList = (ArrayList<MemberVO>) request.getAttribute("memList");


// (3) 응답 처리 : 클라이언트에게 결과 전송
out.print("<html><head></head><body>");
out.print("<table border=1><tr align='center' bgcolor='gold'>");
out.print("<td>아이디</td><td>비밀번호</td><td>이름</td>" 
+ "<td>이메일</td><td>가입일</td><td>삭제</td></tr>");

for(int i=0; i<memList.size(); i++) {
MemberVO vo = (MemberVO) memList.get(i);
String id = vo.getId();
String pwd = vo.getPwd();
String name = vo.getName();
String email = vo.getEmail();
Date joinDate = vo.getJoinDate();

// 한 행씩 출력
out.print("<tr><td>" + id + "</td><td>" +
     pwd + "</td><td>" +
 name + "</td><td>" +
     email + "</td><td>" +
 joinDate + "</td><td>" +
     "<a href='/Servlet01/memberDelete?id=" + id + "'>삭제</a></td></tr>");
 
}

out.print("</table></body></html>");
}

​
}
  • MemberVO, MemberDAO는 가져와서 쓴거!!!

쿠키와 세션

  • 클라이언트와 서버 간에 정보를 교환하는데
  • 클라이언트 PC 또는 서버의 메모리에 저장해 두고 사용하면 프로그램 속도를 향상 시킬 수 있음

HTTP 프로토콜

  • 서버 - 클라이언트 통신 시 stateless 방식으로 통신
  • 브라우저에서 새 웹페이지를 열면 기본의 웹페이지나 서블릿에 관한 어떤 연결 정보도 유지 되지 않음
  • 새로 열린 페이지에서 어떤 정보도 알 수 없음
  • 페이지가 서로 독립적이어서 서로의 상태를 알 수 없음

웹 페이지 사이에 또는 서블릿 간에 상태나 정보를 공유하려면

  • 웹 페이지를 연결시켜 주는 기능이 필요 : 세션 트레킹

웹 페이지를 연결하기 위한 방법

페이지 간에 정보를 교환하거나 데이터를 공유하기 위한 방법
(1) <hidden> 태그 사용
<input type=’hidden’ value=’${id}’> 태그 사용
- 현재 페이지에 데이터를 숨겨놓고
- 연결된 다음 페이지로 데이터를 보내는 방법
- 두 웹페이가 데이터를 공유
- 페이지1에서 <input type=’hidden’ name=’id’ value=’abcd’>로 데이터 숨겨 놓음
- 페이지2에서 request.getParameter()로 받아서 사용할 수 있음
(2) URL Rewriting
- GET 방식으로 전송할 때 데이터가 URL 뒤에 붙어서 다음 페이지로 전송
- second02?name=lee
- 다음 페이지에서 request.getParameter()로 받아서 사용할 수 있음
    - (3) 쿠키
  - 클라이언트 PC의 Cookie 파일에 정보를 저장한 후 웹 페이지 공유
    - (4) 세션 
- 서버 메모리에 정보를 저장한 후 웹 페이지 공유

'hidden'과 URL Rewriting 방식

  • GET 방식으로 전송 : 데이터 노출, 길이 제한, 보안 문제

예제 ( 프로젝트 새로 생성 Servlet02 )

프로젝트 새로 생성 Servlet02
Java Build Path / Classpath에 Servlet-api.jar 추가
패키지 생성 : sec01
hidden 방식
- login-hidden.html
- LoginHiddenServlet : /loginHidden
URL Rewriting
- login.html
- LoginServlet : /login
  • hidden
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 + "<br>";
data += "</body></html>";
out.print(data);
}
}
  • URL Rewriting
// URL Rewriting 방식 이용
user_address = URLEncoder.encode(user_address, "utf-8");
out.print("<br><br><a href='/Servlet02/second?user_id=" + user_id
           + "&user_pw=" + user_pw
           + "&user_address=" + user_address
           + "'>두 번째 서블릿으로 보내기</a>");
data = "</body></html>";
} else {
out.println("로그인 하지 않았습니다. <br><br>");
out.println("다시 로그인 하세요. <br><br>");
out.println("<a href='/Servlet02/login.html'>로그인 창으로 이동</a>");
}
}
​
  • 쿠키
    • 서버 측에서 클라이언트 측에 상태 정보를 저장하고 추출하기 위한 메커니즘
    • 서버에서 생성하여, 클라이언트 측에 저장됨
    • 서버에 요청할 때마다 속성 값을 참조하거나 변경
    • 크기는 4kb 용량
    • 클라이언트에 300개까지 쿠키 저장 가능
    • 하나의 도메인 당 20개의 값만 저장
    • 클라이언트에 저장되므로 보안상의 문제 발생
    • 따라서 민감한 정보는 쿠키 내에 저장하지 않음
    • 쿠키는 사용자가 거부할 수 있으면 256문자 이하의 text 데이터만 저장됨
  • 쿠키 생성 및 저장 과정
    • 서버에서 쿠키 생성
      • Cookie 클래스로부터 쿠키 객체 생성
      • Cookie cookie = new Cookie(이름, 값);
    • 속성 설정
      • setter 사용해서 쿠키 객체의 유효기간 설정
      • cookie.setMaxAge(초단위_유효기간);
    • 클라이언트에 전송되어 저장
      • response 내장 객체의 addCookie() 메소드로 전송
      • response.addCookie(쿠키객체);

 

쿠키 관련 주요 메소드

setMaxAge() : 유효 기간 설정
setValue() : 쿠키 값 설정
sevVersion() : 쿠키 버전 설정
setPath(0 : 쿠키 사용의 유효 디렉터리 설정
​
getMaxAge() : 유효 기간 반환
getName() : 쿠키 이름 반환
getValue() : 쿠키 값 반환
..
쿠키 제거 
cookie.setMaxAge(0) 으로 설정
클라이언트에 전송되어 변경된 값으로 저장
response.addCookie(cookie)

쿠키 유형

  • Persistence 쿠키
    • setMaxAge(양수) 메소드를 사용해서 양수값으로 지정해서 파일로 저장하면 지속해서 남아있음
    • 유효 기간 동안 지속됨
  • Session 쿠키
    • 브라우저가 사용하는 메모리에 생성되는 쿠키로
    • 브라우저가 종료되면 메모리의 Session 쿠키도 자동으로 소멸
    • setMaxAge(음수) : Session 쿠키로 생성

쿠키 예제

sec02
SetCookieValue 서블릿 : /setCookie
GetCookieValue 서블릿 : getCookie
@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 테스트입니다2", "utf-8"));
cookie.setMaxAge(24 * 60 * 60);// 유효기간 설정
response.addCookie(cookie);// 생성한 쿠키를 브라우저로 전송해서 저장
out.print("현재 시간 : " + d);
out.print("<br> Cookie에 저장");
}
}
@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++) {
// 생성된 쿠키 이름 cookieTest가 존재한다면
if(allValues[i].getName().equals("cookieTest")) {
out.println("<h2>Cookie 값 가져오기 : " + URLDecoder.decode(allValues[i].getValue(), "utf-8"));
}
}
}
}

쿠키 이용해서 팝업창 제어

  • 팝업창 제어는 서버에서 쿠키를 다루지 않고
  • 자바스크립트를 이용해서 쿠키에 접근

예제

popUp.html
체크박스 체크하여 쿠키 설정 : 오늘 더 이상 팝업창 띄우지 않기
쿠키이름=값;패스=/;유효기간=값
popUpTest.html
페이지 로드 하면서 쿠키 읽어 옴
설정한 값이 아니면 팝업창 열림
설정한 값이 있으면 유효기간 전에는 팝업창 안 열림
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>팝업창 </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>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<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";

// 쿠키 존재 여부 확인 : 쿠키가 존재하면
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*/,''); // 앞 공백 제거 정규식 (^\s)

// 쿠키 이름이 notShowPop 이면
if(value == "notShowPop"){
result = element[1]; // 쿠키 값 가져오기 ("true") (배열 두 번째 요소)
}
}

    }
return result;
}

// 쿠키 삭제하는 함수 
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는 브라우저로 전송되어 세션 쿠키에 쿠키 이름 jessionID로 저장됨
  • 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분이 적용

세션 예제

sec03
SessionTest 서블릿 : /sess
세션 아이디, 최소 생성 시간, 접근 시간, 유효 시간, isNet() 확인
SessionTest2 서블릿 : /sess2
세션 유효 시간 5초로 설정
SessionTest3 서블릿 : /sess3
invalidate() 호출해서 사용자가 세션을 강제로 삭제
세션 이용해서 로그인/로그아웃 기능
sessionLogin.html
LoginLogout 서블릿 : /logInOut
@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.print("새 세션이 만들어졌습니다");
}
}
}

세션 유효 시간을 5초로 설정

out.println("기본 세션 유효 시간 : " + session.getMaxInactiveInterval() + "<br>");
session.setMaxInactiveInterval(5);// 세션 유효 시간을 5초로 설정 
out.println("세션 유효 시간 : " + session.getMaxInactiveInterval() + "<br>");

invalidate() 호출해서 생성된 세션 객체를 강제로 삭제

if(session.isNew()) {
out.print("새 세션이 만들어졌습니다");
}
session.invalidate(); // 생성된 세션 객체를 강제로 삭제
}
}

세션 이용해서 로그인 / 로그아웃 기능

@WebServlet("/logInOut")
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");
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();
}
}
}
}
@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>");
}
​
}