在 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 中,您必须使用
链接
链接
【讨论】:
如果我使用 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
”标头以及附加到 URL
的 session-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)