ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백엔드 (3) - 서블릿 포워드, 쿠키와 세션
    백엔드 프로그래밍 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>");
    }
    ​
    }

     

    댓글

Designed by Tistory.