Java 在Tomcat中支持没有cookie的会话

Java 在Tomcat中支持没有cookie的会话,java,session,tomcat,cookies,Java,Session,Tomcat,Cookies,我当前正在运行具有以下属性的应用程序: 基于Java的Spring和Acegi 在Tomcat5上运行 我需要能够支持用户会话,而不使用cookies。谁能给我指一下正确的方向吗 谢谢。您可以通过IP地址进行跟踪,但代理服务器(和NAT?)可能会让您陷入困境 您可以强制所有URL将会话作为参数,将所有表单作为隐藏字段。也许一个用于生成URL的自定义标记在这里会有所帮助,但我对taglibs没有做太多的工作 你需要考虑安全性-人们可能会把电子邮件链接到其他有会话ID的人,所以你会想对每个访问都

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

  • 基于Java的Spring和Acegi
  • 在Tomcat5上运行
我需要能够支持用户会话,而不使用cookies。谁能给我指一下正确的方向吗


谢谢。

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

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

你需要考虑安全性-人们可能会把电子邮件链接到其他有会话ID的人,所以你会想对每个访问都有一个IP地址检查来检查地址是否匹配会话。

参阅

在META-INF/context.xml文件中

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


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

这个问题的完整答案是您所有回答的组合,因此我将总结:

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

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

  • 为了确保jsessionid参数附加到所有请求url,您不能有普通url引用。例如,在JSTL中,必须使用。如果有必要,servlet引擎将自动将jsessionid附加到url。下面是一个例子:

    链接

    链接


  • 最好的方法是使用URL重写。因此,当您使用
    request.getSession()
    时,
    容器将在HTTP响应中为
    会话id
    发送“
    Set Cookie
    ”头,并将
    会话id
    附加到
    URL
    (但您必须使用
    响应.encodeURL(会话信息)
    进行URL重写)

    public void doGet(HttpServletRequest-req、HttpServletResponse-resp)
    抛出ServletException、IOException{
    分别为setContentType(“文本/html”);
    PrintWriter pw=resp.getWriter();
    HttpSession session=req.getSession();
    pw.println(“”);
    pw.println(“”);
    pw.println(“”);
    }
    
    这不应该在Tomcat上开箱即用吗?servlet容器应该在第一次使用会话时设置一个请求参数JSESSIONID,如果客户端没有发回一个响应信号表示它接受cookie,那么容器应该继续使用这个参数。。。我认为,这似乎是在应用程序的第一个请求中将JSESSIONID附加到url。但是,如何确保它附加到后续请求中呢?我建议永远不要按IP地址进行跟踪,因为有VPN。这个答案很旧,所以我不会投反对票,但我强烈建议未来的答案观察家不要这样做。如果我使用ajax调用,该怎么做?(非href链接)
    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>");
    
    }