Java HttpServletRequest在浏览器URL栏中获取URL

时间:2009-08-10 18:50:59

标签: java jsp url servlets

所以我试图使用Java的请求对象获取页面的当前URL。我一直在使用request.getRequestURI()来预先形成这个,但是我注意到当一个java类将我重新路由到servlet请求的另一个页面时,getRequestURI给出了该地址而不是在浏览器中键入的原始URL仍然在浏览器中显示。

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

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

7 个答案:

答案 0 :(得分:40)

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

对于<jsp:include>,原始父网址将由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>,新网址将由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。换句话说,您可能无法找到原始请求网址。

答案 1 :(得分:8)

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

null检查将比String比较更有效地运行。

答案 2 :(得分: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;

答案 3 :(得分:4)

$ {requestScope [&#39; javax.servlet.forward.query_string&#39;]}   - 如果您使用表达式语言

从jsp访问它

答案 4 :(得分:1)

你能试试吗

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

答案 5 :(得分:1)

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

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

答案 6 :(得分:0)

答案与@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