从URI获取锚点

时间:2009-10-28 13:22:50

标签: java jsp servlets anchor

我正在编写JSP / Servlet,我正试图获取URI的锚点部分,例如:

blabla.rdf#mark

如何从我的请求中获得标记?显然request.getParameter()不起作用?

欢迎任何帮助。

3 个答案:

答案 0 :(得分:19)

这是不可能的,因为客户端不会将“锚点部分”发送到服务器

例如,以下是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相同的字符串上下文中,解析器必须能够   在片段存在时识别片段并将片段放在一边作为片段的一部分   解析过程。

答案 1 :(得分:2)

我想你想制作一个可收藏的Ajax网络应用程序,你想要替换DOM的某些片段而不重新加载整个页面。 (否则您可以使用查询参数。)如 sfussenegger 所述,浏览器不会将“锚点”传输到服务器。解决方案是在客户端。

Javascript window.location.hash提供锚信息。您可以将事件处理程序附加到window.onload事件,该事件处理window.location.hash并将其传输到Ajax XHttpRequest中的服务器。您捕获响应并将其构建到DOM中。

不幸的是,这是两次客户端 - 服务器往返。

有关ajaxpatterns的详情。

答案 2 :(得分:0)

此解决方案仅在按下提交按钮后工作,但是:您可以使用javascript在表单上放置一个设置为document.location值的隐藏值。这会告诉您浏览器确切看到的地址。