cor*_*ath 2 java session google-app-engine servlets
对于我得到的每个servlet请求,我可能会传递10个方法,然后我需要在会话中检查一些东西并且我需要HttpSession.
我可以获得HttpSession的唯一方法是来自HttpServletRequest,对吗?
如何跟踪每个servlet请求的会话?不幸的是,我不能简单地创建一个单例(例如,SessionInformation.instance().getAttribute("name")),因为该会话将用于所有请求.
有没有办法为每个请求全局存储会话,而不必将所有方法传递给它(或它的信息)以防我需要它?
更新1:
Alohci把我推向了正确的方向.我需要一些可以:
1)管理仅在线程上全局存储变量."单线程每线程"解决方案?
2)或者servlet获取的每个线程/请求是否有唯一的id?如果是这样,什么?
如何跟踪每个servlet请求的会话?
服务器通过在其浏览器上保存会话ID的cookie对其进行标记来识别其用户.在服务器上,会话是您放置在客户端/服务器交互期间需要跟踪的数据的位置(为应用程序提供状态).
session.setAttribute("name", SerializableObject)
Run Code Online (Sandbox Code Playgroud)
注意:由于App Engine将会话数据存储在数据存储区和内存缓存中,因此存储在会话中的所有值都必须实现java.io.Serializable接口.
然后,您可以通过执行来从HttpServletRequest中获取会话
request.getSession()
Run Code Online (Sandbox Code Playgroud)
看到javadoc:这里
在servlet中检索会话后,您将使用session.getAttribute("name")检索您感兴趣的任何数据来跟踪交互.
有没有办法为每个请求全局存储会话
为什么只有具有访问会话ID的servlet才能获得该会话ID附带的请求的全局存储.并非应用程序中的所有内容都需要了解每个请求.
以下是会话ID cookie附带的请求示例:
GET /something.htm HTTP/1.1
Accept: www/source
Accept: text/html
Cookie: sessid=123456789
Run Code Online (Sandbox Code Playgroud)
您无法全局存储此信息,它对每个请求都是唯一的.
无需通过它
在对数据做有用的事情时,不要将会话传递给您的方法,传递有用的信息,如用户名,购物车内容等.
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
Run Code Online (Sandbox Code Playgroud)
您的业务逻辑方法甚至不应该知道会话是什么.它更像是一件人工制品.