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 Swing实现自助取款机系统
Jun 11 Java/Android
教你用Java在个人电脑上实现微信扫码支付
Jun 13 Java/Android
Spring Boot 启动、停止、重启、状态脚本
Jun 26 Java/Android
Java中使用Filter过滤器的方法
Jun 28 Java/Android
如何给HttpServletRequest增加消息头
Jun 30 Java/Android
Log4j.properties配置及其使用
Aug 02 Java/Android
Java 在线考试云平台的实现
Nov 23 Java/Android
剑指Offer之Java算法习题精讲二叉树专项训练
Mar 21 Java/Android
MybatisPlus EntityWrapper如何自定义SQL
Mar 22 Java/Android
SpringCloud Function SpEL注入漏洞分析及环境搭建
Apr 08 Java/Android
Android开发 使用文件储存的方式保存QQ密码
Apr 24 Java/Android
Java实现贪吃蛇游戏的示例代码
Sep 23 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 mysql数据库操作分页类
2008/06/04 PHP
PHP CURL模拟GET及POST函数代码
2010/04/25 PHP
PHP中extract()函数的妙用分析
2012/07/11 PHP
PHP mysql与mysqli事务使用说明 分享
2013/08/17 PHP
php获取字符串中各个字符出现次数的方法
2015/02/23 PHP
mod_php、FastCGI、PHP-FPM等PHP运行方式对比
2015/07/02 PHP
PHP与SQL语句常用大全
2016/12/10 PHP
PHP随机生成中文段落示例【测试网站内容时使用】
2020/04/26 PHP
利用jQuery操作对象数组的实现代码
2011/04/27 Javascript
JS简单的图片放大缩小的两种方法
2013/11/11 Javascript
javascript跨浏览器的属性判断方法
2014/03/16 Javascript
Javascript中的神器——Promise
2017/02/08 Javascript
jQuery绑定事件方法及区别(bind,click,on,live,one)
2017/08/14 jQuery
浅析webpack 如何优雅的使用tree-shaking(摇树优化)
2017/08/16 Javascript
详解jquery插件jquery.viewport.js学习使用方法
2017/09/08 jQuery
Vue精简版风格指南(推荐)
2018/01/30 Javascript
vue+element的表格实现批量删除功能示例代码
2018/08/17 Javascript
nodejs 使用 js 模块的方法实例详解
2018/12/04 NodeJs
微信小程序如何使用canvas二维码保存至手机相册
2019/07/15 Javascript
详解一些适用于Node.js的命名约定
2019/12/08 Javascript
js实现碰撞检测
2021/01/29 Javascript
用Python编写简单的定时器的方法
2015/05/02 Python
Python爬取三国演义的实现方法
2016/09/12 Python
python中matplotlib实现最小二乘法拟合的过程详解
2017/07/11 Python
对python3 中方法各种参数和返回值详解
2018/12/15 Python
Python数据类型之Number数字操作实例详解
2019/05/08 Python
Python利用PyPDF2库获取PDF文件总页码实例
2020/04/03 Python
html5视频播放_动力节点Java学院整理
2017/07/13 HTML / CSS
C#实现对任一张表的数据进行增,删,改,查要求,运用Webservice,体现出三层架构
2014/07/11 面试题
应届生求职简历的自我评价怎么写
2013/10/23 职场文书
绿化工程实施方案
2014/03/17 职场文书
学前班评语大全
2014/05/04 职场文书
小学生民族团结演讲稿
2014/08/27 职场文书
2015年复活节活动总结
2015/02/27 职场文书
2016自主招生教师推荐信范文
2015/03/23 职场文书
小学教师师德培训心得体会
2016/01/09 职场文书