Как указать шаблон URL для фильтров сервлетов в WebApplicationInitializer?

Я конвертирую файл web.xml в конфигурацию на основе Java, используя Spring-web WebApplicationInitializer. Ниже приведен пример фильтра, определенного

<filter>
        <filter-name>sampleFilter</filter-name>
        <filter-class>com.SampleFilter</filter-class>
</filter>
<filter-mapping>
        <filter-name>sampleFilter</filter-name>
        <url-pattern>/sampleUrl</url-pattern>
</filter-mapping>

и теперь класс WebApplicationInitializer выглядит так

class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer{
   @Override
  protected Filter[] getServletFilters() {
    return new Filter[]{new SampleFilter()};
  }
  //other methods
} 

Но, как видите, фильтр применяется ко всем ресурсам, а я хочу сопоставить фильтр только для /sampleUrl. Как мы это делаем?


person sidgate    schedule 16.02.2016    source источник
comment
Нет... Применяется не ко всем ресурсам DispatcherServlet. Похоже, это так, потому что DispatcherServlet по умолчанию зарегистрирован на /. Если вы этого не хотите, переопределите onStartup в вашем инициализаторе, зарегистрируйте фильтр и вызовите super.onStartup.   -  person M. Deinum    schedule 16.02.2016


Ответы (1)


Ниже приведен полный пример, который я использовал в одном из своих проектов:

@Override
public void onStartup(ServletContext servletContext) throws ServletException {
    AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();

    //add MVC dispatcher servlet and map it to /
    ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", new DispatcherServlet(rootContext));
    dispatcher.setLoadOnStartup(1);
    dispatcher.addMapping("/");
    dispatcher.setAsyncSupported(true);

    //add spring characterEncoding filter
    //to always have encoding on all requests
    EnumSet<DispatcherType> dispatcherTypes = EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD, DispatcherType.ERROR);

    CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
    characterEncodingFilter.setEncoding("UTF-8");
    characterEncodingFilter.setForceEncoding(true);

    FilterRegistration.Dynamic characterEncoding = servletContext.addFilter("characterEncoding", characterEncodingFilter);
    characterEncoding.addMappingForUrlPatterns(dispatcherTypes, true, "/*");
    characterEncoding.setAsyncSupported(true);

    // specifies that the parser produced by this factory will
    // validate documents as they are parsed.
    SAXParserFactory.newInstance().setValidating(false);

    // add spring contextloader listener
    servletContext.addListener(new ContextLoaderListener(rootContext));
}
person David H.    schedule 16.02.2016