【问题标题】:Java HttpServletRequest get URL in browsers URL barJava HttpServletRequest 在浏览器 URL 栏中获取 URL
【发布时间】:2010-11-18 09:34:34
【问题描述】:

所以我正在尝试使用 Java 的请求对象来获取页面的当前 URL。我一直在使用 request.getRequestURI() 来执行此操作,但我注意到当 java 类将我重新路由到 servlet 请求的不同页面时,getRequestURI 会给出该地址,而不是在浏览器中键入的原始 URL 和它仍然显示在浏览器中。

例如:\AdvancedSearch:
getRequestURI() 返回“\subdir\search\search.jsp”

我正在寻找一种方法来获取浏览器所看到的 URL,而不是该页面所知道的只是一个 servlet 包装器。

【问题讨论】:

标签: java jsp url servlets


【解决方案1】:

如果您当前的请求来自“应用服务器内部”转发或包含,则应用服务器应将请求信息保留为请求属性。具体属性及其包含的内容取决于您是在执行转发还是包含。

对于<jsp:include>request.getRequestURL()会返回原始父URL,包含页面的信息会在以下请求属性中找到:

     javax.servlet.include.request_uri
     javax.servlet.include.context_path
     javax.servlet.include.servlet_path
     javax.servlet.include.path_info
     javax.servlet.include.query_string

对于<jsp:forward>request.getRequestURL()会返回新的URL,原始请求的信息会在以下请求属性中找到:

     javax.servlet.forward.request_uri
     javax.servlet.forward.context_path
     javax.servlet.forward.servlet_path
     javax.servlet.forward.path_info
     javax.servlet.forward.query_string

这些在 Servlet 2.4 规范的第 8.3 和 8.4 节中有规定。

但是,请注意,此信息仅保留用于内部调度的请求。如果你有一个前端网络服务器,或者在当前容器之外调度,这些值将为空。也就是说,您可能无法找到原始请求的 URL。

【讨论】:

  • 我试过了。println(request.getAttribute("request_uri")); out.println(request.getAttribute("context_path")); out.println(request.getAttribute("servlet_path")); out.println(request.getAttribute("path_info")); out.println(request.getAttribute("query_string"));全部返回null。这是否意味着我被搞砸了?
  • 实际的属性名是“javax.servlet.include.request_uri”,而不是“request_uri”
  • 谢谢你的作品。需要在我的导航中添加更多的逻辑,但嘿省了我很多麻烦。谢谢。
【解决方案2】:
String activePage = "";
    // using getAttribute allows us to get the orginal url out of the page when a forward has taken place.
    String queryString = "?"+request.getAttribute("javax.servlet.forward.query_string");
    String requestURI = ""+request.getAttribute("javax.servlet.forward.request_uri");
    if(requestURI == "null") {
        // using getAttribute allows us to get the orginal url out of the page when a include has taken place.
        queryString = "?"+request.getAttribute("javax.servlet.include.query_string");
        requestURI = ""+request.getAttribute("javax.servlet.include.request_uri");
    }
    if(requestURI == "null") {
        queryString = "?"+request.getQueryString();
        requestURI = request.getRequestURI();
    }
    if(queryString.equals("?null")) queryString = "";
    activePage = requestURI+queryString;

【讨论】:

    【解决方案3】:

    ${requestScope['javax.servlet.forward.query_string']} -- 如果你从jsp访问它,使用表达式语言

    【讨论】:

      【解决方案4】:

      刚刚对 Ballsacian1 的解决方案做了一些整理

      String currentURL = null;
      if( request.getAttribute("javax.servlet.forward.request_uri") != null ){
          currentURL = (String)request.getAttribute("javax.servlet.forward.request_uri");
      }
      if( currentURL != null && request.getAttribute("javax.servlet.include.query_string") != null ){
          currentURL += "?" + request.getQueryString();
      }
      

      空值检查将比字符串比较更有效地运行。

      【讨论】:

      • 谢谢。虽然目前对我没有多大用处,但这是我确信将来会回到我身边的问题之一。
      • @readikus - 应该是javax.servlet.forward.query_string 而不是javax.servlet.include.query_string
      【解决方案5】:

      你可以试试这个

      <%=request.getRequestURL().toString()%>
      

      【讨论】:

        【解决方案6】:

        在不知道请求内部流状态的情况下获取HTTP请求的路径,使用这种方法:

        public String getUri(HttpServletRequest request) {
            String r = (String) request.getAttribute("javax.servlet.forward.request_uri");
            return r == null ? request.getRequestURI() : r;
        }
        

        【讨论】:

          【解决方案7】:

          与@kdgregory 的答案相同,但您可以使用 Request Dispatcher 常量。

          javax.servlet.include.request_uri        RequestDispatcher.FORWARD_REQUEST_URI
          javax.servlet.include.context_path       RequestDispatcher.FORWARD_CONTEXT_PATH
          javax.servlet.include.servlet_path       RequestDispatcher.FORWARD_SERVLET_PATH
          javax.servlet.include.path_info          RequestDispatcher.FORWARD_PATH_INFO
          javax.servlet.include.query_string       RequestDispatcher.FORWARD_QUERY_STRING
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-07-08
            • 2017-05-10
            • 2014-12-18
            • 2013-08-23
            • 1970-01-01
            相关资源
            最近更新 更多