方法 GetRequestURI ()返回带有上下文路径的 URI。
例如,如果应用程序的基 URL 是 http://localhost:8080/myapp/(即上下文路径是 我的应用) ,我为 http://localhost:8080/myapp/secure/users调用 request.getRequestURI(),它将返回 /myapp/secure/users。
http://localhost:8080/myapp/
http://localhost:8080/myapp/secure/users
request.getRequestURI()
/myapp/secure/users
有没有办法只得到这部分 /secure/users,即没有上下文路径的 URI?
/secure/users
做到这一点的一种方法是使请求 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()。
/foo/*
HttpServletRequest#getPathInfo()
String pathInfo = request.getPathInfo(); // ...
假设示例中的 servlet 映射在 /secure/*上,那么它将返回 /users,这将是典型的前端控制器 servlet 中唯一感兴趣的信息。
/secure/*
/users
如果 servlet 被映射到一个后缀模式,比如 *.foo(你的 URL 示例并没有指出这种情况) ,或者当你实际上在一个过滤器中(当被调用的 servlet 还没有被确定,所以 getPathInfo()可以返回 null) ,那么你最好的选择是使用通常的 String方法,根据上下文路径的长度自己对请求 URI 进行子串:
*.foo
getPathInfo()
null
String
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);