【发布时间】:2010-12-10 20:49:44
【问题描述】:
我正在编写一个 JSP/Servlet,我正在尝试获取 URI 的锚点部分,例如:
blabla.rdf#mark
如何从我的请求中获得我的分数?明明request.getParameter()不行?
欢迎任何帮助。
【问题讨论】:
-
这里有一个类似的 PHP 问题,也有类似的回答:stackoverflow.com/questions/1032242/…
我正在编写一个 JSP/Servlet,我正在尝试获取 URI 的锚点部分,例如:
blabla.rdf#mark
如何从我的请求中获得我的分数?明明request.getParameter()不行?
欢迎任何帮助。
【问题讨论】:
这是不可能的,因为客户端不会将“锚点部分”发送到服务器
例如,以下是 Chrome 在提交 http://example.com/#foobar 后生成的确切请求(使用 Wireshark 记录):
GET / HTTP/1.1
Host: example.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.3 (KHTML, like Gecko) Chrome/4.0.223.11 Safari/532.3
Cache-Control: max-age=0
Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Encoding: gzip,deflate
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
If-None-Match: "b300b4-1b6-4059a80bfd280"
If-Modified-Since: Tue, 15 Nov 2005 13:24:10 GMT
看,没有#foobar。所以服务器应用程序无法读取它。
您可以使用一些 JavaScript 魔术来将锚点存储在 cookie 或隐藏的输入字段或您喜欢的任何巫术中。但它不适用于不是来自您自己网站的请求。在查询字符串的服务器部分创建您需要的任何内容并仅将锚用于仅 JavaScript 的任务 - 或使用它在简单的 HTML 文档中导航 - 但这是 90 年代;)。
这是来自上述 RFC 1808 的重要部分:
请注意,片段标识符(以及它前面的“#”)是 不被视为 URL 的一部分。但是,由于它是常用的 在与 URL 相同的字符串上下文中,解析器必须能够 识别存在的片段并将其作为 解析过程。
【讨论】:
我猜您想制作一个可收藏的 Ajax Web 应用程序,并且您想替换 DOM 的某些片段而不重新加载整个页面。 (否则您可以使用查询参数。)正如 sfussenegger 所述,浏览器不会将“anchor”传输到服务器。解决方案在客户端。
Javascript window.location.hash 提供锚点信息。您可以将事件处理程序附加到window.onload 事件,该事件获取window.location.hash 并在Ajax XHttpRequest 中将其传输到服务器。您捕获响应并将其构建到 DOM 中。
不幸的是,这是两次客户端-服务器往返。
更多信息请访问ajaxpatterns。
【讨论】:
此解决方案仅在按下提交按钮后起作用,但是:您可以使用 javascript 在表单上放置一个隐藏值,该值设置为 document.location 的值。这将准确地告诉您浏览器将您的地址视为什么。
【讨论】: