springboot拦截器无法注入redisTemplate的解决方法


Posted in Java/Android onJune 27, 2021

在工作中我们经常需要做登录拦截验证或者其他拦截认证功能,基于springboot项目下我们很容易想到结合redis做的分布式拦截,把用户登录或者需要验证的信息放到redis里面。但是在写拦截器的时候发现redisTemplate一直无法注入进来,最后查资料才发现springboot拦截器是在Bean实例化之前执行的,所以Bean实例无法注入。

先看下问题,新建一个拦截器,然后注入redisTemplate

/**
 * @author: lockie
 * @Date: 2019/8/13 16:16
 * @Description: 接口限流拦截器
 */
@Component
public class AccessLimitIntercept implements HandlerInterceptor {
    private static final Logger logger = LoggerFactory.getLogger(AccessLimitIntercept.class);
 
    @Autowired
    private StringRedisTemplate redisTemplate;
 
    /**
     * 接口调用前检查对方ip是否频繁调用接口
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        try {
 
            String test = redisTemplate.opsForValue().get("test");
            logger.info(test);
        } catch (Exception e) {
            logger.error("API请求限流拦截异常,异常原因:", e);
            throw new ParameterException(e);
        }
        return true;
    }
 
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
 
    }
 
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
 
    }
 
    private boolean setResponse(Results results, HttpServletResponse response) throws IOException {
        ServletOutputStream outputStream = null;
        try {
            response.setHeader("Content-type", "application/json; charset=utf-8");
            outputStream = response.getOutputStream();
            outputStream.write(JsonUtil.toJson(results).getBytes("UTF-8"));
        } catch (Exception e) {
            logger.error("setResponse方法报错", e);
            return false;
        } finally {
            if (outputStream != null) {
                outputStream.flush();
                outputStream.close();
            }
        }
        return true;
    }
}

然后配置拦截器,新建一个拦截器config类,我们这里让所有的url都拦截

@Configuration
public class WebFilterConfig implements WebMvcConfigurer {
 
	/**
	 * 多个拦截器组成一个拦截器链
	 * @param registry
	 */
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(new AccessLimitIntercept()).addPathPatterns("/**");
	}
 
}

新建一个controller里面增加一个接口,使用postman调用接口

@RestController
@RequestMapping("/")
public class PingController extends BaseController {
 
	@GetMapping(value = "/ping")
	public Results ping() {
		return succeed("pong", "");
	}
 
}

使用postman调用/ping接口,发现返回系统错误

springboot拦截器无法注入redisTemplate的解决方法

控制台发现是空指针的错误,定位错误发现当我们想获取redis里面key是test的值时,发现redisTemplate没有是空的没有注入进来

springboot拦截器无法注入redisTemplate的解决方法

解决问题:

知道拦截器执行在bean实例化前执行的,那么我们就让拦截器执行的时候实例化拦截器Bean,在拦截器配置类里面先实例化拦截器,然后再获取

springboot拦截器无法注入redisTemplate的解决方法

@Configuration
public class WebFilterConfig implements WebMvcConfigurer {
 
	/**
	 * 这里需要先将限流拦截器入住,不然无法获取到拦截器中的redistemplate
	 * @return
	 */
	@Bean
	public AccessLimitIntercept getAccessLimitIntercept() {
		return new AccessLimitIntercept();
	}
 
	/**
	 * 多个拦截器组成一个拦截器链
	 * @param registry
	 */
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(getAccessLimitIntercept()).addPathPatterns("/**");
	}
 
 
}

使用postman再次请求就可以访问到

springboot拦截器无法注入redisTemplate的解决方法

