2009-08-10 175 views
23

所以我试图用Java的请求对象来抓取页面的当前URL。我一直在使用request.getRequestURI()来预处理这个,但我注意到当一个java类将我重定向到一个不同的页面时,servlet请求getRequestURI给出了该地址,而不是在浏览器中输入的原始URL,它仍然在浏览器中显示。Java HttpServletRequest在浏览器中获取URL地址栏

例如:\填写AdvancedSearch:
getRequestURI()返回“\子目录\搜索\ search.jsp的”

我正在寻找一种方式来抓取浏览器看到的内容为网址,而不是该页面知道是什么只有一个servlet包装器。

+0

下面将链接答案肯定帮助别人。 [http://stackoverflow.com/questions/8024344/user-login-with-jsf-2-0/39379256#39379256](http://stackoverflow.com/questions/8024344/user-login-with-jsf -2-0/39379256#39379256) – 2016-09-07 21:31:45

回答

38

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

对于<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 

这些载于8.3节和Servlet 2.4规范的8.4。

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

+0

我试过out.println(request.getAttribute(“request_uri”)); \t out.println(request.getAttribute(“context_path”)); \t out.println(request.getAttribute(“servlet_path”)); \t out.println(request.getAttribute(“path_info”)); \t out。的println(request.getAttribute( “QUERY_STRING”)); 全部返回null。这是否意味着我被搞砸了? – Ballsacian1 2009-08-10 19:12:22

+4

实际的属性名称是“javax.servlet.include.request_uri”,而不是“request_uri” – kdgregory 2009-08-10 19:16:50

+0

谢谢你的作品。在我的导航中需要添加更多的逻辑,但是嘿,为我节省了很多麻烦。谢谢。 – Ballsacian1 2009-08-10 19:49:15

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

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

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

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

+0

感谢您的支持。虽然目前对我没有多大用处,但这是我肯定会在未来回到我身边的那些问题之一。 – Ballsacian1 2012-09-05 02:18:34

+0

@readikus - 应该是'javax.servlet.forward.query_string'而不是'javax.servlet.include.query_string'吗? – 2017-07-05 17:18:40

1

你可以试试这个

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

要获得HTTP请求的路径不知道请求的内部流动的状态下,使用此方法:

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