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

时间:2011-03-27 15:05:24

标签: java servlets java-ee struts tiles

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

例如

  1. 原始请求: / booking / getCruiseDetails
  2. 转发到:/booking/validateCruiseDeteails.jsp
  3. 转发到:/booking/validateUser.jsp
  4. 最终转发到: /booking/showCruiseDetails.jsp
  5. 所以,当我调用${pageContext.request.requestURL}时,在/booking/showCruiseDetails.jsp中我 获取/booking/showCruiseDetails.jsp

    如何从通过多个转发到达的jsp获取原始(客户端制作的)请求网址。我确实在stackoverflow上找到了提示解决方案herehere的以下帖子,但它们没有解决在多次转发发生后如何查找原始请求网址的问题。

6 个答案:

答案 0 :(得分:57)

我在这篇文章[How do you detect the URL in a Java Servlet when forwarding to JSP?]

中找到了更好的答案

在目标JSP上使用:

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

找出原始网址的内容。

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

答案 1 :(得分:11)

您可以使用过滤器将原始地址放入请求属性,然后从jsp

中读取它

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

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

JSP:

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

这是有效的,因为过滤器默认设置了REQUEST调度程序。这意味着过滤器仅针对直接客户端请求而不是转发/包括

执行

答案 2 :(得分:3)

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

或单引号

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

答案 3 :(得分:1)

请考虑使用servlet过滤器来验证信息。这意味着您可以避免验证转发,只需保留在单个JSP文件中。

答案 4 :(得分:0)

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

<h:outputText value="#{requestScope['javax.servlet.forward.request_uri']}" />

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

<error-page>
    <error-code>404</error-code>
    <location>/xhtml/pg/error/404.xhtml</location>
</error-page>

答案 5 :(得分:0)

与@Lenny Markus相同,但使用Request Dispatcher类中提供的常量。

request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI)