gpt4 book ai didi

java - request.getSession() 是获取 session 还是创建 session ?

转载 作者:行者123 更新时间:2023-12-01 14:09:22 25 4
gpt4 key购买 nike

刚刚我经历过,

Under what conditions is a JSESSIONID created?

到目前为止,我的印象是,

request.getSession()

根据传递给该方法的 boolean 值为我提供当前 session (给予,而不是创建)。到目前为止看起来很酷。

现在我读到了

Session is created when your code calls request.getSession() or request.getSession(true) for the first time.

所以,如果我不在我的任何 servlet 中调用 request.getSession(),并且这些 servlet 是为了提供一些静态 html 页面(大约 50 ),

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

2)如果没有,容器如何检测(提供 html 页面)客户端?除了 session ID 之外的 header 中是否有任何隐藏信息?

最佳答案

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

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

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

<小时/>

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

$ telnet localhost 8080
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
GET /xxx/textplainservlet/ HTTP/1.1
Host: localhost:8080

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/plain;charset=ISO-8859-1
Content-Length: 13
Date: Fri, 06 Sep 2013 12:11:10 GMT

Hello, world

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

<小时/>

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

GET /xxx/hello.jsp HTTP/1.1
Host: localhost:8080

HTTP/1.1 200 OK
Server: 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

[... a HTML document ...]

在这种情况下,即使 JSP 没有调用 request.getSession(),也会创建一个 session ,并设置 cookie> 明确!

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

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 运行。

<小时/>

要检查 session 是否已创建,只需使用 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());
}
}

关于java - request.getSession() 是获取 session 还是创建 session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18651278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com