2015-06-23 46 views
3

我用Spring 4.1.6構建應用程序,我擁有java類中的所有配置。我的AppConfig:Spring 4 autowire過濾器

@Configuration 
    @EnableWebMvc 
    @ComponentScan(basePackages = "pl.wrweb.springrest") 
    public class AppConfig extends WebMvcConfigurerAdapter { 

    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 

    } 

    @Override 
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { 
     configurer.enable(); 
    } 

    @Bean(name = "messageSource") 
    public ReloadableResourceBundleMessageSource getMessageSource() { 
     ReloadableResourceBundleMessageSource resource = new ReloadableResourceBundleMessageSource(); 
     resource.setBasename("classpath:messages"); 
     resource.setDefaultEncoding("UTF-8"); 
     return resource; 
    } 

} 

AppInitializer:

public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { 

    public void onStartup(ServletContext container) throws ServletException { 


     AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); 
     ctx.register(AppConfig.class); 
     ctx.setServletContext(container); 
     ServletRegistration.Dynamic servlet = container.addServlet("dispatcher", new DispatcherServlet(ctx)); 
     servlet.setLoadOnStartup(1); 
     servlet.addMapping("/"); 

     container.addFilter("customFilter", new DelegatingFilterProxy(new CustomFilter())).addMappingForUrlPatterns(null, true, "/*"); 

    } 

    @Override 
    protected String[] getServletMappings() { 
     return new String[0]; 
    } 


    @Override 
    protected Class<?>[] getRootConfigClasses() { 
     return new Class<?>[0]; 
    } 

    @Override 
    protected Class<?>[] getServletConfigClasses() { 
     return new Class<?>[0]; 
    } 
} 

和我CustomFilter:

@Configuration 
@EnableWebSecurity 
public class CustomFilter implements Filter { 

    @Autowired 
    UserService userService; 

    public void init(FilterConfig fc) throws ServletException { 

    } 

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain fc) throws IOException, ServletException { 

     HttpServletRequest httpServletRequest = (HttpServletRequest) req; 
     HttpServletResponse response = (HttpServletResponse) res; 

     if (httpServletRequest.getRequestURI().contains("/employee/")) { 
      String token = httpServletRequest.getHeader("x-token"); 
      System.out.println("token " + token); 
      Long userId = TokenUtils.getUserNameFromToken(token); 
      System.out.println("ObjectStore.token " + ObjectStore.token); 

      if (token!=null) { 
       if (token.equals(String.valueOf(ObjectStore.token))) { 
        int index = ObjectStore.token++; 
        ObjectStore.token = index+1; 
        System.out.println("index " +ObjectStore.token + "token " + token); 
        response.setHeader("x-token", String.valueOf(ObjectStore.token)); 
        fc.doFilter(req, response); 
       } else { 
        response.sendError(HttpStatus.FORBIDDEN.value()); 
        fc.doFilter(req, response); 
        return; 
       } 
      } else { 
       response.sendError(HttpStatus.FORBIDDEN.value()); 
       fc.doFilter(req, response); 
       return; 
      } 
     } else { 
      fc.doFilter(req, res); 
     } 
    } 

    public void destroy() { 

    } 

} 

一切工作正常,但我不能注入userService,它是空的,我需要這個檢查令牌請求。

+0

可能會有所幫助:http://stackoverflow.com/questions/9690754/spring-and-autowired-on-a-delegatingfilterproxy – Arpit

+1

我嘗試,但我想在Java配置中做ii。 – Johny0987

+0

@ Johny0987,我也面臨同樣的問題。你有沒有想到我們的這個解決方案在spring-boot中呢? – kaluva

回答

1

嗨,你應該使用這樣的代碼!

private UserService userService; 

然後

public void init(FilterConfig fc) throws ServletException { 
    ApplicationContext app = WebApplicationContextUtils.getRequiredWebApplicationContext(fc.getServletContext()); 
    userService= app.getBean(UserService.class); 
} 
+0

是的,這是正確的! –