我目前正在运行具有以下属性的应用程序:
我需要能够支持用户会话没有 Cookie。有人可以指出我正确的方向。
谢谢。
答案 0 :(得分:20)
这个问题的完整答案是你所有答案的组合,所以我要总结一下:
无需在context.xml文件中设置cookies =“false”。理想的功能是让tomcat使用它的基于URL的会话标识,如果用户不支持cookie,默认情况下将使用该标识。
当用户未启用Cookie时,tomcat将通过请求网址中的“JSESSIONID”参数识别会话。几个样本网址如下
http://www.myurl.com;jsessionid=123456AFGT3
http://www.myurl.com;jsessionid=123456AFGT3?param1=value¶m2=value2
请注意会话ID不是url查询字符串的一部分(这是j2ee标准)
为了确保将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>");
}