启用 cookie 后,为什么 jsessionid 出现在 Wicket URL 中?

发布于 2024-11-25 19:26:15 字数 647 浏览 1 评论 0原文

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

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

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

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

I notice that the first time a user visits my site the Wicket-generated URLs contain a jsessionid, rather than relying on the cookie for session information.

The cookie does get set successfully, and if the user simply reloads the page, the jsessionid is no longer appended to the URLs. You can test this out here: pixlshare.com. Hovering over any of the image links will show a URL with a jsessionid; reload the page, and the jsessionids will be removed.

From previous experience with the Wicket SEO page I know how to remove the jsessionid to hide it from bots, but employing this technique for regular users seems like a hack. It will also break the site for those people paranoid enough to have cookies disabled.

This is happening after a recent move to Tomcat from Glassfish, though I can't say for certain that that's the cause. Also, I'm using Apache's mod_proxy in front of Tomcat.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

套路撩心 2024-12-02 19:26:15

发生的情况是这样的:客户端第一次请求页面,根本不发送 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, '');

什么是假的

Here's what happens: the client requests a page for the first time, sending no cookies at all:

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

The server does not know anything about client capabilities based on this request, in particular whether it supports cookies or not. Hence, to be extra safe, it sends both cookie and JSESSIONID encoded in the URL:

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

In other words the servlet container defensively appends JSESSIONID to every URL, just in case the client does not support cookies.

So why the JSESSIONID disappears on the second request? Because now the client sends the cookie in HTTP request and the server knows, that the client handles them. That being said, JSESSIONID is no longer needed.

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

On the other hand if the client does not support cookies, server will continue to rewrite URLs.

This is not a Wicket issue, this is a Tomcat feature.


BTW (from your website JavaScript):

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

What the f...ake?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文