如何在多个servlet转发后从servlet / jsp获取原始请求url

我正在使用struts / tiles工作巡航预订应用程序,它使用多个内部servlet / jsp转发到达正确的jsp进行显示。 但是,一旦你到达用于呈现页面的最终jsp,jsp中的${pageContext.request.requestURL}调用将返回 jsp的路径。

例如

  1. 原始要求: / booking / getCruiseDetails
  2. 转发到:/booking/validateCruiseDeteails.jsp
  3. 转发到:/booking/validateUser.jsp
  4. 最后转发到: /booking/showCruiseDetails.jsp

所以,当我调用${pageContext.request.requestURL}时,在/booking/showCruiseDetails.jsp中,我得到/booking/showCruiseDetails.jsp

如何从通过多个转发到达的jsp获取原始(客户端制作的)请求URL。 我确实在stackoverflow上找到了以下关于这里和这里的解决方案的post,但是它们没有解决在多次转发发生后如何查找原始请求URL的问题。

我在这篇文章中找到了一个更好的答案[ 如何在转发到JSP时检测Java Servlet中的URL? ]

在目标JSP上使用:

request.getAttribute("javax.servlet.forward.request_uri")

找出原始url是什么。

它不需要您在转发servlet上执行任何额外的步骤

您可以使用filter将原始地址放入请求属性,然后从jsp中读取它

过滤映射到/ booking / *执行:

 request.setAttribute("origin", request.getRequestURL()); 

JSP:

 ${pageContext.request.attribute["origin"]} 

这是因为filter默认设置了REQUEST调度程序。 这意味着filter仅针对不转发/包含的直接客户端请求执行

 ${requestScope["javax.servlet.forward.request_uri"]} 

或单引号

 ${requestScope['javax.servlet.forward.request_uri']} 

请考虑使用servletfilter来validation信息。 这意味着您可以避免validation转发并保留在单个JSP文件中。

您可以在不使用带有以下内容的bean引用的情况下显示它:

  

当然,您需要在web.xml文件中映射404页面。

  404 /xhtml/pg/error/404.xhtml