我刚经历过,
Under what conditions is a JSESSIONID created?
直到现在我的印象是,
根据传递给该方法的boolean
给我当前的会话(给予,而不是创建)。看起来很酷,直到这里。
现在我读了
当您的代码首次调用request.getSession()或request.getSession(true)时创建会话。
所以,如果我没有在request.getSession()
的任何servlets
中调用session
,那么这些servlet将用于提供一些静态html页面(大约50个),
1)容器和客户端之间不需要session id
吗?
2)如果没有容器检测(服务html页面)客户端?除{{1}}以外的标题中的任何隐藏信息?
答案 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:8080HTTP / 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:8080HTTP / 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将创建线程,它将通过写入请求页面来响应请求。