在 Tomcat 中支持没有 Cookie 的会话

Posted

技术标签:

【中文标题】在 Tomcat 中支持没有 Cookie 的会话【英文标题】:Supporting Sessions Without Cookies in Tomcat 【发布时间】:2010-10-01 00:10:43 【问题描述】:

我目前正在运行具有以下属性的应用程序:

基于 Java 的 Spring 和 Acegi 在 Tomcat 5 上运行

我需要能够支持没有 cookie 的用户会话。有人能指出我正确的方向吗?

谢谢。

【问题讨论】:

这不应该在 Tomcat 上开箱即用吗? servlet 容器应该在第一次使用会话时设置一个请求参数 JSESSIONID,如果客户端没有发回它接受 cookie 的响应信号,那么容器应该继续使用这个参数......我想。 【参考方案1】:

这个问题的完整答案是你所有回答的组合,所以我要总结一下:

    无需在 context.xml 文件中设置 cookies="false"。理想的功能是让tomcat使用它的基于url的会话标识,如果用户不支持cookies,默认使用它。

    当用户没有启用 cookie 时,tomcat 将通过请求 url 中的“JSESSIONID”参数来识别会话。几个示例网址如下 http://www.myurl.com;jsessionid=123456AFGT3 http://www.myurl.com;jsessionid=123456AFGT3?param1=value&param2=value2 注意会话 id 不是 url 查询字符串的一部分(这是 j2ee 标准)

    为了确保 jsessionid 参数附加到您的所有请求 URL,您不能使用纯 url 引用。例如,在 JSTL 中,您必须使用 。如有必要,servlet 引擎会自动将 jsessionid 附加到 url。这是一个例子:

    链接

    链接

【讨论】:

如果我使用 ajax 调用,该怎么做? (不是href链接)【参考方案2】:

见http://tomcat.apache.org/tomcat-5.5-doc/config/context.html

在 META-INF/context.xml 文件中,

<?xml version='1.0' encoding='UTF-8'?>
<Context path='/myApplicationContext' cookies='false'>
  <!-- other settings -->
</Context>

【讨论】:

这似乎将 JSESSIONID 附加到应用程序的第一个请求的 url 中。但是,如何确保将其附加到后续请求中?【参考方案3】:

您可以通过 IP 地址进行跟踪,但代理服务器(和 NAT?)可能会搞砸。

您可以强制所有 URL 将会话作为参数,并将所有表单作为隐藏字段。也许一个用于生成 URL 的自定义标签在这里会有所帮助,但我没有对 taglibs 做太多的工作。

您需要考虑安全性 - 人们可能会通过电子邮件将链接发送给其他人,其中包含会话 ID,因此您需要对每次访问进行 IP 地址检查,以检查该地址是否与会话匹配。

【讨论】:

我建议不要因为 *** 而通过 IP 地址进行跟踪。这个答案很旧,所以我不会投反对票,但我强烈建议未来的答案查找者不要这样做。【参考方案4】:

正如 matt b 评论的那样,这应该可以开箱即用(tomcat 将尝试使用 cookie,如果失败,则返回在 url 中对会话进行编码)。但是,如果您自己创建一个“普通”链接,这将不起作用 - 始终使用类似 JSTL 的方法,以便 tomcat 可以将跟踪参数添加到所有 url。

【讨论】:

【参考方案5】:

最好的方法是使用 URL 重写 。因此,当您使用 request.getSession() 时,container 将在 HTTP 响应中发送 session-id 的“Set-Cookie”标头以及附加到 URLsession-id(但您必须使用 response.encodeURL(session_info) 作为 url重写)。

public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException  
    resp.setContentType("text/html");
    PrintWriter pw=resp.getWriter();
    HttpSession session=req.getSession();
    pw.println("<html><body>");
    pw.println("<a href=\""+resp.encodeURL("/session_info")+"\">Click</a>");
    pw.println("</body></html>");


【讨论】:

以上是关于在 Tomcat 中支持没有 Cookie 的会话的主要内容,如果未能解决你的问题,请参考以下文章

如何在 tomcat 6 中将会话 cookie 标记为安全(仅限 https)

使用 Tomcat 允许子域会话 cookie 的最佳方式

Tomcat为Cookie设置HttpOnly属性

Tomcat 中带有过期日期的 JSESSIONID Cookie

如何记录 tomcat 会话失效或用户注销

强制 Tomcat 通过 http 使用安全的 JSESSIONID cookie