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上运行
谢谢。您可以通过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。这个问题的完整答案是您所有回答的组合,因此我将总结:
http://www.myurl.com;jsessionid=123456AFGT3
http://www.myurl.com;jsessionid=123456AFGT3?param1=value¶m2=value2
注意会话id如何不是url查询字符串的一部分(这是j2ee标准)最好的方法是使用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>");
}