세션 세션 소개
세션은 동일한 브라우저 프로세스를 사용하는 사용자와 일정 기간 동안 웹 응용 프로그램 간의 상호 작용 프로세스를 나타냅니다.
세션은 일반적으로 사용자의 상태를 추적 하고이 브라우저 프로세스에서 사용자의 정보를 캐시하는 데 사용됩니다.
사용자가 브라우저를 닫으면 이전 세션을 다시 얻을 수 없습니다 (쿠키의 최대가 -1 인 경우). 새 브라우저를 다시 열면 새 세션이 시작됩니다.
클래스 javax.servlet.http.httpsession. 각 httpsession은 사용자의 세션을 나타냅니다.
각 세션의 만료 시간은 기본적으로 30 분입니다.
브라우저가 서버에 먼저 액세스하면 먼저 방문하든 서버는 사용자에게 고유 한 세션 식별자를 할당 한 다음 쿠키 형태로 사용자에게 반환합니다.
다음 그림은 응답 헤더입니다 (다음 그림은 Servlet 3.0을 기반으로하며 Servlet 2.5에는 httponly 속성이 없습니다).
서버는 각 사용자에 대한 세션, 즉 httpsession 객체에 대한 세션을 생성하고 서버 측에 저장합니다.
따라서 사용자가 서버에 다시 액세스 할 때 서버는 어떻게 또는 현재 사용자를 알고 있습니까?
브라우저가 서버에 다시 액세스하면 서버에 액세스하기 위해 jssessionid가 포함 된 쿠키가 장착됩니다. 서버는이 ID를 기반 으로이 사용자의 httpsession 객체를 반환하고 세션을 유지합니다.
(그렇다면 다른 브라우저에서 동일한 세션을 구현할 수 있습니까?
다음은 특정 스푸핑 효과가 있으며 다른 브라우저에서 동일한 세션을 구현할 수있는 일반적인 URL입니다.
http : // localhost : 8080/day07_2/cncookieservlet; jsessionid = f8692d61cd46d094dbb7a8fc7387649c)
브라우저와 서버의 관계는 다음과 같습니다.
httpsession :
서블릿에서 세션 객체는 httpservletrequest.getsession 메소드를 통해 얻습니다.
HTTPSESSION 인터페이스의 다음 방법은 데이터를 세션 전체에 공유하는 데 사용됩니다.
getAttribute ( "name") setAttribute ( "name", object); getAttributeNames () removeAttribute ( "name")
무효화 (); -이 메소드는 서버 캐시 된 세션을 강력하게 삭제합니다.
예:
서블릿의 httpsession에서 설정.
HyperConnect를 통해 다른 서블릿으로 이동하거나 다른 방법으로 GetAttribute를 통해 정보를 표시하십시오.
모든 서블릿에서 GetAttribute에 전화하여 정보를 표시하십시오.
이 브라우저를 닫고 정보를 얻는 서블릿을 다시 방문하면 더 이상 정보가 없다는 것을 알게됩니다.
다음과 같이 :
문자열 이름 = request.getParameter ( "name"); request.setAttribute ( "name", "request ---"+name); request.getSession (). setAttribute ( "name", "session ---"+name); getServletContext (). setAttribute ( "name", "application ---"+name);
세션의 고유 식별자 :
각 세션에는 고유 식별자, 즉 ID가 있습니다.
브라우저가 새 세션을 얻으면 Session.geid ()를 통해 ID 값을 인쇄 할 수 있습니다.
브라우저를 닫지 않고 동일한 세션을 사용하여 여러 페이지에서 점프하십시오.
좋다:
request.getSession (). getId ()
안전한 출구는 무엇입니까 :
사용자가 종료하면 세션에서 정보를 지우려면 안전하게 종료해야합니다.
Secure Exit은 서버에 남겨둔 정보를 해킹하지 않도록하는 것입니다.
session.invalidate ();
1. request.getSession (). invalidate ();
이를 통해 세션 풀의 해당 객체를 삭제할 수 있습니다.
2. 세션 .removeattribute (…)
좋다:
request.getSession (). removeAttribute ( "RealCode");
세션 객체에서 속성을 삭제하는 데 사용됩니다
URL을 다시 작성하여 세션을 추적합니다.
앞에서 언급했듯이 서블릿 컨테이너는 먼저 클라이언트에 세션을 저장합니다. 나중에 브라우저가 HTTP 요청을 발행하면이 SessionID를 포함합니다. Servlet 컨테이너는 HTTP 요청에서 SessionID를 읽고이 SessionID를 기반으로 컨테이너에서 HTTPSESSION 객체를 가져와 HTTP 요청이 속한 세션을 추적 할 수 있습니다. 이 프로세스를 세션 추적이라고합니다.
브라우저가 쿠키를 지원하는 경우 서블릿 컨테이너는 SessionID를 브라우저 클라이언트의 쿠키로 저장합니다. 그러나 사용자가 보안상의 이유로 쿠키를 비활성화하면 서블릿 컨테이너가 어떻게 세션을 추적 할 수 있습니까?
먼저 IE에서 쿠키를 비활성화합시다 (참고 : 일부 유령 시스템에는 효과가 없습니다).
IE> 도구> 인터넷 옵션> 개인 정보 보호> 고급 후 쿠키를 비활성화합니다.
홈페이지에 이러한 하이퍼 링크를 추가 할 수 있습니다.
<h2>Demonstrate the rewrite url technology----Cracking the problem that our session is invalid after the user disables cookies</h2> <form action="<%=response.encodeURL("saveServlet") %>" method="post"> name:<input type="text" name="name"/><br/> <input type="submit"/> </form> <a href = "< %= response.encodeurl ("getservlet ") %>"> 여러 컨테이너에 URL 읽기 데이터를 다시 작성 </a> <br/> <a href = "< %= response.encodeurl ("logoutservlet ") %>"> url-safe exit </a>이 문장 <form action = "<%= response.encodeurl ("/aa ")%>">이 함수를 실현할 수 있습니다
여기서 쿠키를 비활성화 한 후 브라우저는 서버에서 전송 된 쿠키를받을 수 있지만 브라우저는이를 수락하여 서버로 보낼 수 없습니다. 쿠키를 보낼 수없는 경우 해당 객체를 얻기 위해 세션 풀로 이동할 수 없습니다.
양식에서 원하는 값을 입력 한 후 아래 GetServlet의 하이퍼 링크로 이동하여 입력 값이 여전히 표시 될 수 있는지 확인하십시오. 대답은 예입니다. 여기의 액세스 경로는 비슷합니다
http : // localhost : 8080/day07_2/cncookieservlet; jsessionid = f8692d61cd46d094dbb7a8fc7387649c, jsessionid = f8692d61cd46d094db7a8fc7387649c 뒤 IT ITS. 이러한 방식으로 다른 브라우저 에이 URL을 입력하여 액세스 할 수 있습니다.
(다음 상황은 세션 풀에 httpsession 객체를 쓸 때 해당 세션의 jssessionid 값과 해당 세션의 값을 쿠키에 쓸 때,이 쿠키는 시스템에 의해 생성 된 것과 동등한 시간을 직접 작성하는 것과 동등한 시간을 덮어 쓰지 않으면 쿠키가 죽지 않을 때 쿠키가 죽지 않을 것입니다.
두 경우 쿠키가 비활성화되었는지 여부에 관계없이 세션 풀에서 새로 생성 된 객체의 ID는 다릅니다. 즉, 쿠키가 비활성화 된 경우 양식에 이름 값을 입력하면 쿼리 결과는 다음과 같습니다.
및 JSSESSIONID는 2BB51EBDEAAF14D19656C71E1B6F9FF6입니다
그런 다음 쿠키 모드를 비활성화하지 않고 즉시 변경하고 Tom과 같은 다른 이름을 입력하면 쿼리 결과는 자연스럽게 두 Tom이며 JSSessionID는 다음과 같습니다.
203F9E4DB5D874476B81DAF350661B6A는 비활성화와 다르기 때문에 다음 결과가 나타납니다.
그런 다음 브라우저를 닫고 브라우저를 다시 입력 한 다음 다음과 같이 쿠키 모드를 비활성화하지 않고 액세스 결과를 봅니다.
아래에 메인 코드를 게시하겠습니다.
SaveServlet.java
패키지 cn.hncu.servlets.session; import java.io.ioexception; import java.io.printwriter; javax.servlet.servletexception import; javax.servlet.http.cookie import; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; 공개 클래스 saveservlet는 httpservlet {public void doget (httpservletrequest 요청, httpservletreponse 응답)을 servletexception, ioexception {dopost (요청, 응답); } public void dopost (httpservletRequest 요청, httpservletResponse 응답) servletexception, ioexception {response.setContentType ( "text/html; charset = utf-8"); printwriter out = response.getwriter (); request.setcharacterencoding ( "UTF-8"); 문자열 이름 = request.getParameter ( "name"); request.setAttribute ( "name", "request ---"+name); request.getSession (). setAttribute ( "name", "session ---"+name); getServletContext (). setAttribute ( "name", "application ---"+name); // 응용 프로그램의 쿠키 기술과 세션 기술 결합의 예 -※ 함수 : 브라우저를 닫은 후, 사용자가 10 분 이내에이 사이트에 로그인 할 수 있다면 세션에서 정보에 액세스 할 수 있습니다. 쿠키 C = 새 쿠키 ( "jsessionId", request.getSession (). getId ()); c.setMaxage (60*10); // 위의 현상은이 문장으로 인해 발생합니다. 이 문장이 없으면 위에서 언급 한 C.SetPath (request.getContextPath ())와 같은 현상이 없습니다. 응답 .addcookie (c); out.println ( "성공적으로 저장 ..."); out.flush (); out.close (); }}getservlet.java
패키지 cn.hncu.servlets.session; import java.io.ioexception; import java.io.printwriter; javax.servlet.servletexception import; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; 공개 클래스 GetServlet는 httpservlet {public void doget (httpservletrequest request, httpservletreponse response)를 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>"); 문자열 reqname = (string) request.getAttribute ( "name"); 문자열 sename = (string) request.getSession (). getAttribute ( "name"); 문자열 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
패키지 cn.hncu.servlets.session; import java.io.ioexception; import java.io.printwriter; javax.servlet.servletexception import; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; Public Class LogoutServlet은 httpservlet {public void doget (httpservletrequest 요청, httpservletreponse responsk)을 rows servletexception, ioexception {response.setContentType ( "text/html; charset = utf-8"); printwriter out = response.getwriter (); // SAFE EXIT --- 세션 객체가 유효하지 않은 한 request.getSession (). invalidate (); out.println ( "안전한 출구 ..."); }}위는 편집자가 귀하에게 소개 한 Javaweb 세션 관리입니다. 나는 그것이 당신에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨주세요. 편집자는 제 시간에 당신에게 답장 할 것입니다!