关于java:如何在Servlet框架中存储HttpSession

How is HttpSession Stored in the Servlet Framework

本问题已经有最佳答案,请猛点这里访问。

这是一个很好的补救问题。我以前没有用过HttpSession课。我正在阅读本教程,我看到会话是HttpServletRequest的一个属性。

1
2
3
4
5
6
public void doGet(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException {

    // get current session, or initialise one if none
    HttpSession sess = req.getSession(true);
}

我的问题是,如何存储会话?在客户身上?在过去,我习惯于存储会话服务器/数据库端。这是怎么工作的?如果我在给定的请求上更新会话,这是否总是通过后续调用反映出来?会话是否存储在客户端上?


使用会话cookie,或者如果禁用cookie,则可以看到指示灯JSESSIONID参数。这至少是不久前的情况,我不应该认为它已经改变了。


how does the session get stored? On the client? In the past I have
been accustomed to storing the session server / database side. How
does this work?

会话可以定义为服务器端存储的信息,这些信息在用户与网站或Web应用程序的整个交互过程中都需要保持。

Is the session stored on the client?

与通过cookie在用户浏览器中存储大量不断变化的信息不同,客户端只存储一个唯一的标识符(称为"会话ID")。每次浏览器发出HTTP请求(即页面链接或Ajax请求)时,都会将此会话ID传递给Web服务器。Web应用程序将此会话ID与其内部数据库配对,并检索存储的变量以供请求的页面使用。

当调用getSession()方法时,它会返回会话(如果存在的话),否则它会创建一个新的会话。除了创建一个会话之外,它还会做5件你不能做的事情。

  • 您不需要自己创建新的httpsession对象。

  • 你不生成唯一的会话ID。
  • 你不做新饼干对象。

  • 您不会将会话ID与cookie关联。
  • 你没有设定响应中的cookie

    1
    All the cookie work happens behind the scenes.

    If I update the session on a given request, will that
    always be reflected through subsequent calls?

    是的,它会影响后续调用。


    httpsession默认存储在内存中,由Web服务器(jetty、tomcat等)创建/维护。根据您使用的Web服务器的不同,您可能可以选择将会话信息存储到数据库中。

    以下是会话管理器的Tomcat文档[1]

    [1]https://tomcat.apache.org/tomcat-7.0-doc/config/manager.html