我正在运行一个Spring Boot 1.2.3应用程序,其中包含嵌入式Tomcat。
我想在每个请求上注入自定义的contextPath,基于URL的第一部分。
例如:
1. http://localhost:8080/foo 默认情况下具有 contextPath="",应该得到 contextPath="foo" 2. http://localhost:8080/foo/bar 默认情况下具有 contextPath="",应该得到 contextPath="foo"
(不带路径的URL应保持不变)
我尝试编写了一个自定义的javax.servlet.Filter,并使用@Order(Ordered.HIGHEST_PRECEDENCE),但似乎缺少了一些东西。这是代码:
我想在每个请求上注入自定义的contextPath,基于URL的第一部分。
例如:
1. http://localhost:8080/foo 默认情况下具有 contextPath="",应该得到 contextPath="foo" 2. http://localhost:8080/foo/bar 默认情况下具有 contextPath="",应该得到 contextPath="foo"
(不带路径的URL应保持不变)
我尝试编写了一个自定义的javax.servlet.Filter,并使用@Order(Ordered.HIGHEST_PRECEDENCE),但似乎缺少了一些东西。这是代码:
@Component @Order(Ordered.HIGHEST_PRECEDENCE)
public class MultiTenancyFilter implements Filter {
private final static Pattern pattern = Pattern.compile("^/(?<contextpath>[^/]+).*$");
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
final HttpServletRequest req = (HttpServletRequest) request;
final String requestURI = req.getRequestURI();
Matcher matcher = pattern.matcher(requestURI);
if(matcher.matches()) {
chain.doFilter(new HttpServletRequestWrapper(req) {
@Override
public String getContextPath() {
return "/"+matcher.group("contextpath");
}
}, response);
}
}
@Override public void init(FilterConfig filterConfig) throws ServletException {}
@Override public void destroy() {}
}
这应该简单地获取第一个/
后面的字符串,并在(如果有)第二个/
之前使用它作为getContextPath()
的返回值。
但是,Spring @Controller @RequestMapping和Spring Security的antMatchers("/")
似乎不尊重它。两者仍然像contextPath = ""
一样工作。
我如何动态覆盖每个请求的上下文路径?