如何在Java Servlet中读取HTML锚点?

4

我需要从请求中获取所有参数,包括“#”后面的内容。

例如:

请求:http://myserver/m#q=abc

我需要我的服务器获取“#”后面的所有参数,就像它们在“?”后面一样。

我该怎么做?

谢谢!

3个回答

11
RFC 1738中所指的锚点或URL片段,在请求资源时不会被客户端发送到服务器。这样设计的原因是,片段URL用于标识资源内的位置,而不是服务器上的不同资源。为了确定资源中的位置,客户端需要从服务器获取完整的资源,此过程不需要传输关于片段的信息(因为对服务器没有意义)。
如果您确实希望通过包含片段的URL提交查询字符串信息,则必须确保查询字符串位于URL片段之前。如果您自己构造请求,则这可能是客户端代码中的错误。如果可以的话,请将请求构造逻辑留给浏览器。
如果您确实希望将片段字符(#)发送到服务器,则需要在查询字符串中对其进行编码,否则客户端(浏览器)在向服务器发送请求时将忽略该URL的该部分。 相关问题:
  1. JSP Servlet anchor
  2. How to obtain anchor part of URL after # in php

2

请注意,锚点是客户端的概念,因此不应在服务器端使用。客户端不会将锚点数据发送到服务器,因此您无法这样做。最好使用 GET 参数。


request.getRequestURI() 返回 "m",没有 q=abc。 request.getQueryString() 返回 null... - koby
你确定它没有发送到服务器吗?有关此事的任何文档资料吗? 如果确定,我可以在 JavaScript 中进行重定向并用“?”替换“#”,但出于 SEO 的原因,我更愿意不进行重定向。 - koby
我很好奇的是这种情况:当你收藏了一个网站,比如http://xyz.com#fragment:然后xyz.com重定向到单点登录(SSO)网站,在那里用户登录并将被重定向到http://xyz.com ,因为#fragment从未发送到SSO服务(它可能已经在其查询字符串或POST参数中接收到一些类似于requestingApp = http%3A%2F%2Fxyz.com的东西)。 - Ustaman Sangat
好的,是的,你会失去锚点。关于此你没有太多办法。 - Bozho

1

你不能这样做。URI规范说:

A reference to a particular part of a document may, including the fragment identifier, look like

http://www.myu.edu/org/admin/people#andy

in which case the string "#andy" is not sent to the server, but is retained by the client and used when the whole object had been retrieved.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接