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 相关文章推荐
手把手教你用SpringBoot将文件打包成zip存放或导出
Jun 11 Java/Android
解析Java中的static关键字
Jun 14 Java/Android
Java实现多线程聊天室
Jun 26 Java/Android
Java 数组内置函数toArray详解
Jun 28 Java/Android
Java elasticsearch安装以及部署教程
Jun 28 Java/Android
Java实现聊天机器人完善版
Jul 04 Java/Android
dubbo集成zipkin获取Traceid的实现
Jul 26 Java/Android
java中用float时,数字后面加f,这样是为什么你知道吗
Sep 04 Java/Android
SpringBoot2零基础到精通之异常处理与web原生组件注入
Mar 22 Java/Android
Netty客户端接入流程NioSocketChannel创建解析
Mar 25 Java/Android
Java 多线程并发FutureTask
Jun 28 Java/Android
SpringBoot接入钉钉自定义机器人预警通知
Jul 15 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中\r \r\n \t的区别示例介绍
2014/02/08 PHP
PHP实现的购物车类实例
2015/06/17 PHP
PHP实现获取文件后缀名的几种常用方法
2015/08/08 PHP
thinkphp实现图片上传功能
2016/01/13 PHP
Yii框架使用PHPExcel导出Excel文件的方法分析【改进版】
2019/07/24 PHP
window.open()弹出居中的窗口
2007/02/01 Javascript
用js写了一个类似php的print_r输出换行功能
2013/02/18 Javascript
Jquery实现列表(隔行换色,全选,鼠标滑过当前行)效果实例
2013/06/09 Javascript
js获取checkbox复选框选中的选项实例
2014/08/24 Javascript
angularjs 处理多个异步请求方法汇总
2015/01/06 Javascript
jQuery实现单击和鼠标感应事件
2015/02/01 Javascript
javascript制作2048游戏
2015/03/30 Javascript
深入理解事件冒泡(Bubble)和事件捕捉(capture)
2016/05/28 Javascript
JS实现的图片预览插件与用法示例【不上传图片】
2016/11/25 Javascript
页面间固定参数,通过cookie传值的实现方法
2017/05/31 Javascript
微信小程序使用Promise简化回调
2018/02/06 Javascript
JS+H5 Canvas实现时钟效果
2018/07/20 Javascript
Ant design vue table 单击行选中 勾选checkbox教程
2020/10/24 Javascript
JavaScript 实现拖拽效果组件功能(兼容移动端)
2020/11/11 Javascript
python自定义函数实现一个数的三次方计算方法
2019/01/20 Python
jupyter notebook 中输出pyecharts图实例
2020/04/23 Python
Python音频操作工具PyAudio上手教程详解
2019/06/26 Python
python实现邮件自动发送
2019/08/10 Python
Python3多线程版TCP端口扫描器
2019/08/31 Python
13个Pandas实用技巧,助你提高开发效率
2020/08/19 Python
python 实现的车牌识别项目
2021/01/25 Python
Jo Malone美国官网:祖玛珑香水
2017/03/27 全球购物
服装设计专业自荐信
2014/06/17 职场文书
小学生民族团结演讲稿
2014/08/27 职场文书
2014年共青团工作总结
2014/12/10 职场文书
职代会闭幕词
2015/01/28 职场文书
教师工作表现自我评价
2015/03/05 职场文书
2019年12月24日平安夜祝福语集锦
2019/12/24 职场文书
MySQL中你可能忽略的COLLATION实例详解
2021/05/12 MySQL
解决mysql:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO/YES)
2021/06/26 MySQL
oracle delete误删除表数据后如何恢复
2022/06/28 Oracle