Мне интересно, как я могу установить в web.xml фильтр, который вызывается по каждому запросу?
Фильтр сервлета для всех запросов
Ответ 1
просто создайте фильтр и сопоставьте его с /*
например.
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.mycompany.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Ответ 2
Добавить сопоставление фильтра с подстановочным знаком '*'.
<filter-mapping>
<filter-name>TestFilter</filter-name>
<url-pattern>*</url-pattern>
</filter-mapping>
Ответ 3
Вы уверены, что запрос попал в контроллер/сервлет? Если он делает Ajax-вызов или запускает JS, фильтр не срабатывает.
Ответ 4
Spring Security Web определяет все URL-адреса как /**
. Так что должно работать на все запросы.
See- org.springframework.security.web.util.matcher.AntPathRequestMatcher
Он определяет постоянную MATCH_ALL
как /**
и эта последняя переменная используется в методе matches
.
Вставка ниже определения метода из org.springframework.security.web.util.matcher.AntPathRequestMatcher
где он решает, соответствует ли какой-либо URL-адрес запроса или нет. Если шаблон установлен в MATCH_ALL
aka /**
он возвращает true
.
public boolean matches(HttpServletRequest request) {
if (this.httpMethod != null && StringUtils.hasText(request.getMethod())
&& this.httpMethod != valueOf(request.getMethod())) {
if (logger.isDebugEnabled()) {
logger.debug("Request '" + request.getMethod() + " "
+ getRequestPath(request) + "'" + " doesn't match '"
+ this.httpMethod + " " + this.pattern + "'");
}
return false;
}
if (this.pattern.equals(MATCH_ALL)) {
if (logger.isDebugEnabled()) {
logger.debug("Request '" + getRequestPath(request)
+ "' matched by universal pattern '/**'");
}
return true;
}
String url = getRequestPath(request);
if (logger.isDebugEnabled()) {
logger.debug("Checking match of request : '" + url + "'; against '"
+ this.pattern + "'");
}
return this.matcher.matches(url);
}