Программное добавление фильтра и параметров инициализации

Мне нужно скопировать содержимое web.xml в WebAppInitializer.class (класс конфигурации Java). Я скопировал класс YahooFilter из web.xml (см. код), но я не уверен, как прагматично добавить параметры инициализации.

Ниже я вставил файл web.xml и фрагмент класса конфигурации Java. Может кто-нибудь взглянуть и оставить отзыв?

<web-app> 
     <display-name>sample</display-Aname> 
     <filter> 
         <filter-name>YOSFilter</filter-name> 
         <filter-class>com.yahoo.yos.YahooFilter</filter-class> 


         <!--  
         optional param - 
         underlying oauth client class 
         possible values: 
             net.oauth.client.URLConnectionClient (default) 
             net.oauth.client.httpclient3.HttpClient3 
             net.oauth.client.httpclient4.HttpClient4 
         --> 
         <init-param> 
             <param-name>oauthConnectionClass</param-name> 
             <param-value>net.oauth.client.httpclient4.HttpClient4</param-value> 
         </init-param> 
         <!--  
         optional param - 
         redirect end-user if an access token is not found, set to false if you  
         are only making two-legged oauth calls e.g. oauth calls without an  
         access token to retrieve public information 
         defauts to true 
         --> 
         <init-param> 
             <param-name>redirect</param-name> 
             <param-value>true</param-value> 
         </init-param> 
     </filter> 


     <!-- 
     The URL where the filter is mapped to will redirect the user to Yahoo for 
     authorization if an OAuth authorization token has not been obtained for the 
     user.  Should correspond to your callback url 
     --> 


     <filter-mapping> 
         <filter-name>YOSFilter</filter-name> 
         <url-pattern>/login.jsp</url-pattern> 
     </filter-mapping> 
 </web-app> 

Класс конфигурации Java

    public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
     ...

            @Override
        protected void registerDispatcherServlet(ServletContext servletContext) {
                    super.registerDispatcherServlet(servletContext);
            servletContext.addListener(new HttpSessionEventPublisher());

           // servletContext.addListener(new RequestContextListener());      
        }

             @Override
            protected Filter[] getServletFilters() {
                     DelegatingFilterProxy delegatingFilterProxy =  new DelegatingFilterProxy();
                    delegatingFilterProxy.setTargetBeanName("springSecurityFilterChain");
                    // FilterConfig filterConfig = delegatingFilterProxy.getFilterConfig();

                     YahooFilter yosFilter = new YahooFilter();


                    return  new Filter[] {delegatingFilterProxy,yosFilter};
            }
    }

person Jamie White    schedule 16.11.2014    source источник


Ответы (1)


Попробуйте переопределить метод onStartup() и программно зарегистрируйте свой фильтр с помощью ServletContext следующим образом:

@Override
public void onStartup(ServletContext servletContext) throws ServletException {
    FilterRegistration yahooFilter = servletContext.addFilter("yahooFilter", new YahooFilter());
    yahooFilter.setInitParameter("oauthConnectionClass", "net.oauth.client.httpclient4.HttpClient4");
    yahooFilter.setInitParameter("redirect", "true");
}
person Bohuslav Burghardt    schedule 16.11.2014
comment
@Bohuslav_Burghardt Предназначен ли этот ответ в дополнение или вместо того, что исходный постер делает в своем коде getServletFilters()? И если ответ в дополнение к то какова связь между yahooFilter и yosFilter? - person Steve Cohen; 22.09.2015
comment
@SteveCohen OP добавляет фильтры в метод getServletFilters, который просто создает массив из Filter объектов. Мое решение включает регистрацию фильтра через контекст сервлета в методе onStartup, который возвращает FilterRegistration объект, позволяющий задавать параметры инициализации. Таким образом, это решение вместо исходного, а не в дополнение. yahooFilter вместо yosFilter — это просто название, которое мне показалось более логичным. - person Bohuslav Burghardt; 28.09.2015
comment
Я получаю параметр инициализации в фильтре как null, можете ли вы показать пример обработки перенаправления в фильтре? - person user7294900; 23.05.2019