【问题标题】:Servlet : New session created for every request when cookie is disabledServlet:禁用 cookie 时为每个请求创建新会话
【发布时间】:2017-01-03 18:12:24
【问题描述】:

下面的代码我用 Servlet 编写并从 index.html 向这个 servlet 发出请求。 表单 index.html 我传递了要添加的会话的键和值。

HttpSession session = request.getSession(false);
if(session == null){
    session = request.getSession();
}

session.setAttribute(request.getParameter("key"), request.getParameter("val"));

Enumeration list = session.getAttributeNames();
while(list.hasMoreElements()){
    String k  = (String)list.nextElement();
    String v = (String)session.getAttribute(k);
    System.out.println(k +"\t\t"+v);
}
response.sendRedirect(response.encodeRedirectURL("index.html"));

启用 cookie 后,上述代码可以正常工作。

我在知情的情况下禁用了 Cookie 并运行了此代码。 我期待将添加所有属性及其值。但我只得到最后一个。我观察到的是每次创建新会话并且每次都更改带有 JESSIONID 的 URL。

我也在 Chrome 和 firefox 中对此进行了测试。

请帮我看看哪里出错了

谢谢

【问题讨论】:

  • 您认为 HTTP 请求如何与会话相关联? HTTP 是一个无状态协议,所以如果你想保持状态,那么客户端需要发回一些东西——要么是 cookie,要么是其他东西,比如请求参数。
  • 如果禁用 cookie,我正在使用 encodeRedirectURL() 方法添加会话 ID。
  • 对,但是会话 ID 如何在后续请求中传回?也许您需要提供有关整个流程的更多信息。
  • 当我调用 encodeRedirectURL() 方法时,JESSIONID 会随 URL 一起发送,并在下一个请求中返回,这有助于了解此请求与前一个请求相关联。所以据我所知,不能创建新会话,在这种情况下不是。
  • 你说 “从 index.html 我传递键和值”。这意味着该页面将使用映射到您的 servlet 的 URL 向服务器发送请求。由于您尚未共享该网址,我们将其命名为myServet.do。这可能是一个带有如下 URL 的 GET 方法:myServet.do?key=foo&val=bar。没有JSESSIONID 是那个URL,所以服务器不知道它是什么会话,并创建一个新会话。你的页面应该做的是建立这样的 URL:myServet.do?key=foo&val=bar&JSESSIONID=xxxx,其中xxxxindex.html 页面的JSESSIONID 查询参数的值。

标签: java session servlets cookies session-cookies


【解决方案1】:

为了在@Andreas 的评论的帮助下解决问题,我做了以下更改

  1. 我将 index.html 更改为 index.jsp
  2. 我没有在表单操作中编写 Servlet.do,而是将其更改为 response.encodeURL("Servlet.do")。

现在在第二次等请求将使用以前的 JESSIONID 发送到服务器。

感谢安德烈亚斯的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-25
    • 2011-01-09
    • 2021-06-15
    • 2016-08-07
    • 2011-05-15
    • 1970-01-01
    • 2021-10-20
    • 2022-10-14
    相关资源
    最近更新 更多