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

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

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

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

296232 次浏览

做到这一点的一种方法是使请求 URI 中的 servlet 上下文路径休息。

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


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

阅读 给你

也许你可以只使用分割方法来消除’/myapp’ 例如:

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

如果您在一个前端控制器 servlet 中,该 servlet 映射到一个前缀模式(如 /foo/*) ,那么您可以只使用 HttpServletRequest#getPathInfo()

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

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

如果 servlet 被映射到一个后缀模式,比如 *.foo(你的 URL 示例并没有指出这种情况) ,或者当你实际上在一个过滤器中(当被调用的 servlet 还没有被确定,所以 getPathInfo()可以返回 null) ,那么你最好的选择是使用通常的 String方法,根据上下文路径的长度自己对请求 URI 进行子串:

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

GetPathInfo ()有时返回 null

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

我需要得到文件的路径没有上下文路径在过滤器和 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());
...


}

如果在 Filter 中使用 request.getPathInfo () ,似乎总是会得到 null (至少在使用 jetty 时是这样)。

这个简短的无效 bug + 响应暗示了我认为的问题:

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

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

不过 contextPath 是可用的,所以 fforws 解决方案甚至可以在过滤器中工作。我不喜欢用手工完成,但是实现出了问题

有了春天,你可以做到:

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