Java : How to deal with multiple sessions in the servlet
我是JavaEE的新手。我有一个需要用户登录的站点,用户登录后,我希望用户看到自己的项目(例如:购物车)。
这意味着我必须使用一个会话来完成这一点。但是我该如何处理多个会话呢?
例如,多个用户登录到系统以及同一个servlet?但是,我可以在一个servlet中保留多个会话吗?我要把他们每个人都记录下来吗?它是如何工作的?
有人能举个例子吗?
- 会话保存在服务器上,而不是servlet上
- 这是怎么回事?你能简单解释一下吗
- 为了更好地指导这个问题,俾路支有一个非常好的答案。请参阅此问题stackoverflow.com/q/3106452/1065197
- 此外,对于这些问题,您可以在StackOverflow wiki中进行一些研究,并在此处查看一些问题。对Java SE、Java EE和其他技术/框架几乎所有基本概念都有很好的答案。
在servlet中,您可以访问HttpServletRequest,它为您提供了getSession()方法。这个方法返回会话对象(本质上是一个键值映射),对于每个用户来说是不同的。
如果您将某个东西放入该映射(如购物车),您可以稍后检索它——但仅当同一个用户再次访问该应用程序时(不一定是同一个servlet)。
1 2 3 4 5 6 7
| public void doGet (HttpServletRequest request, HttpServletResponse response )
throws IOException, ServletException {
HttpSession session = request. getSession();
session. getAttribute("cart");
//...
session. setAttribute("cart", whateverYouWant ); |
会话在servlet容器中维护,并按会话ID(通常是cookie)查找。你不必自己实现任何东西。
- 如何确定和知道请求是否来自同一用户?通过检查会话ID?还是用户定义的属性?
- 我认为操作问题更多的是关于多个会话。可能来自不同的浏览器。如果它来自同一个浏览器并且启用了cookie,那么这是有意义的。
- @用户1389813只要会话没有被破坏(session.destroy()或用户关闭浏览器或会话超时),servlet容器将为您处理此问题。
- @用户1389813:这就是servlet的优点:只需在会话中放入一些内容,并在同一个用户进入您的应用程序时(只要会话没有超时)将其读回即可。如果其他用户试图阅读会话,他会得到他的副本。每个用户都有自己的会话,由JSessionID cookie(通常)透明地标识。
- 好的,2个问题:(1)如果我有多个选项卡(同一个浏览器)浏览同一个站点,并且其中一个已经登录,那么这个机制是否有效?(2)是否可以伪造会话ID?我的意思是,它是否安全,不被重复使用和从cookie复制?
- @用户1389813:是的,它可以跨选项卡工作,但不一定跨不同的浏览器窗口工作(当然,不同的浏览器会有不同的会话)。有几种针对会话cookie的攻击以及几种缓解它们的方法,例如httponly标志。然而,这种会话处理方法是最常用的…到处都是。
- 在这种情况下,我想知道会话cookie是否有帮助?
- @用户1389813:http始终是一个好主意。它将有助于cookie,因为它们的内容将被加密。
- 你是说https还是http?
- @用户1389813:当然是https,抱歉,不能这么晚编辑
是的,你可以。servlet容器将为您跟踪它们,因此您不必亲自进行簿记。可以从servlet代码中的HttpServletRequest中获取Session对象。因为您的代码一次只需要关注一个请求,所以在处理多个会话时通常不会有太大的麻烦。
要处理servlet中的多个用户登录,请为每个登录创建一个会话
1
| HttpSession session = request.getSession(); |
public HttpSession getSession()返回与此请求关联的当前会话,或者如果请求没有会话,则创建一个会话。
每个会话将唯一地标识用户。
现在,如果用户希望更改数据库中的某些数据,那么在创建会话后,请使用该会话的信息设置属性,这些信息可以唯一地标识数据库中的用户,例如电子邮件u id为:
1
| session.setAttribute("id",email_id of user); |
稍后可以在另一个servlet/jsp中检索此属性,如下所示:
1
| String email_id = session. getAttribute("id"); |
此属性将帮助识别向服务器发送更新数据库中数据或执行其他操作的请求的用户。有关会话的更多方法,请参阅链接:http://www.javatpoint.com/http-session-in-session-tracking