使用表单隐藏域跟踪Session

重写URL跟踪Session

Servlet容器先在客户端浏览器中保存一个Sessin ID,以后在浏览器发出的HTTP请求中就会包含这个Session ID,Servlet容器读取HTTP请求中的Session ID,就能判断出来自各个浏览器进程的HTTP请求属于哪个会话。这一过程称为Session跟踪。


  • 如果浏览器支持Cookie,Servlet容器就把Session ID作为Cookie保存在浏览器中。
  • 如果浏览器出于安全的原因,禁用Cookie,不允许服务器像客户端存放Cookie。Servlet容器可以重写Web组件的URL,把Session ID添加到URL信息中。


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了。


在Session中禁用Cookie

既然可能客户浏览器不支持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。