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

cra*_*man 119 java servlets

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

例如,如果一个应用程序的基本网址http://localhost:8080/myapp/(即上下文路径是MYAPP),和我打电话request.getRequestURI()http://localhost:8080/myapp/secure/users,它将返回/myapp/secure/users.

有没有办法我们只能得到这个部分/secure/users,即没有上下文路径的URI?

Bal*_*usC 150

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

String pathInfo = request.getPathInfo();
// ...
Run Code Online (Sandbox Code Playgroud)

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

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

HttpServletRequest request = (HttpServletRequest) req;
String path = request.getRequestURI().substring(request.getContextPath().length());
// ...
Run Code Online (Sandbox Code Playgroud)

  • 是否有理由使用它而不是`getServletPath()`?我正在编写一个过滤器,我注意到`getPathInfo()` 返回`null`,但`getServletPath()` 返回减去上下文的路径(适合传递给请求调度程序)。 (2认同)

ffo*_*orw 71

request.getRequestURI().substring(request.getContextPath().length())
Run Code Online (Sandbox Code Playgroud)

  • +1我认为这是一个比getPathInfo更好的答案,因为getPathInfo可以为null和其他奇怪的事实.各种Spring代码执行getContextPath并将其从URI中删除,就像您已经完成而不是getPathInfo一样. (4认同)
  • 这会使这些servlet绑定负载平衡器吗? (2认同)

Jam*_*mes 31

使用Spring,您可以:

String path = new UrlPathHelper().getPathWithinApplication(request);
Run Code Online (Sandbox Code Playgroud)


luk*_*ymo 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());
    ...

}
Run Code Online (Sandbox Code Playgroud)


the*_*man 6

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

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

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

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

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


Pet*_*Mmm 5

一种方法是从请求URI保留servelet上下文路径。

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

if (p.startsWith(cp)) {
  String.err.println(p.substring(cp.length());
}
Run Code Online (Sandbox Code Playgroud)

在这里阅读。