对于我收到的每个 servlet 请求,我可能会通过 10 个方法,然后我需要检查 session 中的某些内容并且我需要 HttpSession。
我能获得 HttpSession 的唯一方法是从 HttpServletRequest,对吗?
如何跟踪每个 servlet 请求的 session ?不幸的是,我不能简单地创建一个单例(例如,SessionInformation.instance().getAttribute("name")),因为该 session 将用于所有请求。
有没有办法为每个请求全局存储 session ,而不必将它(或它的信息)传递给所有方法,以防万一我需要它?
更新 1:
Alohci 把我推向了正确的方向。我需要的东西可以:
1) 设法仅通过线程全局存储变量。 “单线程”解决方案?
2) 或者 servlet 获得的每个线程/请求是否有唯一的 ID?如果有,是什么?
最佳答案
How do I keep track of the session for each servlet request?
服务器通过在浏览器上保存 session ID 的 cookie 标记用户来识别用户。在服务器上, session 是您放置在客户端/服务器交互期间需要跟踪的数据的位置(以向应用程序提供状态)。
session.setAttribute("name", SerializableObject)
Note: Because App Engine stores session data in the datastore and memcache, all values stored in the session must implement the java.io.Serializable interface.
然后您可以通过执行从 HttpServletRequest 中获取 session
request.getSession()
参见 javadoc:here
在 servlet 中检索 session 后,您可以使用 session.getAttribute("name")
检索您感兴趣的任何数据以跟踪交互。
Is there a way to store the session globally for each request
当唯一具有访问 session 的 ID 是收到带有该 session ID 的请求的 servlet 时,为什么要全局存储它。并非您的应用程序中的所有内容都需要了解每个请求。
下面是一个带有 session ID cookie 的 请求 示例:
GET /something.htm HTTP/1.1
Accept: www/source
Accept: text/html
Cookie: sessid=123456789
您不能全局存储此信息,它对每个请求都是唯一的。
Without having to pass it
当用数据做有用的事情时,不要将 session 传递给你的方法,传递有用的信息,比如用户名、购物车内容等。
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
您的业务逻辑方法甚至不应该知道 session 是什么。它更像是一件人工制品。
关于java - 在我使用它之前,如何跟踪每个 servlet 请求的 session ?单例不会工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2869741/