Servlet容器先在客户端浏览器中保存一个Sessin ID,以后在浏览器发出的HTTP请求中就会包含这个Session ID,Servlet容器读取HTTP请求中的Session ID,就能判断出来自各个浏览器进程的HTTP请求属于哪个会话。这一过程称为Session跟踪。
HttpServletResponse接口提供了重写URL的方法:
public String encodeURL(String url) public String encodeRedirectURL(String url)
只有在当前Web组件支持Session,并且浏览器不支持Cookie的情况下,encodeURL方法才会重写URL,否则直接返回参数指定的原始URL。
例如:
encodeurl.jsp中包含如下代码:
<a href="<%%= response.encodeURL("TEST.JSP")>" />
当浏览器请求访问 encodeurl.jsp 文件时,如果当前JSP页面支持Session,并且浏览器不支持Cookie,则上面的链接被解析为如下形式:
<a href="TEST.JSP;jsessionid=9549349941565F01191DB6F290F68EF" />
TOMCAT判断客户端浏览器是否支持Cookie的依据是请求中是否含有Cookie。尽管客户端可能会支持Cookie,但是由于第一次请求时不会携带任何Cookie(因为并无任何Cookie可以携带),URL地址重写后的地址中仍然会带有jsessionid。当第二次访问时服务器已经在浏览器中写入Cookie了,因此URL地址重写后的地址中就不会带有jsessionid了。
既然可能客户浏览器不支持Cookie,索性禁止Session使用Cookie,统一使用URL地址重写会更好一些。
Java Web规范支持通过配置的方式禁用Cookie。
下面举例说一下怎样通过配置禁止使用Cookie。
打开项目sessionWeb的WebRoot目录下的META-INF文件夹(跟WEB-INF文件夹同级,如果没有则创建),打开context.xml(如果没有则创建),编辑内容如下:
/META-INF/context.xml <?xml version='1.0' encoding='UTF-8'?> <Context path="/sessionWeb"cookies="false"> </Context>
或者修改Tomcat全局的conf/context.xml,修改内容如下:
//context.xml <!-- The contents of this file will be loaded for eachweb application --> <Context cookies="false"> <!-- ... 中间代码略 --> </Context>
部署后TOMCAT便不会自动生成名JSESSIONID的Cookie,Session也不会以Cookie为识别标志,而仅仅以重写后的URL地址为识别标志了。
注意:该配置只是禁止Session使用Cookie作为识别标志,并不能阻止其他的Cookie读写。也就是说服务器不会自动维护名为JSESSIONID的Cookie了,但是程序中仍然可以读写其他的Cookie。