【问题标题】:Java : How to deal with multiple sessions in the servlet [duplicate]Java:如何处理 servlet 中的多个会话 [重复]
【发布时间】:2012-07-10 00:55:54
【问题描述】:

我是 Java EE 的新手。我有一个需要用户登录的网站,在用户登录后,我希望用户看到他/她自己的物品(例如:购物车)。

所以这意味着我必须使用会话来完成它。但是如何处理多个会话?

例如,多个用户登录到系统以及同一个 servlet?但是,我可以在一个 servlet 中保留多个会话吗?我是否记录了他们每个人?它是如何工作的?

有人可以举个例子吗?

【问题讨论】:

  • 会话保存在服务器上,而不是 servlet 上
  • 它是如何工作的?你能简单解释一下吗
  • 为了更好地指导这个问题,BalusC 有一个非常好的答案。看到这个问题stackoverflow.com/q/3106452/1065197
  • 另外,对于这类问题,您可以在 stackoverflow wiki 中进行一些研究,并在此处查看一些问题。对于几乎所有关于 Java SE、Java EE 和其他技术/框架的基本概念,有很多优秀的人给出了很好的答案。

标签: java session jakarta-ee servlets session-cookies


【解决方案1】:

要在Servlets中处理多个用户登录,为每个登录创建一个会话

HttpSession session = request.getSession();

public HttpSession getSession() 返回与此请求关联的当前会话,或者如果请求没有会话,则创建一个。

每个会话都会唯一地识别用户。

现在,如果用户想要更改 数据库 中的某些数据,那么在创建会话后,使用该会话设置属性以及可以唯一标识数据库中用户的信息,例如email_id 为:

session.setAttribute("id",email_id of user);

稍后可以在另一个 Servlet/JSP 中检索此属性:

String email_id = session.getAttribute("id");

此属性将有助于识别已向服务器发送请求以更新数据库中的数据或执行其他操作的用户。 更多与会话相关的方法,请参考链接: http://www.javatpoint.com/http-session-in-session-tracking

【讨论】:

    【解决方案2】:

    在 servlet 中,您可以访问 HttpServletRequest,它为您提供了 getSession() 方法。此方法返回会话对象(本质上是键值映射),每个用户都不同。

    如果您将某些东西放入该地图(如购物车),您可以稍后检索它 - 但仅当同一用户再次访问该应用程序时(不一定是同一 servlet)。

    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 ?还是用户定义的属性?
    • 我认为 OP 问题更多的是关于有多个会话。可能来自不同的浏览器。如果它来自相同的浏览器并启用了 cookie,那么这是有道理的。
    • @user1389813 只要会话没有被破坏(session.destroy() 或用户关闭浏览器,或会话超时),servlet 容器就会为您处理此问题
    • @user1389813:这就是 servlet 的美妙之处:只需在会话中放入一些内容,并在同一用户进入您的应用程序时将其读回(只要会话没有超时)。如果其他用户试图阅读会话,他会得到他的副本。每个用户都有自己的会话,由 JSESSIONID cookie 透明标识(通常)。
    • @user1389813:是的,它可以跨标签工作,但不一定跨不同的浏览器窗口(当然不同的浏览器会有不同的会话)。有几种针对会话 cookie 的攻击和几种缓解它们的方法,例如HttpOnly 标志。然而,这种会话处理方法最常用......无处不在。
    【解决方案3】:

    是的,你可以。 servlet 容器会为您跟踪它们,因此您不必自己进行簿记。 Session 对象可以从您的 servlet 代码中的 HttpServletRequest 获得。由于您的代码一次只需要处理一个请求,因此处理多个会话通常不会很痛苦。

    【讨论】:

    • +1,一个代码示例也会很有帮助。
    猜你喜欢
    • 2011-04-13
    • 2010-12-04
    • 2015-11-30
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 2010-09-16
    • 2012-04-19
    相关资源
    最近更新 更多