方法request.getRequestURI()返回带有上下文路径的URI。
例如,如果一个应用程序的基本网址http://localhost:8080/myapp/
(即上下文路径是MYAPP),和我打电话request.getRequestURI()
了http://localhost:8080/myapp/secure/users
,它将返回/myapp/secure/users
。
有什么办法可以让我们只获得这部分/secure/users
,即没有上下文路径的URI?
方法request.getRequestURI()返回带有上下文路径的URI。
例如,如果一个应用程序的基本网址http://localhost:8080/myapp/
(即上下文路径是MYAPP),和我打电话request.getRequestURI()
了http://localhost:8080/myapp/secure/users
,它将返回/myapp/secure/users
。
有什么办法可以让我们只获得这部分/secure/users
,即没有上下文路径的URI?
Answers:
如果您位于映射在前缀模式上的前contoller 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());
// ...
getServletPath()
?我正在写一个过滤器,我注意到getPathInfo()
return null
,但是getServletPath()
返回减去上下文的路径(适合传递给请求分派器)。
getPathInfo()
如果前端控制器servlet未映射在前缀模式上,则返回null。
/foo.xhtml
而不是/foo.jsf
),而不是实际的请求URI(最终用户将在浏览器的地址栏中看到该路径)。在这种情况下,原始servlet路径可以作为带有key的request属性来解析RequestDispatcher.FORWARD_SERVLET_PATH
。无论如何,该问题都会明确要求输入请求URI(例如在浏览器的地址栏中),因此答案就以此为基础。
使用Spring,您可以:
String path = new UrlPathHelper().getPathWithinApplication(request);
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());
...
}
如果在Filter中使用request.getPathInfo(),则似乎总是会得到null(至少对于jetty而言)。
这个简短的无效Bug +响应暗示了我认为的问题:
https://issues.apache.org/bugzilla/show_bug.cgi?id=28323
我怀疑这与在servlet获得请求之前运行筛选器有关。这可能是容器错误,或者是我无法识别的预期行为。
尽管contextPath可用,所以fforws解决方案甚至可以在过滤器中使用。我不喜欢手动操作,但是实现失败或
也许您可以使用split方法来消除“ / myapp”,例如:
string[] uris=request.getRequestURI().split("/");
string uri="/"+uri[1]+"/"+uris[2];