使用RequestDispatcher将来自servlet的请求转发到JSP并不隐藏目标URL

时间:2016-03-28 04:25:06

标签: java jsp servlets forward requestdispatcher

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

我的设置如下:

  1. 一个servlet,映射到URL" www.mydomain.com/pages/page1"
  2. 相对于应用程序根目录的地址" /WEB-INF/pages/page1.jsp"的JSP。 JSP驻留在WEB-INF目录中,以便不能直接从浏览器访问。
  3. 从浏览器访问时,servlet预处理传入的GET请求,并使用以下代码片段将其转发到JSP:

    request.getRequestDispatcher("/WEB-INF/pages/page1.jsp").forward(request, response);
    

    当用户看到JSP的内容时,所需的行为是浏览器维护URL" www.mydomain.com/pages/page1" ;.

    不幸的是,浏览器一直切换到显示JSP的URL:" www.mydomain.com/WEB-INF/pages/page1.jsp" (在Chrome和Firefox中测试)

    有谁能告诉我,可能导致这种行为的原因是什么?

    来源: 这个解决方案在CodeRanch的答案中有所描述,他们在这个答案中成功地隐藏了#34; JSP的地址:http://www.coderanch.com/t/618800/JSP/java/Url-hiding

1 个答案:

答案 0 :(得分:0)

在我的实现中做了一些广泛的讨论,我能够找出这个问题的原因。确切的源代码太复杂了,无法在此发布,实际上是无关紧要的。

问题是由这个模糊的Javascript行引起的,它是通过一个Scriptlet(过时的实践)从一个单独的实用程序类引入JSP的。

<script type='text/javascript'>
  window.history.replaceState(null, document.title, sanitizedURL);
</script>

由于遗留原因,页面URL通过删除其查询字符串的一部分进行“清理”,然后“替换窗口历史记录的状态”发生了。我不确定这是否有资格作为页面重新加载,但不必要的副作用是实际资源URL的浮现,“www.mydomain.com/WEB-INF/pages/page1.jsp”

结论:如果您遇到类似问题,请尝试查找混乱窗口/文档状态的Javascript