Ответ 1
После отладки перехватчики не выполняются в том порядке, в котором они были добавлены. В приведенном выше примере interceptorOne, затем interceptorTwo, тогда выполнялся обработчик (с исключенным шаблоном).
У меня есть конфигурация Java MVC, но HandlerInterceptor
не исключает некоторые шаблоны.
В строке, помеченной xxx, если
1) Я добавляю как addPatterns("/**")
, так и excludePathPatterns("*.ecxld")
в HandlerInterceptor
InterceptorRegistration
, HandlerInterceptor.preHanlde()
НЕ запускается вообще. например, .addPathPatterns("/**").excludePathPatterns("*.ecxld")
2) Я добавляю только excludePathPatterns("*.ecxld")
к HandlerInterceptor
InterceptorRegistration
, HandlerInterceptor.preHanlde()
все еще выполняется.
(другие перехватчики вызываются штрафом).
Любые указатели оценили.
Спасибо
@Configuration
public class MyMVCConfigurerAdapter extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(final InterceptorRegistry registry) {
registry.addInterceptor(getInterceptorOne());
registry.addInterceptor(getMyHandlerInterceptor())
.excludePathPatterns("*.ecxld"); // **xxx**
registry.addInterceptor(getInterceptorTwo()
);
}
После отладки перехватчики не выполняются в том порядке, в котором они были добавлены. В приведенном выше примере interceptorOne, затем interceptorTwo, тогда выполнялся обработчик (с исключенным шаблоном).
Шаблоны, которые вы указываете для include и exclude, являются ant base выражениями пути и не являются нормальными выражениями URL, как вы бы выразили в web.xml для сопоставления сервлета или фильтр, например.
Чтобы сделать исключающую работу, вы должны также включить путь включения (как вы уже заметили со вторым замечанием). Затем измените свой шаблон исключения на /**/*.ecxld
.
Ваше текущее выражение *.ecxld
будет соответствовать file.ecxld
, но оно не будет соответствовать /file.ecxld
или даже /foo/file.ecxld
. Часть /**/
позаботится об этом. Однако для его работы также требуется includePathExpression
(код проверяет, если есть includePathExpression
, если он не игнорирует excludePathExpression
).
Итак, коротко измените конфигурацию на следующую, чтобы решить вашу проблему.
@Configuration
public class MyMVCConfigurerAdapter extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(final InterceptorRegistry registry) {
registry.addInterceptor(getInterceptorOne());
registry.addInterceptor(getMyHandlerInterceptor())
.includePathPatterns("/**")
.excludePathPatterns("/**/*.ecxld");
registry.addInterceptor(getInterceptorTwo()
);
}
Я знаю, что это было давно, но я просто наткнулся на ту же проблему. Во время моего поиска я нашел следующий блог. Там упоминается, что если перехватчики настроены как beans, они будут автоматически добавлены в цепочку. Теперь я использую Spring 4.1.x, поэтому может быть разница, но для меня это было решено следующим образом:
Я изменил свое определение следующим образом:
registry.addInterceptor(getMyHandlerInterceptor()) .addPathPatterns( "/**" ) .excludePathPatterns( "/пользователь/Войти" );
Помещая addPathPatterns перед excludePathPatterns, поведение перехватчика внезапно срабатывало нормально.
Я столкнулся с этой проблемой, не могу исключить путь. После того, как я отлаживался, выяснилось, потому что Spring переадресация безопасности на "/login" из-за "/login" включена в "/**", поэтому доступ к ней невозможен.
Решение добавляет ссылку входа и выхода в систему как исключающие пути тоже!