在我使用它之前,如何跟踪每个servlet请求的会话?单身人士不会工作?

时间:2010-05-19 21:55:56

标签: java google-app-engine session servlets

对于我得到的每个servlet请求,我可能会传递10个方法,然后我需要检查会话中的某些内容并且我需要HttpSession。

我能获得HttpSession的唯一方法是来自HttpServletRequest,对吗?

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

有没有办法为每个请求全局存储会话,而不必在所有方法中传递它(或它的信息),以防我需要它?

更新1:

Alohci把我推向了正确的方向。我需要的东西可以:

1)管理以仅在线程上全局存储变量。 “单线程每线程”解决方案?

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

3 个答案:

答案 0 :(得分:6)

  

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

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

session.setAttribute("name", SerializableObject)
  

注意:由于App Engine将会话数据存储在数据存储区和内存缓存中,因此存储在会话中的所有值都必须实现java.io.Serializable接口。

然后,您可以通过执行

从HttpServletRequest中获取会话
request.getSession()

请参阅javadoc:here

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

  

是否有办法为每个请求全局存储会话

为什么在具有访问会话的ID的唯一东西是获得该会话ID附带的请求的servlet时,全局存储它。并非应用程序中的所有内容都需要了解每个请求。

以下是会话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

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

答案 1 :(得分:2)

我认为你想要的是一个java.lang.ThreadLocal变量。

答案 2 :(得分:1)

我认为您需要使用Context object在表示层和业务层之间传递状态(我假设存在层)。

Context对象使您能够封装状态并将其传递到层之间,而不必担心状态本身是如何维护的。如果需要在此区域中获取更多信息,可以参考Core J2EE Patterns一书中的Context Object设计模式。