Подтвердить что ты не робот

MVC Java Config - HandlerInterceptor не исключает пути

У меня есть конфигурация 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()
     );

 }
4b9b3361

Ответ 1

После отладки перехватчики не выполняются в том порядке, в котором они были добавлены. В приведенном выше примере interceptorOne, затем interceptorTwo, тогда выполнялся обработчик (с исключенным шаблоном).

Ответ 2

Шаблоны, которые вы указываете для 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()
     );

 }

Ответ 3

Я знаю, что это было давно, но я просто наткнулся на ту же проблему. Во время моего поиска я нашел следующий блог. Там упоминается, что если перехватчики настроены как beans, они будут автоматически добавлены в цепочку. Теперь я использую Spring 4.1.x, поэтому может быть разница, но для меня это было решено следующим образом:

  • (Я пытался избежать определения их как Spring beans. Это не помогло.)
  • Я сконфигурировал перехватчики как Spring beans (так что я мог бы прочесть в них материал здесь)
  • Я изменил свое определение следующим образом:

    registry.addInterceptor(getMyHandlerInterceptor()) .addPathPatterns( "/**" ) .excludePathPatterns( "/пользователь/Войти" );

Помещая addPathPatterns перед excludePathPatterns, поведение перехватчика внезапно срабатывало нормально.

Ответ 4

Я столкнулся с этой проблемой, не могу исключить путь. После того, как я отлаживался, выяснилось, потому что Spring переадресация безопасности на "/login" из-за "/login" включена в "/**", поэтому доступ к ней невозможен.

Решение добавляет ссылку входа и выхода в систему как исключающие пути тоже!