springboot拦截器无法注入redisTemplate的解决方法

2025-05-29 0 55

在工作中我们经常需要做登录拦截验证或者其他拦截认证功能,基于springboot项目下我们很容易想到结合redis做的分布式拦截,把用户登录或者需要验证的信息放到redis里面。但是在写拦截器的时候发现redistemplate一直无法注入进来,最后查资料才发现springboot拦截器是在bean实例化之前执行的,所以bean实例无法注入

先看下问题,新建一个拦截器,然后注入redistemplate

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61
/**

* @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都拦截

?

1

2

3

4

5

6

7

8

9

10

11

12

13
@configuration

public class webfilterconfig implements webmvcconfigurer {

/**

* 多个拦截器组成一个拦截器链

* @param registry

*/

@override

public void addinterceptors(interceptorregistry registry) {

registry.addinterceptor(new accesslimitintercept()).addpathpatterns("/**");

}

}

新建一个controller里面增加一个接口,使用postman调用接口

?

1

2

3

4

5

6

7

8

9

10
@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的解决方法

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23
@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内容请搜索快网idc以前的文章或继续浏览下面的相关文章希望大家以后多多支持快网idc!

原文链接:https://blog.csdn.net/zxl646801924/article/details/99544463

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 springboot拦截器无法注入redisTemplate的解决方法 https://www.kuaiidc.com/105166.html

相关文章

发表评论
暂无评论