在Tomcat中支持没有Cookie的会话

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

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

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

谢谢。

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

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

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

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

    <% - 这很糟糕: - %> 链接

    <% - 这很好: - %> ”>链接

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

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

     

您可以通过IP地址进行跟踪,但代理服务器(和NAT?)可能会让您感到困惑。

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

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

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

最好的方法是使用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(""); pw.println("Click"); pw.println(""); }