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());
}
}