Java HttpServletRequest get URL in browsers URL bar

2022-09-01 19:57:03

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

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

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


答案 1

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

对于 ,原始父 URL 将由 返回,有关所包含页面的信息将在以下请求属性中找到:<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

对于 ,新的 URL 将由 返回,原始请求的信息将在以下请求属性中找到:<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。换句话说,您可能找不到原始请求 URL。


答案 2

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

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