2010-11-25 114 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); 
相关问题