request.getSession()正在获取会话或创建会话?

时间:2013-09-06 06:27:34

标签: java session servlets creation

我刚经历过,

Under what conditions is a JSESSIONID created?

直到现在我的印象是,

request.getSession()

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

现在我读了

  

当您的代码首次调用request.getSession()或request.getSession(true)时创建会话。

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

1)容器和客户端之间不需要session id吗?

2)如果没有容器检测(服务html页面)客户端?除{{1}}以外的标题中的任何隐藏信息?

2 个答案:

答案 0 :(得分:1)

并不总是需要HttpSession。如果servlet是“无状态的”,那么就是这种情况,来自HTTP请求的信息足以满足请求。

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

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


示例:telnet进入只返回text / plain字符串的servlet:输入粗体中的文本(即HTTP请求)

  

$ telnet localhost 8080
  尝试127.0.0.1 ...
  连接到localhost.localdomain   逃脱角色是'^]'    GET / xxx / textplainservlet / HTTP / 1.1
  主持人:localhost:8080

     

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

     

你好,世界

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


示例:一个简单的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;路径= / NK-EAPP平-60-JPA
  内容类型:text / html; charset = ISO-8859-1
  内容长度:49
  日期:2013年9月6日星期五12:11:58 GMT

     

[...... HTML文档...]

在这种情况下,即使JSP没有明确调用request.getSession(),也会设置会话,并设置 cookie

因此我附加了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());
    }
}

答案 1 :(得分:0)

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

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

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

---->它是URL,您可以使用html页面映射网址,或者只是保持您的网页具有公共访问权限。在这里,如果请求被命中,tomcat将创建线程,它将通过写入请求页面来响应请求。

查看HTTP Request header