使用 RequestDispatcher 将请求从 servlet 转发到 JSP 不会隐藏目标 URL

Forwarding a request from servlet to JSP using RequestDispatcher doesn't hide the target URL

简而言之,我有一个将 GET 请求转发给 JSP 的 servlet,我想 "hide" 来自用户的目标 URL。

我的设置如下:

  1. 一个 servlet,映射到 URL "www.mydomain.com/pages/page1"
  2. 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 状态混淆的问题