Java request.getSession()正在获取会话还是正在创建会话?

Java request.getSession()正在获取会话还是正在创建会话?,java,session,servlets,creation,Java,Session,Servlets,Creation,只是我经历过 到目前为止,我的印象是 根据传递给该方法的布尔值,为我提供当前会话(给出,而不是创建)。在这里看起来很酷 现在我读到了 当代码第一次调用request.getSession()或request.getSession(true)时,将创建会话 因此,如果我没有在我的任何一个servlet中调用request.getSession(),而这些servlet是为一些静态html页面服务的(大约50个) 1) 容器和客户端之间不需要会话 2) 如果没有容器如何检测(为html页面提供服

只是我经历过

到目前为止,我的印象是

根据传递给该方法的
布尔值
,为我提供当前会话(给出,而不是创建)。在这里看起来很酷

现在我读到了


当代码第一次调用request.getSession()或request.getSession(true)时,将创建会话

因此,如果我没有在我的任何一个
servlet
中调用
request.getSession()
,而这些servlet是为一些静态html页面服务的(大约50个)

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

2) 如果没有容器如何检测(为html页面提供服务)客户端?除了
会话id

1)标题中的任何隐藏信息,容器和客户端之间是否不需要会话

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

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

---->它是一个URL,您可以将URL映射到html页面,也可以将页面保持为公共访问。在这里,如果请求被命中,tomcat将创建线程,该线程将通过编写请求页面作为响应来服务请求


看看

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

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

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


示例:
telnet
进入一个只返回文本/普通字符串的servlet:输入了bold中的文本(这是HTTP请求)

$telnet localhost 8080
正在尝试127.0.0.1…
已连接到localhost.localdomain。
转义字符为“^]”。
GET/xxx/textplaneservlet/HTTP/1.1
主机:本地主机:8080

HTTP/1.1200正常
服务器:Apache Coyote/1.1
内容类型:文本/纯文本;字符集=ISO-8859-1
内容长度:13
日期:2013年9月6日星期五12:11:10 GMT

你好,世界

在这种情况下不会创建sesion


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

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

HTTP/1.1200正常
服务器:Apache Coyote/1.1
X-Powered-By:JSP/2.2
设置Cookie:JSESSIONID=n0cOaZFUvlXSvX7hNEfcNzHP.undefined;Path=/nk-eapp-ping-60-jpa
内容类型:text/html;字符集=ISO-8859-1
内容长度:49
日期:2013年9月6日星期五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.\u初始化(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\u jsp.\u jsp服务(hello\u jsp.java:45)

这些测试是使用JBoss7运行的


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

你在哪里读过最后一句话?@铍,你说的是哪句话??“会话是在你的代码调用时创建的…”是的,我读过你的问题。只是不清楚这句话是从哪里来的。它来自于@铍是的,从第二句开始。:)