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 相关文章推荐
为什么在foreach循环中JAVA集合不能添加或删除元素
Jun 11 Java/Android
spring boot项目application.properties文件存放及使用介绍
Jun 30 Java/Android
Java基础之this关键字的使用
Jun 30 Java/Android
使用logback实现按自己的需求打印日志到自定义的文件里
Aug 30 Java/Android
深入解读Java三大集合之map list set的用法
Nov 11 Java/Android
聊聊Lombok中的@Builder注解使用教程
Nov 17 Java/Android
Android自定义ScrollView实现阻尼回弹
Apr 01 Java/Android
Java基础——Map集合
Apr 01 Java/Android
Java 通过手写分布式雪花SnowFlake生成ID方法详解
Apr 07 Java/Android
Java 超详细讲解ThreadLocal类的使用
Apr 07 Java/Android
SpringBoot使用ip2region获取地理位置信息的方法
Jun 21 Java/Android
详解Spring Security如何在权限中使用通配符
Jun 28 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
提取HTML标签
2006/10/09 PHP
3种平台下安装php4经验点滴
2006/10/09 PHP
php约瑟夫问题解决关于处死犯人的算法
2015/03/23 PHP
人脸识别测颜值、测脸龄、测相似度微信接口
2016/04/07 PHP
PHP解压ZIP文件到指定文件夹的方法
2016/11/17 PHP
Javascript isArray 数组类型检测函数
2009/10/08 Javascript
jQuery获取css z-index在各种浏览器中的返回值
2010/09/15 Javascript
在JQuery dialog里的服务器控件 事件失效问题
2010/12/08 Javascript
文本框回车提交与禁止提交示例
2013/09/27 Javascript
通过隐藏iframe实现文件下载的js方法介绍
2014/02/26 Javascript
JS选中checkbox后获取table内一行TD所有数据的方法
2015/07/01 Javascript
jQuery实现form表单基于ajax无刷新提交方法详解
2015/12/08 Javascript
分享两款带遮罩的jQuery弹出框
2015/12/30 Javascript
jquery使用Cookie和JSON记录用户最近浏览历史
2016/04/19 Javascript
onclick和onblur冲突问题的快速解决方法
2016/04/28 Javascript
jQuery获取剪贴板内容的方法
2016/06/16 Javascript
手机端点击图片放大特效PhotoSwipe.js插件实现
2016/08/24 Javascript
js HTML5多图片上传及预览实例解析(不含前端的文件分割)
2016/08/26 Javascript
如何提高Dom访问速度
2017/01/05 Javascript
bootstrap常用组件之头部导航实现代码
2017/04/20 Javascript
JS移动端/H5同时选择多张图片上传并使用canvas压缩图片
2017/06/20 Javascript
node跨域请求方法小结
2017/08/25 Javascript
JS获取当前地理位置的方法
2017/10/25 Javascript
JavaScript之实现一个简单的Vue示例
2019/01/17 Javascript
微信小程序实现写入读取缓存详解
2019/08/30 Javascript
three.js欧拉角和四元数的使用方法
2020/07/26 Javascript
vue video和vue-video-player实现视频铺满教程
2020/10/30 Javascript
Mac在python3环境下安装virtualwrapper遇到的问题及解决方法
2019/07/09 Python
Python 实现opencv所使用的图片格式与 base64 转换
2020/01/09 Python
Python+OpenCV实现图像的全景拼接
2020/03/05 Python
python上传时包含boundary时的解决方法
2020/04/08 Python
python对批量WAV音频进行等长分割的方法实现
2020/09/25 Python
区级文明单位申报材料
2014/05/15 职场文书
安全生产宣传标语
2014/06/06 职场文书
支部书记四风问题对照检查材料
2014/10/04 职场文书
用Python将库打包发布到pypi
2021/04/13 Python