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

所以我试图抓住使用Java的请求对象的页面的当前url。 我一直在使用request.getRequestURI()来执行此操作,但是我注意到,当一个java类将我redirect到一个不同的页面时,servlet请求getRequestURI给出了这个地址,而不是在浏览器中input的原始URL它仍然在浏览器中显示。

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

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

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

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

  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()返回,原始请求的信息将在以下请求属性中find:

  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服务器,或者在当前容器之外调度,则这些值将为空。 换句话说,您可能无法find原始请求url。

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

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

空检查将比string比较运行更有效。

 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; 

$ {requestScope ['javax.servlet.forward.query_string']} – 如果你使用expression式语言

你可以试试这个吗?

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

要获取HTTP请求的path而不知道请求的内部stream的状态,使用这个方法:

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