【问题标题】:Get request URL in JSP which is forwarded by Servlet获取由Servlet转发的JSP中的请求URL
【发布时间】:2011-02-28 17:07:17
【问题描述】:

如何在 JSP 中获取 Servlet 转发的请求 URL?

如果我在 JSP 中运行以下代码,

System.out.println("servlet path= " + request.getServletPath());
System.out.println("request URL= " + request.getRequestURL());
System.out.println("request URI= " + request.getRequestURI());

然后我得到了 JSP 的服务器端路径。但我想获取您在浏览器地址栏中看到的 URL。我可以在转发到 JSP 的 Servlet 中获取它,但我想在 JSP 中获取它。

【问题讨论】:

标签: jsp url servlets


【解决方案1】:

与@axtavt 相同,但您也可以使用 RequestDispatcher 常量。

request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI);

【讨论】:

    【解决方案2】:

    试试这个,

    <c:set var="pageUrl" scope="request">
        <c:out value="${pageContext.request.scheme}://${pageContext.request.serverName}"/>
        <c:if test="${pageContext.request.serverPort != '80'}">
            <c:out value=":${pageContext.request.serverPort}"/>
        </c:if>
        <c:out value="${requestScope['javax.servlet.forward.request_uri']}"/>
    </c:set>
    

    我想将它放在我的基本模板中,并在需要时在整个应用程序中使用。

    【讨论】:

      【解决方案3】:

      为避免在 jsp 中使用 scriplets,请遵循“divideByZero”的建议,并使用 ${pageContext.request.requestURI} 这是一个更好的方法。

      【讨论】:

      • 这与您引用的旧答案有何不同?
      • 答案在做什么上没有什么不同。我添加了一些说明,通过使用 ${pageContext.request.requestURI} 可以避免使用脚本。
      【解决方案4】:

      你也可以使用

      ${pageContext.request.requestURI}
      

      【讨论】:

      • 尝试给出更详细的答案。
      【解决方案5】:

      要从 JSP 文件中获取当前路径,您只需执行以下操作之一:

      <%= request.getContextPath() %>
      <%= request.getRequestURI() %>
      <%= request.getRequestURL() %>
      

      【讨论】:

        【解决方案6】:

        试试这个:

        String scheme = req.getScheme();             
        String serverName = req.getServerName(); 
        int serverPort = req.getServerPort();    
        String uri = (String) req.getAttribute("javax.servlet.forward.request_uri");
        String prmstr = (String) req.getAttribute("javax.servlet.forward.query_string");
        String url = scheme + "://" +serverName + ":" + serverPort + uri + "?" + prmstr;
        

        注意:您无法从您的网址获取 HREF 锚点。例如,如果你有 url "toc.html#top" 那么你只能得到 "toc.html"

        注意:req.getAttribute("javax.servlet.forward.request_uri") 仅在 JSP 中有效。如果你在 JSP 之前在控制器中运行它,那么结果是 null

        您可以为这两种变体使用代码:

        public static String getCurrentUrl(HttpServletRequest req) {
            String url = getCurrentUrlWithoutParams(req);
            String prmstr = getCurrentUrlParams(req);
            url += "?" + prmstr;
            return url;
        }
        
        public static String getCurrentUrlParams(HttpServletRequest request) {
            return StringUtil.safeString(request.getQueryString());
        }
        
        public static String getCurrentUrlWithoutParams(HttpServletRequest request) {
            String uri = (String) request.getAttribute("javax.servlet.forward.request_uri");
            if (uri == null) {
                return request.getRequestURL().toString();
            }
            String scheme = request.getScheme();
            String serverName = request.getServerName();
            int serverPort = request.getServerPort();
            String url = scheme + "://" + serverName + ":" + serverPort + uri;
            return url;
        }
        

        【讨论】:

        • 注意: req.getAttribute("javax.servlet.forward.request_uri") 仅适用于 JSP。如果你在 JSP 之前在控制器中运行它,那么结果是 null
        【解决方案7】:

        这些属性都不可靠,因为根据 servlet 规范(2.4、2.5 和 3.0),如果您第二次包含/转发(或者如果有人调用 getNamedDispatcher),这些属性将被覆盖。我认为获取原始请求 URI/查询字符串的唯一可靠方法是在 web.xml 中的过滤器链的开头粘贴一个过滤器,该过滤器在之前根据 request.getRequestURI()/getQueryString() 设置您自己的自定义请求属性发生任何转发/包含。

        http://www.caucho.com/resin-3.0/webapp/faq.xtp 包含对其工作原理的出色总结(减去第二次转发/包含会破坏您使用这些属性的能力的技术说明)。

        【讨论】:

          【解决方案8】:

          如果您使用 RequestDispatcher.forward() 将请求从控制器路由到视图,则请求 URI 将作为名为 javax.servlet.forward.request_uri 的请求属性公开。所以,你可以使用

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

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

          【讨论】:

          • 这不是转发视图的url,这是地址栏中url的一部分。我可以通过 request.getRequestURI() 获取转发视图的 url
          • @BalusC:他完全正确。当他将请求转发到视图(使用RequestDispatcher.forward())时,请求URI(由getRequestURI() 返回)被替换为视图URI。原始 URI(在地址栏中输入)保存为属性。
          • 如果其他人偶然发现并尝试重建 forward.request_uri 及其随附属性(查询字符串),您还需要request.getAttribute("javax.servlet.forward.query_string") 好答案。谢谢+1
          • req.getAttribute("javax.servlet.forward.request_uri") 仅在 JSP 中工作。如果你在 JSP 之前在控制器中运行它,那么结果是 null
          • 我在使用.jsp 访问页面时重定向,条件是if (request.getAttribute("javax.servlet.forward.request_uri") == null &amp;&amp; request.getRequestURI().endsWith("index.jsp"))
          猜你喜欢
          • 1970-01-01
          • 2011-07-23
          • 2014-02-25
          • 1970-01-01
          • 2011-05-01
          • 1970-01-01
          • 2013-05-06
          • 1970-01-01
          • 2015-04-18
          相关资源
          最近更新 更多