Я запускаю приложение Spring Boot 1.2.3 со встроенным Tomcat.Весенняя загрузка: введите собственный путь к контексту
Я хотел бы ввести пользовательский contextPath для каждого запроса, основываясь на первой части URL-адреса.
Примеры:
http://localhost:8080/foo
имеет по умолчаниюcontextPath=""
и должен получитьcontextPath="foo"
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()
.
Но весна @Controller @RequestMapping и Spring Security-х antMatchers("/")
, кажется, не уважает его. Оба по-прежнему работают как contextPath=""
.
Как я могу динамически переопределить путь контекста для каждого запроса?