2010-11-25 118 views
101

方法request.getRequestURI()返回具有上下文路徑的URI。如何獲取沒有上下文路徑的請求URI?

例如,如果一個應用程序的基本URL是http://localhost:8080/myapp/(即上下文路徑是MyApp的),並且我請request.getRequestURI()http://localhost:8080/myapp/secure/users,它將返回/myapp/secure/users

有什麼辦法可以只得到這部分/secure/users,即沒有上下文路徑的URI?

+2

的可能重複[這是什麼在HttpServletRequest的getRequestURI和getPathInfo方法之間的區別嗎?] (http://stackoverflow.com/questions/4931323/whats-the-difference-between-getrequesturi-and-getpathinfo-methods-in-httpservl) – Leonel 2012-07-06 18:16:18

回答

124

如果你是其中一個前綴模式映射前位指示的servlet的內部,那麼你可以使用HttpServletRequest#getPathInfo()

String pathInfo = request.getPathInfo(); 
// ... 

假設在你的榜樣了一個Servlet映射/secure,那麼這將返回/users這將是一個典型的前端控制器servlet內唯一感興趣的信息。

但是,如果servlet映射到後綴模式(但是您的URL示例並不表示這是事實),或者實際上是在過濾器內部(當調用的servlet不一定沒有確定,所以getPathInfo()可以返回null),那麼你最好的賭注是串請求URI基於使用通常的方法String上下文路徑的長度自己:

HttpServletRequest request = (HttpServletRequest) req; 
String path = request.getRequestURI().substring(request.getContextPath().length()); 
// ... 
2

執行此操作的一種方法是將請求URI的servelet上下文路徑擱置。

String p = request.getRequestURI(); 
String cp = getServletContext().getContextPath(); 

if (p.startsWith(cp)) { 
    String.err.println(p.substring(cp.length()); 
} 

閱讀here

-1

可能是你可以只使用分割法來消除「/ MyApp的」 例如:

string[] uris=request.getRequestURI().split("/"); 
string uri="/"+uri[1]+"/"+uris[2]; 
+2

這將導致問題,如果我部署我的應用程序作爲根,其基本URL變成HTTP://本地主機:8080 /。在這種情況下,request.getRequestURI()將返回「/安全/用戶」,你的拆分方法將在這裏引起問題。代碼不應該依賴於部署。 – craftsman 2010-11-25 14:36:30

60
request.getRequestURI().substring(request.getContextPath().length()) 
+0

太棒了!這正是我期待的。 – craftsman 2010-11-25 14:57:41

+4

+1我認爲這是比getPathInfo更好的答案,因爲getPathInfo可以是null和其他奇怪的事實。各種各樣的Spring代碼都會執行getContextPath,並將其從URI中移除,就像您所做的一樣,而不是getPathInfo。 – 2012-01-03 14:23:00

+2

這是否會將這些servlet與負載平衡器綁定在一起? – 2012-11-23 08:23:02

11

getPathInfo()有時會返回null。在文檔中HttpServletRequest

如果沒有額外的路徑信息,此方法返回null。

我需要在Filter和getPathInfo()返回空值的文件路徑沒有上下文路徑。所以我用另一種方法:httpRequest.getServletPath()

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException 
{ 
    HttpServletRequest httpRequest = (HttpServletRequest) request; 
    HttpServletResponse httpResponse = (HttpServletResponse) response; 

    String newPath = parsePathToFile(httpRequest.getServletPath()); 
    ... 

} 
4

如果使用request.getPathInfo()一個過濾器裏面,您似乎總是空(至少在碼頭)。

這簡短無效的bug +響應暗示我認爲這個問題:

https://issues.apache.org/bugzilla/show_bug.cgi?id=28323

我懷疑它關係到servlet獲取請求之前用於過濾運行的事實。這可能是一個容器錯誤,或者我無法識別的預期行爲。

contextPath雖然可用,所以fforws解決方案即使在過濾器中也能正常工作。我不喜歡做手工,但實施是損壞或

19

使用Spring,你可以這樣做:

String path = new UrlPathHelper().getPathWithinApplication(request); 
相關問題