使用 RequestDispatcher 将请求从 servlet 转发到 JSP 不会隐藏目标 URL
Forwarding a request from servlet to JSP using RequestDispatcher doesn't hide the target URL
简而言之,我有一个将 GET 请求转发给 JSP 的 servlet,我想 "hide" 来自用户的目标 URL。
我的设置如下:
- 一个 servlet,映射到 URL "www.mydomain.com/pages/page1"
- A JSP,地址“/WEB-INF/pages/page1.jsp”,相对于应用程序根目录。 JSP 位于 WEB-INF 目录中,以便无法直接从浏览器访问。
从浏览器访问后,servlet 预处理传入的 GET 请求,并使用以下代码片段将其转发到 JSP:
request.getRequestDispatcher("/WEB-INF/pages/page1.jsp").forward(request, response);
期望的行为是浏览器保持 URL "www.mydomain.com/pages/page1",而用户看到 JSP.
的内容
不幸的是,浏览器始终切换为显示 JSP 的 URL:"www.mydomain.com/WEB-INF/pages/page1.jsp"(在 Chrome 和 Firefox 中测试)
谁能告诉我,是什么导致了这种行为?
来源:
此 CodeRanch 答案中描述了此解决方案,其中他们在 "hiding" JSP 的地址成功:http://www.coderanch.com/t/618800/JSP/java/Url-hiding
在对我的实现进行了广泛的研究之后,我能够找出导致此问题的原因。确切的源代码太复杂 post 这里,实际上是无关紧要的。
问题是由 Javascript 这条模糊的行引起的,它通过 scriptlet(过时的做法)从单独的实用程序 class 拉入 JSP。
<script type='text/javascript'>
window.history.replaceState(null, document.title, sanitizedURL);
</script>
由于遗留原因,页面 URL 正在 "sanitized" 删除其查询字符串的一部分,然后 "replacing the state of the window history" 发生了。我不确定这是否符合页面重新加载的条件,但不需要的副作用是实际资源的表面 URL、"www.mydomain.com/WEB-INF/pages/page1.jsp"
底线:如果您遇到类似问题,请尝试寻找 Javascript 与 window/document 状态混淆的问题
简而言之,我有一个将 GET 请求转发给 JSP 的 servlet,我想 "hide" 来自用户的目标 URL。
我的设置如下:
- 一个 servlet,映射到 URL "www.mydomain.com/pages/page1"
- A JSP,地址“/WEB-INF/pages/page1.jsp”,相对于应用程序根目录。 JSP 位于 WEB-INF 目录中,以便无法直接从浏览器访问。
从浏览器访问后,servlet 预处理传入的 GET 请求,并使用以下代码片段将其转发到 JSP:
request.getRequestDispatcher("/WEB-INF/pages/page1.jsp").forward(request, response);
期望的行为是浏览器保持 URL "www.mydomain.com/pages/page1",而用户看到 JSP.
的内容不幸的是,浏览器始终切换为显示 JSP 的 URL:"www.mydomain.com/WEB-INF/pages/page1.jsp"(在 Chrome 和 Firefox 中测试)
谁能告诉我,是什么导致了这种行为?
来源: 此 CodeRanch 答案中描述了此解决方案,其中他们在 "hiding" JSP 的地址成功:http://www.coderanch.com/t/618800/JSP/java/Url-hiding
在对我的实现进行了广泛的研究之后,我能够找出导致此问题的原因。确切的源代码太复杂 post 这里,实际上是无关紧要的。
问题是由 Javascript 这条模糊的行引起的,它通过 scriptlet(过时的做法)从单独的实用程序 class 拉入 JSP。
<script type='text/javascript'>
window.history.replaceState(null, document.title, sanitizedURL);
</script>
由于遗留原因,页面 URL 正在 "sanitized" 删除其查询字符串的一部分,然后 "replacing the state of the window history" 发生了。我不确定这是否符合页面重新加载的条件,但不需要的副作用是实际资源的表面 URL、"www.mydomain.com/WEB-INF/pages/page1.jsp"
底线:如果您遇到类似问题,请尝试寻找 Javascript 与 window/document 状态混淆的问题