Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用RequestDispatcher将请求从servlet转发到JSP不需要';不要隐藏目标URL_Java_Jsp_Servlets_Forward_Requestdispatcher - Fatal编程技术网

Java 使用RequestDispatcher将请求从servlet转发到JSP不需要';不要隐藏目标URL

Java 使用RequestDispatcher将请求从servlet转发到JSP不需要';不要隐藏目标URL,java,jsp,servlets,forward,requestdispatcher,Java,Jsp,Servlets,Forward,Requestdispatcher,简而言之,我有一个servlet将GET请求转发给JSP,我想对用户“隐藏”目标URL 我的设置如下: 一个servlet,映射到URL“www.mydomain.com/pages/page1” 一个JSP,地址为“/WEB-INF/pages/page1.JSP”,相对于应用程序根。JSP驻留在WEB-INF目录中,以便不能直接从浏览器访问 从浏览器访问时,servlet预处理传入的GET请求,并使用以下代码段将其转发给JSP: request.getRequestDispatcher("/

简而言之,我有一个servlet将GET请求转发给JSP,我想对用户“隐藏”目标URL

我的设置如下:

  • 一个servlet,映射到URL“www.mydomain.com/pages/page1”
  • 一个JSP,地址为“/WEB-INF/pages/page1.JSP”,相对于应用程序根。JSP驻留在WEB-INF目录中,以便不能直接从浏览器访问
  • 从浏览器访问时,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的回答中进行了描述,他们成功地“隐藏”了JSP的地址:

    对我的实现进行了广泛的探索,我能够找出这个问题的原因。确切的源代码太复杂,无法在此发布,事实上与此无关

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

    
    window.history.replaceState(null,document.title,sanitizedrl);
    
    出于遗留原因,页面URL正在通过删除其查询字符串的一部分进行“清理”,然后“替换窗口历史记录的状态”。我不确定这是否符合页面重新加载的条件,但不必要的副作用是实际资源URL“www.mydomain.com/WEB-INF/pages/page1.jsp”的出现


    一句话:如果您遇到类似的问题,请尝试查找扰乱窗口/文档状态的Javascript

    这应该可以正常工作。您能否在
    web.xml
    @W-S中发送您的servlet的完整
    doGet()
    方法和
    servlet映射
    ,感谢您确认这也会起作用。这启发了我进行一些调试,并找到了问题的原因。见下面我的答案。
    <script type='text/javascript'>
      window.history.replaceState(null, document.title, sanitizedURL);
    </script>