【发布时间】:2011-03-17 17:14:56
【问题描述】:
我正在尝试将请求转发到另一个包含井号 ('#') 的 URL:
request.getRequestDispatcher("/some/path.jsp#somehash").forward(request, response);
但是,Tomcat 告诉我“请求的资源不可用”。如果我从 URL 中删除哈希,一切正常。是不允许使用哈希还是我没有正确对待它们?
【问题讨论】:
我正在尝试将请求转发到另一个包含井号 ('#') 的 URL:
request.getRequestDispatcher("/some/path.jsp#somehash").forward(request, response);
但是,Tomcat 告诉我“请求的资源不可用”。如果我从 URL 中删除哈希,一切正常。是不允许使用哈希还是我没有正确对待它们?
【问题讨论】:
网址片段纯粹是客户端。 RequestDispatcher#forward() 完全是服务器端的。 forward 中的给定 URL 不会被发送到客户端。但是,您可以使用HttpServletResponse#sendRedirect()重定向到给定的 URL。然后 URL 片段将被发送到客户端并反映在浏览器地址栏中。然而,重定向请求的缺点是当前请求将被丢弃并创建一个全新的请求。如果这不是负担得起的,那么您确实必须在 JavaScript 角落寻找解决方案。
【讨论】:
# 符号是浏览器的东西,而不是服务器的东西。当您在浏览器中键入带有# 的 URL 时,浏览器不会将该部分发送到服务器。它发送没有它的 URL,然后在返回页面时跳转到命名的锚点。
当您要求容器为您获取该 URL 时,它不会将 # 与任何其他 URL 区别对待 - 它没有特殊含义,因此它会查找名为 /some/path.jsp#somehash 的 JSP 页面,当然不存在。
您需要以某种方式在客户端上保留跳转到锚点的逻辑。也许您可以在结果页面上放置一些 javascript 以滚动到文档中的那个点。
【讨论】: