11

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

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

根据之前对Wicket SEO 页面的经验,我知道如何删除它jsessionid以将其从机器人中隐藏,但对普通用户使用这种技术似乎是一种黑客行为。对于那些偏执到禁用 cookie 的人来说,它也会破坏该网站。

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

4

1 回答 1

19

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

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

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

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

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

那么为什么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 功能。


顺便说一句(来自您的网站 JavaScript):

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

什么是假的

于 2011-07-24T17:29:23.693 回答