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 相关文章推荐
SpringBoot2 参数管理实践之入参出参与校验的方式
Jun 16 Java/Android
Java Optional<Foo>转换成List<Bar>的实例方法
Jun 20 Java/Android
springcloud之Feign超时问题的解决
Jun 24 Java/Android
详解Java分布式事务的 6 种解决方案
Jun 26 Java/Android
SpringBoot实现quartz定时任务可视化管理功能
Aug 30 Java/Android
Java中API的使用方法详情
Apr 06 Java/Android
Java 通过手写分布式雪花SnowFlake生成ID方法详解
Apr 07 Java/Android
教你在 Java 中实现 Dijkstra 最短路算法的方法
Apr 08 Java/Android
Spring Data JPA框架持久化存储数据到数据库
Apr 28 Java/Android
Java 异步任务计算FutureTask
Apr 28 Java/Android
httpclient调用远程接口的方法
Aug 14 Java/Android
spring boot实现文件上传
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
关于Appserv无法打开localhost问题的解决方法
2009/10/16 PHP
php多层数组与对象的转换实例代码
2013/08/05 PHP
php读取目录所有文件信息dir示例
2014/03/18 PHP
为百度UE编辑器上传图片添加水印功能
2015/04/16 PHP
php实现登录tplink WR882N获取IP和重启的方法
2016/07/20 PHP
php实现当前页面点击下载文件的简单方法
2016/09/22 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
2018/06/16 PHP
jQuery Validation实例代码 让验证变得如此容易
2010/10/18 Javascript
javascript利用初始化数据装配模版的实现代码
2010/11/17 Javascript
javascript操作select元素实例分析
2015/03/27 Javascript
js控制文本框输入的字符类型方法汇总
2015/06/19 Javascript
JS+CSS实现简易的滑动门效果代码
2015/09/24 Javascript
vuejs在解析时出现闪烁的原因及防止闪烁的方法
2016/09/19 Javascript
javascript动画之模拟拖拽效果篇
2016/09/26 Javascript
使用get方式提交表单在地址栏里面不显示提交信息
2017/02/21 Javascript
详解Angular 开发环境搭建
2017/06/22 Javascript
js Element Traversal规范中的元素遍历方法
2018/04/19 Javascript
apicloud拉起小程序并传递参数的方法示例
2018/11/21 Javascript
微信小程序-form表单提交代码实例
2019/04/29 Javascript
用node.js写一个jenkins发版脚本
2019/05/21 Javascript
如何在wxml中直接写js代码(wxs)
2019/11/14 Javascript
[01:10]DOTA2英雄背景故事第四期之混沌法则混沌骑士
2020/07/16 DOTA
[03:00]DOTA2-DPC中国联赛1月18日Recap集锦
2021/03/11 DOTA
Python实现批量将word转html并将html内容发布至网站的方法
2015/07/14 Python
初步认识Python中的列表与位运算符
2015/10/12 Python
非递归的输出1-N的全排列实例(推荐)
2017/04/11 Python
Python爬虫番外篇之Cookie和Session详解
2017/12/27 Python
python如何读写csv数据
2018/03/21 Python
对python中Matplotlib的坐标轴的坐标区间的设定实例讲解
2018/05/25 Python
使用CSS实现弹性视频html5案例实践
2012/12/26 HTML / CSS
销售业务实习自我鉴定
2013/09/23 职场文书
机械制造与自动化应届生求职信
2013/11/16 职场文书
工程部经理岗位职责
2013/12/08 职场文书
软件专业毕业生个人自我鉴定
2014/04/17 职场文书
疾病防治方案
2014/05/31 职场文书
总经理岗位职责说明书
2014/07/30 职场文书