0

刚经过,

在什么条件下创建 JSESSIONID?

到现在我的印象是,

request.getSession()

基于传递给该方法的当前会话(给予,而不是创建boolean) 。直到这里看起来很酷。

现在我读到了

Session 是在您的代码第一次调用 request.getSession() 或 request.getSession(true) 时创建的。

所以,如果我没有调用 request.getSession() 我的任何一个servlets,并且这些 servlet 用于提供一些静态 html 页面(大约 50 个),

session1)容器和客户端之间不需要a吗?

2)如果没有,容器如何检测(服务于 html 页面)客户端?除 ? 之外的标题中的任何隐藏信息session id

4

2 回答 2

1

AHttpSession并不总是必需的。如果 servlet 是“无状态的”,并且来自 HTTP 请求的信息足以满足请求,情况就是如此。

因此HttpSession,如果您有不调用的 servlet,则不会创建a request.getSession()

一般来说HttpSession,如果 servlet 必须检测多个请求是否来自同一个客户端,则它是必需的。例如在会话属性中管理会话状态(如购物车等)。


示例:telnet进入仅返回文本/纯字符串的 servlet:已输入粗体文本(即 HTTP 请求)

$ telnet localhost 8080
Trying 127.0.0.1...
连接到 localhost.localdomain。
转义字符是 '^]'。
GET /xxx/textplainservlet/ HTTP/1.1
主机:localhost:8080

HTTP/1.1 200 OK
服务器:Apache-Coyote/1.1
内容类型:text/plain;charset=ISO-8859-1
内容长度:13
日期:2013 年 9 月 6 日星期五 12:11:10 GMT

你好世界

在这种情况下不会创建会话。


示例:一个简单的 JSP,它只返回静态 HTML 内容:

GET /xxx/hello.jsp HTTP/1.1
主机:localhost:8080

HTTP/1.1 200 OK
服务器:Apache-Coyote/1.1
X-Powered-By:JSP/2.2
Set-Cookie:JSESSIONID=n0cOaZFUvlXSvX7hNEfcNzHP.undefined;Path=/nk-eapp-ping-60-jpa
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 49
Date: Fri, 06 Sep 2013 12:11:58 GMT

[... HTML 文档 ...]

在这种情况下,会创建一个会话并设置cookie,即使 JSP 没有request.getSession()显式调用!

因此,我附上了一个HttpSessionListener,实际上,一个会话是隐式创建的。在那个监听器中,我转储了一个堆栈跟踪:

org.apache.catalina.session.StandardSession.tellNew(StandardSession.java:374)
org.apache.catalina.session.StandardSession.setId(StandardSession.java:344)
org.apache.catalina.session.ManagerBase.createSession(ManagerBase. java:506)
org.apache.catalina.session.StandardManager.createSession(StandardManager.java:297)
org.apache.catalina.connector.Request.doGetSession(Request.java:2665)
org.apache.catalina.connector.Request。 getSession(Request.java:2375)
org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:841)
org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:852)
org.apache.jasper。 runtime.PageContextImpl._initialize(PageContextImpl.java:146)
org.apache.jasper.runtime.PageContextImpl.initialize(PageContextImpl.java:124)
org.apache.jasper.runtime.JspFactoryImpl.internalGetPageContext(JspFactoryImpl.java:106)
org.apache.jasper.runtime.JspFactoryImpl.getPageContext(JspFactoryImpl. java:62)
org.apache.jsp.hello_jsp._jspService(hello_jsp.java:45)

这些测试是使用 JBoss 7 运行的。


要检查是否创建了会话,只需在您的环境中使用以下命令重新测试它HttpSessionListener

@WebListener
public class MyHttpSessionListener implements HttpSessionListener {
    private final static Logger log = Logger
            .getLogger(MyHttpSessionListener.class.getName());

    public void sessionCreated(HttpSessionEvent e) {
        // Possibly create a stack trace here, and dump it
        log.info("Session created: " + e.getSession().getId() + ", timeout "
                + e.getSession().getMaxInactiveInterval());
    }

    public void sessionDestroyed(HttpSessionEvent e) {
        log.info("Session destroyed: " + e.getSession().getId());
    }
}
于 2013-09-06T12:48:12.660 回答
0

1)容器和客户端之间不需要会话吗?

---> 如果只是html页面,则不需要,例如JavaDocs html页面,您不需要创建会话。

2)如果没有,容器如何检测(服务于 html 页面)客户端?除了会话 ID 之外的标题中的任何隐藏信息?

----> 它是 URL,您将 url 映射到 html 页面,或者您只是将您的页面保留为公共访问。在这里,如果请求被命中,tomcat 将创建线程,该线程将通过写入请求页面来响应请求。

查看HTTP 请求标头

于 2013-09-06T06:42:39.833 回答