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

问题

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

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

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


#1 热门回答(134 赞)

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

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

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

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

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

#2 热门回答(62 赞)

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

#3 热门回答(21 赞)

使用Spring,你可以:

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