Java HttpServletRequest如何获取浏览器地址栏中的URL

24

我正在尝试使用Java的请求对象获取当前页面的URL。 我一直在使用request.getRequestURI()来执行此操作,但是我注意到当Java类将我重定向到另一个页面时,getRequestURI会给出该地址,而不是在浏览器中键入的原始URL,并且仍显示在浏览器中。

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

我正在寻找一种方法来获取浏览器视为URL,而不是页面知道只是Servlet包装器的内容。


下面链接中的答案肯定会对某些人有所帮助。 https://dev59.com/NFzUa4cB1Zd3GeqP7_Gk#39379256 - Tunde Michael
7个回答

43

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

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

     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>,新的URL将被 request.getRequestURL() 返回,原始请求的信息将在以下请求属性中找到:

     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 节中有详细说明。

但要注意的是,这些信息仅对内部请求保留。如果您使用前端 Web 服务器或在当前容器之外进行分派,则这些值将为 null。换句话说,您可能无法找到原始请求 URL。


我尝试了以下代码: out.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。这是否意味着我完蛋了? - Ballsacian1
4
属性的实际名称是"javax.servlet.include.request_uri",而不是"request_uri"。 - kdgregory
谢谢,这很有效。需要在我的导航中添加更多的逻辑,但是它可以帮我省去很多麻烦。谢谢。 - Ballsacian1

9

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();
}

空值检查比字符串比较更高效。

谢谢这个。虽然现在对我来说没有太大用处,但这是那种我相信将来会回到我的问题之一。 - Ballsacian1
@readikus - 这应该是 javax.servlet.forward.query_string 而不是 javax.servlet.include.query_string,对吗? - Stephen Rudolph

5
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;

4

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

(该文本为关于在 JSP 中访问查询字符串的说明)

1

如果不知道请求的内部流程状态,想要获取HTTP请求路径,请使用以下方法:

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

1
你能试一下这个吗?
<%=request.getRequestURL().toString()%>

0

和@kdgregory给出的答案一样,但是你可以使用请求调度常量来代替。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接