English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
세션 소개
세션은 특정 기간 동안, 사용자가 동일한 브라우저 프로세스를 통해 웹 애플리케이션과의 상호작용 과정을 의미합니다.
세션(Session)은 일반적으로 사용자 상태를 추적하고, 이 브라우저 프로세스에서 사용자의 정보를 캐시하는 데 사용됩니다.
사용자가 브라우저를 닫으면, 이전 세션은 다시 얻을 수 없습니다(Cookie의 maxAge가-1의 경우). 새로운 브라우저를 열면 새로운 세션이 시작됩니다.
javax.servlet.http.HttpSession. 각 HttpSession은 사용자의 하나의 세션을 대표합니다.
각 세션의 만료 시간은 기본적으로30분.
브라우저가 서버에 첫 번째 방문할 때, 어떤 페이지를 먼저 방문하든, 서버는 사용자에게 독일적인 세션 식별자를 할당하고, 이를 쿠키 형식으로 사용자에게 반환합니다.
다음은 응답 헤더입니다(다음은 Servlet3.0의 경우, Servlet2.5HttpOnly 속성이 없습니다)
서버는 각 사용자에게 세션을 생성합니다. 즉, HttpSession 객체를 서버 측에 저장합니다.
그렇다면, 사용자가 서버에 다시 방문할 때, 서버는 여전히 현재 사용자인지 알아냅니다?
브라우저가 서버에 다시 방문할 때, jsessionid를 포함한 쿠키를 통해 서버에 접근합니다. 서버는 이 id를 기반으로 이 사용자의 HttpSession 객체를 반환하여 세션이 유지됩니다.
그렇다면, 다른 브라우저에서 동일한 세션을 구현할 수 있을까요?
다음은 특징적인 URL입니다. 이 URL은 일정한 속임수를 가지고 있으며, 다른 브라우저에서 동일한 세션을 구현할 수 있습니다:
http://localhost:8080/day07_2/CNCookieServlet;jsessionid=F8692D61CD46D094DBB7A8FC7387649C )
브라우저와 서버의 관계는 다음 두 그림과 같습니다:
HttpSession:
Servlet에서는 HttpServletRequest.getSession 메서드를 호출하여 세션 객체를 얻습니다.
HttpSession 인터페이스의 다음 메서드는 세션 범위에서 공유 데이터를 저장하는 데 사용됩니다:
getAttribute(“name”) setAttribute(“name”,object); getAttributeNames() removeAttrubute(“name”)
Invalidate(); - 이 메서드는 서버 캐시된 세션을 강력하게 제거합니다.
예제:
Servlet에서 HttpSession에 setAttribute를 호출하여 값을 설정합니다.
하이퍼링크나 다른 방식으로 다른 servlet로 이동하고 getAttribute를 통해 정보를 표시합니다.
다른 servlet에서 getAttribute를 호출하여 정보를 표시합니다.
이 브라우저를 닫고 정보를 얻기 위해 servlet에 다시 접근하면 정보가 없게 됩니다.
예를 들어:
String name=request.getParameter("name"); request.setAttribute("name", "request---"+name); request.getSession().setAttribute("name", "session---"+name); getServletContext().setAttribute("name", "application---"+name);
세션의 독특한 식별자 ID:
각 세션은 독특한 식별자, 즉 ID를 가집니다.
브라우저가 새로운 세션을 얻을 때, 사용자는 session.geId()를 통해 ID 값을 출력할 수 있습니다.
브라우저를 닫지 않고 여러 페이지에서 이동할 때, 같은 세션을 사용합니다.
예를 들어:
request.getSession().getId()
안전한 로그아웃이란 무엇인가요:
사용자가 로그아웃할 때, 세션에서 자신의 정보를 제거해야 합니다 - 즉, 안전한 로그아웃입니다.
안전한 로그아웃은 서버에서 남겨둔 정보를 완전히 지우기 위한 것으로, 해킹을 방지합니다
Session.invalidate();
1request.getSession().invalidate();
이렇게 하면 세션 풀에 해당하는 객체를 제거할 수 있습니다
2Session.removeAttribute(…)
예를 들어:
request.getSession().removeAttribute("realCode");
세션 객체에서 속성을 제거하는 데 사용됩니다
URL을 재구성하여 세션을 추적합니다:
이전에 설명한 것처럼, Servlet 컨테이너는 클라이언트에 SessionID를 먼저 저장한 후, 브라우저에서 HTTP 요청을 보낼 때마다 이 SessionID를 포함시킵니다. Servlet 컨테이너는 HTTP 요청에서 이 SessionID를 읽고, 이 SessionID를 기반으로 컨테이너에서 HttpSession 객체를 꺼내어 HTTP 요청이 어느 세션에 속하는지 추적할 수 있도록 합니다. 이 과정은 세션 추적이라고 합니다.
브라우저가 쿠키를 지원한다면, Servlet 컨테이너는 SessionID를 클라이언트의 브라우저에 쿠키로 저장합니다. 하지만 보안을 고려하여 사용자가 쿠키를 비활성화한 경우, Servlet 컨테이너는 어떻게 세션을 추적할 수 있을까요?
먼저 IE에서 쿠키를 비활성화해 보겠습니다(주의: 일부 GHOST 시스템에서는 작동하지 않을 수 있습니다).
IE>툴>인터넷 옵션>개인 정보>고급, 그런 다음 쿠키를 비활성화하십시오:
우리는 메인 페이지에 이러한 링크를 추가할 수 있습니다: (SaveServlet.java GetServlet.java LogoutServlet.java와 관련된 코드는 마지막에 첨부합니다)
<h2>URL 재구성 기술을 보여줍니다---사용자가 쿠키를 비활성화한 후에 우리의 세션이 유효하지 않은 문제를 해결하기/h2> <form action="<%=response.encodeURL("saveServlet") %>" method="post"> 이름:<input type="text" name="name"/><br/> <input type="submit"/> </form> <a href="<%=response.encodeURL("getServlet") %>">URL 재구성-캐시에서 몇 개의 데이터를 읽어들이기/a><br/> <a href="<%=response.encodeURL("logoutServlet") %>">URL 재구성-안전한 로그아웃</a>
이 문장에서 <form action=“<%=response.encodeURL(“/aa”)%>”> 이 기능을 구현할 수 있습니다
이곳에서 쿠키를 비활성화한 후에도, 브라우저는 서버에서 전송된 쿠키를 수신할 수 있습니다. 하지만 브라우저는 수신할 수만 있고 서버로 전송할 수 없습니다. 쿠키를 전송할 수 없다면 session 풀에서 해당 객체를 가져올 수 없습니다.
위의 코드를 양식에 원하는 값을 입력한 후, 아래의 getServlet에 있는 링크로 접속하여 입력한 값을 여전히 표시되는지 확인해 보세요. 답은肯定是입니다. 이 접속 경로는 비슷합니다
http://localhost:8080/day07_2/CNCookieServlet;jsessionid=F8692D61CD46D094DBB7A8FC7387649C 의, 뒤에 따라 jsessionid=F8692D61CD46D094DBB7A8FC7387649C는 그 id입니다. 따라서 다른 브라우저에서도 이 URL을 입력하여 접근할 수 있습니다.
추가로 설명드리겠습니다: (다음은 session 풀에 HttpSession 객체가 session의 JSESSIONID 값과 value 값을 쿠키에 기록하는 경우입니다. 이 쿠키는 시스템이 만든 쿠키를 대체합니다. 나는 존재 시간을 10분으로 설정했습니다. 대체하지 않으면 쿠키는 브라우저를 닫을 때 만료되고 이 현상은 발생하지 않습니다.)
cookie를 비활성화하고 활성화한 두 가지 상황에서 session 풀에 새로운 객체의 id는 다릅니다. 즉, cookie를 비활성화한 상태에서 폼에 name 값을 입력하면 다음과 같은 결과가 나타납니다:
그리고 jsessionid가2BB51EBDEAAF14D19656C71E1B6F9FF6
그런 다음 즉시 cookie를 비활성화하지 않은 모드로 전환하여 다른 이름, 예를 들어 Tom을 입력하고 결과를 검색하면 자연스럽게 두 개의 Tom이 나타나고 jsessionid가
203F9E4DB5D874476B81DAF350661B6A, 비활성화와는 다르게, 이로 인해 다음과 같은 결과가 나타났습니다
그런 다음 이제 브라우저를 닫고 다시 브라우저에 접속하여 cookie를 비활성화하지 않은 모드에서 접근 결과를 확인해 보세요. 다음과 같습니다:
아래에 주요 코드를貼여 보겠습니다:
SaveServlet.java
package cn.hncu.servlets.session; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class SaveServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); request.setCharacterEncoding("utf-8"); String name=request.getParameter("name"); request.setAttribute("name", "request---"+name); request.getSession().setAttribute("name", "session---"+name); getServletContext().setAttribute("name", "application---"+name); //cookie 기술과 session 기술을 결합하여 응용 프로그램을 개발하는 예제---※기능: 브라우저를 닫은 후에도 사용자가10분 내에 본 사이트에 로그인할 수 있으며, 세션의 정보에 접근할 수 있습니다 //클라이언트에 "JSESSIONID" 키를 가진 쿠키를 작성하며, 값으로 sessionid를 설정합니다 Cookie c=new Cookie("JSESSIONID", request.getSession().getId()); c.setMaxAge(60*10);//위의 현상은 이 문장으로 인해 발생하며, 이 문장이 없으면 위의 현상이 발생하지 않았을 것입니다 c.setPath(request.getContextPath()); response.addCookie(c); out.println("저장 성공...); out.flush(); out.close(); } }
GetServlet.java
package cn.hncu.servlets.session; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class GetServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); out.println("<HTML>"); out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); out.println(" <BODY>"); String reqName=(String) request.getAttribute("name"); String seName=(String) request.getSession().getAttribute("name"); String appName=(String) getServletContext().getAttribute("name"); out.println(reqName+"<br/>"); out.println(seName+"<br/>"); out.println(appName+"<br/>"); out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); } }
LogoutServlet.java
package cn.hncu.servlets.session; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LogoutServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); //안전한 탈퇴---session 객체를 무효화하면 됩니다 request.getSession().invalidate(); out.println("안전하게 탈퇴되었습니다..."); } }
위에 설명된 JavaWeb Session 세션 관리는 저가 여러분에게 소개한 것이며, 여러분의 도움이 되길 바랍니다. 어떤 질문이나 의문이 있으면 댓글을 달아 주시면, 저는 즉시 답변 드리겠습니다!
언급된 내용은 인터넷에서 가져왔으며, 저작권은 원저자에게 있으며, 인터넷 사용자가 자발적으로 기여하고 업로드한 내용입니다. 이 사이트는 저작권을 소유하고 있지 않으며, 인공 편집을 하지 않았으며, 관련 법적 책임도 부담하지 않습니다. 저작권 위반이 의심되는 내용이 있으면 메일을 보내 주시기 바랍니다: notice#oldtoolbag.com(메일을 보내면, #을 @으로 변경해 주세요. 신고하고 관련 증거를 제공하시면, 해당 내용이 실제로 위반된 것으로 확인되면, 이 사이트는 즉시 해당 위반 내용을 삭제합니다。)