在Glassfish中测试servlet 3.0的SessionCookieConfig

在servlet3.0以前,servlet规范是强制规定cookie名字为JSESSIONID,而Servlet3.0添加了一个新类:SessionCookieConfig,这个类是用来修改会话跟踪的cookie相关信息的,包括name,path,domain... (若浏览器用cookie的话,是这样,若不用cookie,则name是url重写的参数名)。为了测试这个新功能,我测试了sun公司提供的例子:sessioncookieconfig-war,这个示例是把默认的JSESSIONID改为MYJSESSIONID。在默认情况下,执行这个例子是成功的,也就是可以在netbeans中run这个例子成功。但是成功的标志是什么呢?显然我们我具体分析一下,我认为这个例子成功的标识应该是这样一个流程:

1.第一步浏览器访问,server用SessionCookieConfig修改JSESSIONID,打印出sessionId,server正确返回;这个例子的协议抓取的响应信息如下:

    HTTP/1.1 200 OK
    X-Powered-By: Servlet/3.0
    Server: GlassFish v3
    Set-Cookie: MYJSESSIONID=56eb237167919b3611150b227bbe; Version=1; Comment=myComment; Domain=mydomain; Max-Age=123; Expires=Wed, 13-Jan-2010 02:08:39 GMT; Path=/myPath; Secure; HttpOnly
    Content-Length: 9
    Date: Wed, 13 Jan 2010 02:06:36 GMT

 

    SUCCESS

从上面的输出信息中,我们可以看到用SessionCookieConfig成功修改了cookie的属性。

 

2.第二步浏览器再访问,server第二次打印出sessionId,看两次是否一致,若一致,则可以认为这个实验部分成功(据我所知,目前所有的servlet引擎实现的sessionid的值域cookie的值总是相等的)。为什么是部分呢?因为我们还需要协议截取工具,抓取http协议,看cookie的名称是否是MYJSESSIONID,若这个也正确,则认为实验完全成功。当然这个要看对cookie的各个属性设置正确,比如domain,以及path,假如下一次访问的url不是cookie path的子目录,浏览器就不是提交这个cookie。

 

所以说sun公司的例子不是特别完整。在这个例子中,只有一次浏览器访问,只能通过debug看java代码执行修改SessionCookieConfig是否成功,以及使用http协议抓取工具,看cookie的名字。但是下一次浏览器是否会submit这个cookie到server端呢?其实从上面响应信息已经可以看出问题了,MYJSESSIONID的有Secure值,这个值说明只有在HTTPS协议下,浏览器才会submit这个cookie,当然还有其它相关属性值(domain,path)。为了测试我的想法,我改造了这个例子。

第一步.在这个例子中,再添加一次请求,用http协议抓取工具看第二次的请求是否会带第一次返回的cookie

示例改造:注销掉CreateSession中检测cookie的代码(后面说明),在web目录下,添加一个test.jsp页面,内容随便,只要能请求就行。然后看第二次请求时浏览器是否会带MYJSESSIONID这个cookie。实验表明没有自动这个cookie

第二步,再修改ConfigListener类中的scc.setSecure(true)代码,改为scc.setSecure(false),实验结果还是不对

第三步,再注销scc.setPath("/myPath");,实验结果还是不对

第二步,再注销scc.setDomain("mydomain");,实验结果终于对了,也就是第二次的请求浏览器带了MYJSESSIONID这个cookie。

 

其实要是对cookie技术有所了解的朋友应该会理解上面的分析。比如,不注销scc.setPath()方法,改为scc.setPath(sce.getServletContext().getContextPath())。

 

现在回过头来再分析sun公司的例子,其实,在CreateSession类里也测试了Http协议的reponse的header属性Set-Cookie属性,其实这就是http协议头的一个属性,server告诉浏览器,需要设置这样一个cookie。我觉得,这种方式测试不能100%说明问题,这只是在server的代码。具体有没有反应到浏览器端,还是需要用一个http协议拦截工具来辅助测试想法,比如Fiddler,就很好用,只是需要安装.net运行环境。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值