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 相关文章推荐
Java方法重载和方法重写的区别到底在哪?
Jun 11 Java/Android
SpringBoot2 参数管理实践之入参出参与校验的方式
Jun 16 Java/Android
Java实现二维数组和稀疏数组之间的转换
Jun 27 Java/Android
利用Java设置Word文本框中的文字旋转方向的实现方法
Jun 28 Java/Android
Java移除无效括号的方法实现
Aug 07 Java/Android
JAVA API 实用类 String详解
Oct 05 Java/Android
Java Spring 控制反转(IOC)容器详解
Oct 05 Java/Android
SpringDataJPA在Entity中常用的注解介绍
Dec 06 Java/Android
关于maven依赖 ${xxx.version}报错问题
Jan 18 Java/Android
Java实战之课程信息管理系统的实现
Apr 01 Java/Android
Jmerte 分布式压测及分布式压测配置
Apr 30 Java/Android
Java中生成微信小程序太阳码的实现方案
Jun 01 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实现时间轴函数代码
2011/10/08 PHP
微信开发之网页授权获取用户信息(二)
2016/01/08 PHP
php apache开启跨域模式过程详解
2019/07/08 PHP
解放web程序员的输入验证
2006/10/06 Javascript
jquery tools系列 expose 学习
2009/09/06 Javascript
避免 showModalDialog 弹出新窗体的原因分析
2010/05/31 Javascript
jQuery.extend 函数详解
2012/02/03 Javascript
js 调用父窗口的具体实现代码
2013/07/15 Javascript
Javascript学习笔记之 对象篇(一) : 对象的使用和属性
2014/06/24 Javascript
原生js和jQuery随意改变div属性style的名称和值
2014/10/22 Javascript
分享28款免费实用的 JQuery 图片和内容滑块插件
2014/12/15 Javascript
jQuery中fadeOut()方法用法实例
2014/12/24 Javascript
Immutable 在 JavaScript 中的应用
2016/05/02 Javascript
JS获取子窗口中返回的数据实现方法
2016/05/28 Javascript
微信小程序 vidao实现视频播放和弹幕的功能
2016/11/02 Javascript
EsLint入门学习教程
2017/02/17 Javascript
AngularJS自定义指令之复制指令实现方法
2017/05/18 Javascript
JS库之wow.js使用方法
2017/09/14 Javascript
Vue基于NUXT的SSR详解
2017/10/24 Javascript
详解使用VueJS开发项目中的兼容问题
2018/08/02 Javascript
layui实现table加载的示例代码
2018/08/14 Javascript
详解mpvue开发微信小程序基础知识
2019/09/23 Javascript
highcharts.js数据绑定方式代码实例
2019/11/13 Javascript
浅谈JavaScript中你可能不知道URL构造函数的属性
2020/07/13 Javascript
Python基础教程之浅拷贝和深拷贝实例详解
2017/07/15 Python
Python数据结构与算法之图结构(Graph)实例分析
2017/09/05 Python
浅谈Python中带_的变量或函数命名
2017/12/04 Python
Python + Requests + Unittest接口自动化测试实例分析
2019/12/12 Python
Pytorch 扩展Tensor维度、压缩Tensor维度的方法
2020/09/09 Python
用Python实现定时备份Mongodb数据并上传到FTP服务器
2021/01/27 Python
Perfume’s Club德国官网:在线购买香水
2019/04/08 全球购物
会计毕业生自荐信
2013/11/21 职场文书
中医专业职业生涯规划书范文
2014/01/04 职场文书
2014各大专业毕业生自我评价
2014/09/17 职场文书
2015年全国爱眼日活动方案
2015/05/05 职场文书
2015年依法治校工作总结
2015/07/27 职场文书