在Tomcat中支持没有Cookie的会话

时间:2009-01-12 19:49:23

标签: java session tomcat cookies

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

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

我需要能够支持用户会话没有 Cookie。有人可以指出我正确的方向。

谢谢。

5 个答案:

答案 0 :(得分:20)

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

  1. 无需在context.xml文件中设置cookies =“false”。理想的功能是让tomcat使用它的基于URL的会话标识,如果用户不支持cookie,默认情况下将使用该标识。

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

  3. 为了确保将jsessionid参数附加到您的所有请求网址,您不能拥有普通的网址引用。例如,在JSTL中,您必须使用< C:URL取代。如果有必要,servlet引擎将自动将jsessionid附加到url。这是一个例子:

    <% - 这很糟糕: - %> < a href =“page.html”>链接< / a>

    <% - 这很好: - %> < a href =“< c:url value ='page.html'/>”> link< / a>

答案 1 :(得分:4)

请参阅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>

答案 2 :(得分:0)

您可以按IP地址进行跟踪,但是代理服务器(以及NAT?)可能会让您感到麻烦。

您可以强制所有网址将会话作为参数,并将所有表单作为隐藏字段。也许用于生成URL的自定义标记可以在这里提供帮助,但我对taglibs做了很多工作。

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

最好的方法是使用网址重写。因此,当您使用request.getSession()时,container会发送&#34; Set-Cookie&#34; HTTP响应中session-id的标头以及session-id附加的URL标头(但您必须使用response.encodeURL(session_info)进行网址重写)。

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>");

}