到此这篇关于springboot拦截器无法注入redisTemplate的解决方法的文章就介绍到这了,更多相关springboot拦截器无法注入redisTemplate内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Java/Android 相关文章推荐
解决ObjectMapper.convertValue() 遇到的一些问题
Jun 30 Java/Android
SpringBoot工程下使用OpenFeign的坑及解决
Jul 02 Java/Android
解决persistence.xml配置文件修改存放路径的问题
Feb 24 Java/Android
Spring Bean是如何初始化的详解
Mar 22 Java/Android
java后台调用接口及处理跨域问题的解决
Mar 24 Java/Android
Dubbo+zookeeper搭配分布式服务的过程详解
Apr 03 Java/Android
Java中API的使用方法详情
Apr 06 Java/Android
Java 定时任务技术趋势简介
May 04 Java/Android
Java死锁的排查
May 11 Java/Android
Android Studio实现带三角函数对数运算功能的高级计算器
May 20 Java/Android
Java异常体系非正常停止和分类
Jun 14 Java/Android
MyBatis在注解上使用动态SQL方式(@select使用if)
Jul 07 Java/Android
Java中PriorityQueue实现最小堆和最大堆的用法
探讨Java中的深浅拷贝问题
解决SpringBoot跨域的三种方式
Jun 26 #Java/Android
分析Java中Map的遍历性能问题
Jun 26 #Java/Android
SpringCloud的JPA连接PostgreSql的教程
spring项目中切面及AOP的使用方法
Java 中的 Unsafe 魔法类的作用大全
Jun 26 #Java/Android
You might like
php缩放图片(根据宽高的等比例缩放)实例介绍
2013/06/09 PHP
php实现汉字验证码和算式验证码的方法
2015/03/07 PHP
php实现简单的MVC框架实例
2015/09/23 PHP
基于PHPexecl类生成复杂的报表表头示例
2016/10/14 PHP
jQuery之自动完成组件的深入解析
2013/06/19 Javascript
js获取对象为null的解决方法
2013/11/21 Javascript
JavaScript中实现单体模式分享
2015/01/29 Javascript
jQuery  ready方法实现原理详解
2016/10/19 Javascript
利用yarn实现一个webpack+react种子
2016/10/25 Javascript
基于JavaScript实现全选、不选和反选效果
2017/02/15 Javascript
jquery表单验证实例仿Toast提示效果
2017/03/03 Javascript
JavaScript引用类型RegExp基本用法详解
2018/08/09 Javascript
详解JavaScript添加给定的标签选项
2018/09/17 Javascript
如何进行微信公众号开发的本地调试的方法
2019/06/16 Javascript
Javascript实现秒表计时游戏
2020/05/27 Javascript
基于Django filter中用contains和icontains的区别(详解)
2017/12/12 Python
Python cookbook(数据结构与算法)让字典保持有序的方法
2018/02/18 Python
Python 中字符串拼接的多种方法
2018/07/30 Python
Python判断字符串是否为字母或者数字(浮点数)的多种方法
2018/08/03 Python
python实现简单http服务器功能
2018/09/17 Python
对Python中Iterator和Iterable的区别详解
2018/10/18 Python
python生成器与迭代器详解
2019/01/01 Python
Python面向对象之类的定义与继承用法示例
2019/01/14 Python
Python可变和不可变、类的私有属性实例分析
2019/05/31 Python
redis数据库及与python交互用法简单示例
2019/11/01 Python
python中seaborn包常用图形使用详解
2019/11/25 Python
python实现简单井字棋游戏
2020/03/04 Python
Django import export实现数据库导入导出方式
2020/04/03 Python
python实现模拟器爬取抖音评论数据的示例代码
2021/01/06 Python
html5中嵌入视频自动播放的问题解决
2020/05/25 HTML / CSS
size?爱尔兰官方网站:英国伦敦的球鞋精品店
2019/03/31 全球购物
Penhaligon’s英国官网:成立于1870年的英国香水制造商
2021/02/18 全球购物
病人家属写给医院的感谢信
2015/01/23 职场文书
小学校园广播稿
2015/08/18 职场文书
用Python制作灯光秀短视频的思路详解
2021/04/13 Python
Redis分布式锁的7种实现
2022/04/01 Redis