周凯,个人博客

  • 前端
  • 嵌入式
  • 工具
  • 后端
  • 随笔
个人记录
  1. 首页
  2. 后端
  3. java
  4. 正文

SpringBoot Filter/HandlerInterceptor 中注入service为null解决方案

2023年 3月 9日 775点热度 0人点赞 0条评论

问题

  • 发现在过滤器、拦截器当中注入Service的时候会报null。

Filter

  • 因为在Filter中不能直接注入spring容器里面的对象,然后自己从容器里面取出来。
  • 代码:
@Configuration
public class UrlFilter implements Filter {

    @Autowired
    private UserInfoService userInfoService;

    @Bean
    public FilterRegistrationBean setBean(){
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter( new UrlFilter() );
        bean.addUrlPatterns("/*");
        System.out.println("注入了 filter");
        return bean;
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest)servletRequest;
        String url = request.getRequestURI() ;

        // 获取 servlet上下文
        ServletContext sc = request.getSession().getServletContext();
        // 获取 spring 容器
        AbstractApplicationContext cxt = (AbstractApplicationContext) WebApplicationContextUtils.getWebApplicationContext(sc);
        if(cxt != null && cxt.getBean("userInfoService") != null && userInfoService == null){
            // 取出 userInfoService
            userInfoService = (UserInfoService) cxt.getBean("userInfoService");
        }

        UserInfo userInfo = new UserInfo();
        userInfo.setTitle( url );
        userInfo.setPassword("filter");
        userInfo.setUsername("filter");
        userInfoService.insert(userInfo);

        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {

    }
}

HandlerInterceptor拦截器

  • 拦截器和过滤器的一个区别,过滤器不支持 @Autowired 注入,但是 拦截器支持 @Autowired注入的

  • 在WebMvcConfigurer中配置添加@Bean

@Configuration
public class URLHandlerConfig implements WebMvcConfigurer  {

    // 重点,需要添加Bean
    @Bean
    public URLHandlerInterceptor setBean2(){
        System.out.println("注入了handler");
        return new URLHandlerInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        // 多个拦截器组成一个拦截器链
        // addPathPatterns 用于添加拦截规则
        // excludePathPatterns 用户排除拦截
        //由于spring boot 2.x依赖的spring 5.x版本,使用spring 5.x时,静态资源也会执行自定义的拦截器
        //所有导致静态资源不可访问的问题
        String [] exculudes = new String[]{"/*.html","/html/**","/js/**","/css/**","/images/**"};
        registry.addInterceptor(setBean2()).addPathPatterns("/**").excludePathPatterns(exculudes);

    }

}
  • HandlerInterceptorAdapter 使用代码
@Configuration
public class URLHandlerInterceptor extends HandlerInterceptorAdapter {

    // 这里注入的service可以直接使用
    @Autowired
    private UserInfoService userInfoService;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        String url = request.getRequestURI() ;

        UserInfo userInfo = new UserInfo();
        userInfo.setTitle( url );
        userInfo.setPassword("handle");
        userInfo.setUsername("handle");
        userInfoService.insert(userInfo);

        // false 前端会显示 200
        // true 前端显示 404
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
            throws Exception {
        // 放行
        super.postHandle(request, response, handler, modelAndView);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 放行
        super.afterCompletion(request, response, handler, ex);
    }

}

🎯 拓展阅读提示

本文涉及的内容已同步至公众号后台,我会在那里分享更多深度内容和实用技巧

→ 点击关注:一行梦境

公众号二维码
本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: 暂无
最后更新:2023年 3月 9日

周凯

这个人很懒,什么都没留下

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

COPYRIGHT © 2022-现在 周凯,个人博客. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

蒙ICP备18004897号