代码之家  ›  专栏  ›  技术社区  ›  corgrath

在使用之前,如何跟踪每个servlet请求的会话?单身汉不行?

  •  2
  • corgrath  · 技术社区  · 16 年前

    对于我得到的每个servlet请求,在我需要在会话中检查某些内容并且需要httpsession之前,我可能会通过10个方法。

    我获得httpsession的唯一方法是从httpservletrequest,对吗?

    如何跟踪每个servlet请求的会话?不幸的是,我不能简单地创建一个singleton(例如,sessionInformation.instance().getattribute(“name”),因为该会话随后将用于所有请求。

    是否有一种方法可以为每个请求全局存储会话,而不必在我需要时将其(或其信息)传递给所有方法?

    更新1:

    阿洛西把我推向了正确的方向。我需要一些可以:

    1)只能在线程上全局存储变量。“单线程”解决方案?

    2)或者servlet获取的每个线程/请求是否有唯一的ID?如果是这样,什么?

    3 回复  |  直到 16 年前
        1
  •  6
  •   bakkal    16 年前

    如何跟踪会议 每个servlet请求?

    服务器通过在浏览器上保存会话ID的cookie来标识用户。在服务器上,会话是放置在客户机/服务器交互期间需要跟踪的数据的地方(为应用程序提供状态)。

    session.setAttribute("name", SerializableObject)
    

    注: 由于应用引擎将会话数据存储在数据存储和memcache中,因此会话中存储的所有值都必须实现java.io.serializable接口。

    然后,您可以通过执行以下操作从httpservletrequest中获取会话:

    request.getSession()
    

    见JavaDoc: here

    在检索servlet中的会话后,使用 session.getAttribute("name") 检索您感兴趣的任何数据以跟踪交互。

    有没有一种方法可以为每个请求全局存储会话

    为什么要全局存储它,因为只有一个ID可以访问会话的servlet获得了与会话ID一起提供的请求。不是应用程序中的所有内容都需要了解每个请求。

    下面是一个例子 请求 它附带了会话ID cookie:

    GET /something.htm HTTP/1.1     
    Accept: www/source     
    Accept: text/html     
    Cookie: sessid=123456789
    

    您不能全局存储此信息,它对于每个请求都是唯一的。

    不必通过

    当对数据进行有用的操作时,不要将会话传递给您的方法,传递有用的信息,如用户名、购物车内容等。

    HttpSession session = request.getSession() //inside a servlet
    String userName = session.getAttribute("name");
    List<ShoppingItems> items= session.getAttribute("cart");
    
    MakeTheUserPay(userName, items) //no session passing here
    

    您的业务逻辑方法甚至不应该知道会话是什么。它更像是一件艺术品。

        2
  •  2
  •   Alohci    16 年前

    我想你想要的是 java.lang.ThreadLocal 变量。

        3
  •  1
  •   Vineet Reynolds    16 年前

    我想你需要用 Context object 在表示层和业务层之间传递状态(我假设存在一个状态)。

    Context对象使您能够封装状态并跨层传递它,而不必担心状态本身是如何维护的。如果您需要在这方面获得更多信息,可以参考核心J2EE模式书中的上下文对象设计模式。