一尘不染

启用Cookie时,为什么jsessionid出现在Wicket URL中?

tomcat

我注意到,用户第一次访问我的网站时,Wicket生成的URL包含jsessionid,而不是依赖Cookie来获取会话信息。

cookie确实设置成功,并且如果用户只是简单地重新加载页面,jsessionid则该URL将不再追加。您可以在这里进行测试:pixlshare.com。将鼠标悬停在任何图像链接上都会显示带有jsessionid;重新加载页面,jsessionids将被删除。

Wicket SEO页面的先前经验中,我知道如何jsessionid从bot
中将其隐藏以将其隐藏,但是对于普通用户采用此技术似乎是一种黑客。对于那些偏执狂以致禁用Cookie的人来说,它也会破坏该网站。

这是在最近从Glassfish迁移到Tomcat之后发生的,尽管我不能肯定地说那是原因。另外,我在Tomcat之前使用Apache的mod_proxy。


阅读 340

收藏
2020-06-16

共1个答案

一尘不染

这是发生的情况:客户端第一次请求页面,根本不发送任何cookie:

$ curl -v http://pixlshare.com/upload

服务器对基于此请求的客户端功能一无所知,尤其是它是否支持cookie。因此,要更加安全,它会发送 两个
cookie并JSESSIONID在URL编码:

< Set-Cookie: JSESSIONID=25E7A6C27095CA1F560BCB2983BED17C; Path=/; HttpOnly
...
<a wicket:id="image1Link" href="gallery/OKfzVk;jsessionid=25E7A6C27095CA1F560BCB2983BED17C">

换句话说JSESSIONID,如果客户端不支持cookie,则servlet容器会防御性地附加到每个URL。

那么,为什么在JSESSIONID第二个请求中消失了呢?因为现在客户端在HTTP请求中发送cookie,并且服务器知道,所以客户端会处理它们。话虽如此,JSESSIONID不再需要。

$ curl -v -b JSESSIONID=25E7A6C27095CA1F560BCB2983BED17C http://pixlshare.com/upload
> Cookie: JSESSIONID=25E7A6C27095CA1F560BCB2983BED17C
...
<a wicket:id="image1Link" href="gallery/OKfzVk">

另一方面,如果客户端不支持cookie,则服务器将继续重写URL。

这不是Wicket问题,这是Tomcat功能。


BTW(来自您的网站JavaScript):

path = path.replace(/^C:\\fakepath\\/i, '');

什么假的

2020-06-16