이 기사는 주로 서블릿 세션의 작동 원리를 소개합니다. 편집자는 이것이 꽤 좋다고 생각합니다. 이제 이를 여러분과 공유하고 참고용으로 제공하겠습니다. 편집자를 따라가서 살펴보겠습니다
Session의 기본 작동 원리를 이해해 보세요. 먼저 동일한 브라우저가 세션 중에 여러 웹 리소스에 액세스하는 상황을 살펴보겠습니다. 대략 다음 단계로 나눌 수 있습니다.
1. 이때 브라우저는 서버가 원하는 경우 특정 서블릿에 액세스합니다. 요청 개체에서 세션 개체(첫 번째 획득도 생성됨)를 사용하면 서버는 이 세션 개체에 대한 ID를 생성합니다: JSESSIONID
2. 동시에 브라우저에 응답하는 동안 이 세션은 id JSESSIONID 쿠키 형태로 클라이언트 브라우저에 다시 전송됩니다. 이때 쿠키 서버에는 유효한 시간이 설정되어 있지 않으므로 하드 디스크 파일이 아닌 브라우저의 캐시에 저장됩니다.
3. 이 세션 동안 사용자가 계속해서 다른 서블릿에 액세스하면 서블릿은 요청 객체에서 Session 객체를 얻습니다. 이때 Session 객체를 얻는 것은 JSESSIONID라는 파일이 있는지 쿼리하는 것입니다. 이 Cookie가 있으면 이 Session을 다시 생성할 필요가 없고, 서버에서 동일한 JSESSIONID 값으로 Session을 직접 쿼리할 수 있습니다. 얻을 수 있습니다.
요약하자면 세션은 쿠키를 기반으로 합니다.
(참고: 쿠키는 전능하지 않습니다. 세션은 먼저 쿠키에 의존하지만 때로는 쿠키를 사용할 수 없는 경우가 있습니다. 이 때 세션은 요청에서 보낸 URL 주소에 JSESSIONID가 있는지 확인합니다.)
세션의 숨겨진 쿠키, 간단한 실험을 통해 웹 프로젝트 [myservlet] 아래에 각각 SessionDemo1 및 SessionDemo2라는 두 개의 서블릿을 생성할 수 있습니다.
SessionDemo1의 코드:
HttpSession session = request.getSession(); String data = "Message from SessionDemo"; session.setAttribute("data", data);
SessionDemo2의 코드:
HttpSession session = request.getSession(); System.out.println((String)session.getAttribute("data"));
SessionDemo1에 액세스하기 위해 브라우저에서 HttpWatch를 엽니다. Servlet에 처음 액세스하는 것이므로 브라우저에 대한 SessionDemo1의 응답을 확인합니다.
실제로 서버는 브라우저에는 이 JSESSIONID 이름 쿠키가 있습니다. 열려 있는 브라우저에서 다시 SessionDemo2에 액세스하면 HttpWatch에서 요청 패킷의 내용을 관찰하고 다음을 찾습니다.
서버에 다시 액세스하면 브라우저는 JSESSIONID라는 이름을 가져옵니다. 쿠키는 서버에 제공되며, 서버는 쿠키에 포함된 JSESSIONID 값을 이용하여 브라우저에 대해 이전에 생성된 Session을 서버에서 찾아냅니다.
브라우저를 닫으면 이 쿠키에는 "setMaxAge"가 설정되어 있지 않으므로 이 쿠키는 브라우저의 버퍼에만 존재하며 브라우저를 닫으면 삭제됩니다. 브라우저를 닫은 후에도 세션이 계속 존재하도록 하려면 세션 쿠키를 수동으로 덮어쓰고 재정의 쿠키의 유효 시간과 유효 경로를 설정해야 합니다. 이 쿠키의 값인 JSESSIONID 값은 Session의 getId() 메소드를 통해 얻을 수 있습니다.
1, 적용 유효 시간:
참고로, 서버가 브라우저에 대한 Session을 생성한 후 사용자가 이를 실행하지 않으면(또는 브라우저를 닫은 후에도 기본적으로 30분 동안 유지됩니다.) ). 이는 Tomcat의 [web.
물론, 모든 서버에서 세션의 소멸 시간을 전체적으로 설정하지 않으려면 web.xml 파일에 2154b31975826eec7c9ecbf8f296fb33 및 ac238ff21ee5e16243d046a43ee626d2을 추가하여 설정을 사용자 정의할 수 있습니다. 각 웹 애플리케이션.
참고: 세션 개체의 무효화() 메서드를 통해 세션을 즉시 삭제할 수도 있습니다.
이와 관련하여 세션 쿠키를 덮어써서 하드 디스크 파일에 저장하려면 우리가 설정한 쿠키 유효 시간이 서버의 기본 세션 시간 초과 시간을 초과해서는 안 됩니다.
2, 유효 경로 포함:
서블릿에 처음 액세스했을 때 브라우저용 서버가 생성한 세션에서 쿠키의 유효 경로를 살펴보겠습니다.
可以看到这个服务器默认将JSESSIONID这个cookie的有效路径设置为创建这个Session的web工程根目录。所以我们要覆盖Session中的cookie时也应该设置路径为该web工程根目录。
好,接下来对上面那个Servlet的例子进行改造,我们只需要在SessionDemo1中修改就行,因为这个首次将Session的cookie返回给客户端,修改后代码如下:
HttpSession session = request.getSession(); String data = "Message from SessionDemo"; session.setAttribute("data", data); Cookie cookie = new Cookie("JSESSIONID", session.getId()); cookie.setMaxAge(30*60); cookie.setPath("/myservlet"); response.addCookie(cookie);
这样,当我们打开浏览器访问了SessionDemo1之后,就能在存放cookie的目录中找到该cookie,如果我们通过HttpWatch来查看可以看到重名的这个cookie:
虽然JSEESIONID这个cookie重名了,没有关系,因为其值都是一样的,并且如果我们将浏览器关闭后,没有设置cookie有效时间的(也是原先Session发来的)cookie将不复存在(存在浏览器缓存中,浏览器关闭就被销毁),这时重新打开一个浏览器,再去访问SessionDemo2依然能获取到原来Session中保存的内容:
注意,这是另外打开浏览器窗口访问的SessionDemo2!!另附:
通过这里我们可以看到,我们人为地将原先Session定义的cookie给替换了,而Session并不知道,只要能获得“JSESSIONID”这个cookie,它就认为cookie是存在的,可以从这个cookie中id值获取以前保存的信息,因此我们实现了一台主机共享一个Session,此时,当浏览器关闭,或者说结束一个会话后,依然能获取Session来获取之前保存的数据。
위 내용은 세션 작동 원리에 대한 Java 서블릿 그래픽 코드에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!