如何获取没有上下文路径的请求URI?

时间:2010-11-25 14:26:28

标签: java servlets

方法request.getRequestURI()返回带有上下文路径的URI。

例如,如果应用程序的基本网址为http://localhost:8080/myapp/(即上下文路径为 myapp ),并且我为request.getRequestURI()调用http://localhost:8080/myapp/secure/users,它将返回/myapp/secure/users

我们有什么方法可以只得到这个部分/secure/users,即没有上下文路径的URI?

7 个答案:

答案 0 :(得分:147)

如果你在一个映射在前缀模式上的前控制器servlet中,那么你可以使用HttpServletRequest#getPathInfo()

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

假设示例中的servlet映射到/secure,那么这将返回/users,这将是典型前端控制器servlet中唯一感兴趣的信息。

但是,如果servlet映射到后缀模式(但是您的URL示例并未表明是这种情况),或者当您实际位于过滤器内时(当未调用要调用的servlet时)但是,getPathInfo()可以返回null),那么最好的办法就是使用通常的String方法根据上下文路径的长度自己对请求URI进行子串:

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

答案 1 :(得分:69)

request.getRequestURI().substring(request.getContextPath().length())

答案 2 :(得分:29)

使用Spring,您可以:

String path = new UrlPathHelper().getPathWithinApplication(request);

答案 3 :(得分:15)

getPathInfo()有时会返回null。在文档HttpServletRequest

  

如果没有额外的路径信息,则此方法返回null。

我需要在Filter中获取没有上下文路径的文件路径,并且getPathInfo()返回null。所以我使用另一种方法: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 :(得分:6)

如果在Filter中使用request.getPathInfo(),则总是看起来为null(至少使用jetty)。

这个简洁无效的错误+回应暗示了我认为的问题:

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

我怀疑它与servlet获取请求之前运行的过滤器有关。它可能是容器错误,或者我无法识别的预期行为。

虽然contextPath可用,但fforws解决方案甚至可以在过滤器中使用。我不喜欢手工完成,但实施已经破坏或

答案 5 :(得分:5)

执行此操作的方法是从请求URI中休息servlet上下文路径。

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

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

阅读here

答案 6 :(得分:-1)

可能你可以使用split方法来消除'/ myapp' 例如:

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