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 相关文章推荐
如何解决springcloud feign 首次调用100%失败的问题
Jun 23 Java/Android
浅谈Python魔法方法
Jun 28 Java/Android
Java集成swagger文档组件
Jun 28 Java/Android
解决SpringBoot文件上传临时目录找不到的问题
Jul 01 Java/Android
SpringBoot读取Resource下文件的4种方法
Jul 02 Java/Android
Java获取e.printStackTrace()打印的信息方式
Aug 07 Java/Android
深入解读Java三大集合之map list set的用法
Nov 11 Java/Android
Java实现学生管理系统(IO版)
Feb 24 Java/Android
Java数组详细介绍及相关工具类
Apr 14 Java/Android
Elasticsearch 配置详解
Apr 19 Java/Android
SpringBoot详解整合Redis缓存方法
Jul 15 Java/Android
基于Android10渲染Surface的创建过程
Aug 14 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
Zerg基本策略
2020/03/14 星际争霸
thinkPHP框架中layer.js的封装与使用方法示例
2019/01/18 PHP
ImageFlow可鼠标控制图片滚动
2008/01/30 Javascript
jQuery Mobile 导航栏代码
2013/11/01 Javascript
一个支持任意尺寸的图片上下左右滑动效果
2014/08/24 Javascript
node.js中的querystring.unescape方法使用说明
2014/12/10 Javascript
Linux下编译安装php libevent扩展实例
2015/02/14 Javascript
javascript对象的创建和访问
2016/03/08 Javascript
AngularJS中$http服务常用的应用及参数
2016/08/22 Javascript
vue项目实现github在线预览功能
2018/06/20 Javascript
改进 JavaScript 和 Rust 的互操作性并深入认识 wasm-bindgen 组件
2019/07/13 Javascript
详解小程序如何动态绑定点击的执行方法
2019/11/26 Javascript
在vue项目实现一个ctrl+f的搜索功能
2020/02/28 Javascript
jquery实现烟花效果(面向对象)
2020/03/10 jQuery
pymssql数据库操作MSSQL2005实例分析
2015/05/25 Python
Python保存MongoDB上的文件到本地的方法
2016/03/16 Python
Python 12306抢火车票脚本
2018/02/07 Python
Python遍历numpy数组的实例
2018/04/04 Python
如何使用python操作vmware
2019/07/27 Python
Python 生成一个从0到n个数字的列表4种方法小结
2019/11/28 Python
解决python -m pip install --upgrade pip 升级不成功问题
2020/03/05 Python
css3实现画半圆弧线的示例代码
2017/11/06 HTML / CSS
Canvas高级路径操作之拖拽对象的实现
2019/08/05 HTML / CSS
英国人最爱的饰品网站:Accessorize
2016/08/22 全球购物
暇步士官网:Hush Puppies
2016/09/22 全球购物
Holland & Barrett爱尔兰:英国领先的健康零售商
2019/03/31 全球购物
学生个人的自我评价分享
2013/11/05 职场文书
国贸专业的职业规划范文
2014/01/23 职场文书
高中英语教学反思
2014/02/04 职场文书
党员活动总结
2015/02/04 职场文书
明确岗位职责
2015/02/14 职场文书
2015年小学英语教师工作总结
2015/05/12 职场文书
农村老人去世追悼词
2015/06/23 职场文书
2015教师个人年度工作总结
2015/10/23 职场文书
详解MySQL 用户权限管理
2021/04/20 MySQL
在前女友婚礼上,用Python破解了现场的WIFI还把名称改成了
2021/05/28 Python