解决SpringBoot项目,过滤器中注入redisTemplate为null

一、报错信息:

1. CaptchaFilter.java(部分代码)

2. ShiroConfig.java(部分代码)

二、造成原因:

        没有保证过滤器单例。

三、解决方案:

方案一:使用静态类的方式

        RedisBean.java

@Component
public class RedisBean {
    @Autowired
    private RedisTemplate redisTemplate;

    public static RedisTemplate redis;
    @PostConstruct
    public void getRedisTemplate(){
        redis=this.redisTemplate;
    }
}

        CaptchaFilter.java

public class CaptchaFilter extends AccessControlFilter {
    //@Resource
    //private RedisTemplate<String,Object> redisTemplate;
    /**
     * 允许访问
     * @param servletRequest
     * @param servletResponse
     * @param o
     * @return
     * @throws Exception
     */
    @Override
    protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) throws Exception {
        HttpServletRequest request = WebUtils.toHttp(servletRequest);
        // 用户输入验证码
        String code = request.getParameter("code");

        // redis中的验证码
        String key = Constants.CAPTCHA_CODE_PREFIX + request.getParameter("uuid");
        RedisTemplate redisTemplate = RedisBean.redis;
        String realCode = (String) redisTemplate.opsForValue().get(key);

        if(realCode.equalsIgnoreCase(code)){
            // 验证码正确
            redisTemplate.delete(key);
            return true;
        }
        // 验证码错误
        redisTemplate.delete(key);
        return false;
    }

    /**
     * 拒绝访问
     * @param servletRequest
     * @param servletResponse
     * @return
     * @throws Exception
     */
    @Override
    protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception {
        HttpServletResponse response = WebUtils.toHttp(servletResponse);
        // 响应格式-json串
        response.setContentType("application/json;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.println(JSONUtil.toJsonStr(AjaxResult.fail("验证码错误!!!")));
        return false;
    }
}

方案二:将过滤器由spring管理

        方法一:使用@Component

    CaptchaFilter.java

        ShiroConfig.java

   @Resource
   private CaptchaFilter captchaFilter;
   @Bean
   public ShiroFilterFactoryBean getShiroFilterFactoryBean(){
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager());
        Map<String, Filter> filterMap = new HashMap<>();
        // 注意可以将多个过滤器交给spring托管,除非保证过滤器执行顺序
        filterMap.put("captchaFilter",captchaFilter);
        filterMap.put("jwtFilter",new JwtFilter());
        // filterMap中添加登出过滤器
        shiroFilterFactoryBean.setFilters(filterMap);
        Map<String,String> map = new HashMap<>();
        map.put("/captchaImage","anon");
        map.put("/login","captchaFilter");
        map.put("/refreshToken","anon");
        map.put("/logout","logout");
        map.put("/**","jwtFilter");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
        return shiroFilterFactoryBean;
   }

        方法二:使用@Bean

    CaptchaFilter.java

        ShiroConfig.java

    @Bean
    public CaptchaFilter captchaFilter(){
        return new CaptchaFilter();
    }
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(){
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager());
        Map<String, Filter> filterMap = new HashMap<>();
        // 注意可以将多个过滤器交给spring托管,除非保证过滤器执行顺序
        filterMap.put("captchaFilter",captchaFilter());
        filterMap.put("jwtFilter",new JwtFilter());
        // filterMap中添加登出过滤器
        shiroFilterFactoryBean.setFilters(filterMap);
        Map<String,String> map = new HashMap<>();
        map.put("/captchaImage","anon");
        map.put("/login","captchaFilter");
        map.put("/refreshToken","anon");
        map.put("/logout","logout");
        map.put("/**","jwtFilter");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
        return shiroFilterFactoryBean;
    }

注意:可以将多个过滤器交给spring托管,但要保证过滤器执行顺序,否则,会造成前端请求路径无效

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值