spring boot如何使用spring AOP实现拦截器

2025-05-29 0 54

在spring boot中,简单几步,使用spring AOP实现一个拦截器

1、引入依赖:

?

1

2

3

4
<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-aop</artifactId>

</dependency>

2、创建拦截器类(在该类中,定义了拦截规则:拦截com.xjj.web.controller包下面的所有类中,有@RequestMapping注解的方法。):

?

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

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112
/**

* 拦截器:记录用户操作日志,检查用户是否登录……

* @author XuJijun

*/

@Aspect

@Component

public class ControllerInterceptor {

private static final Logger logger = LoggerFactory.getLogger(ControllerInterceptor.class);

@Value("${spring.profiles}")

private String env;

/**

* 定义拦截规则:拦截com.xjj.web.controller包下面的所有类中,有@RequestMapping注解的方法。

*/

@Pointcut("execution(* com.xjj.web.controller..*(..)) and @annotation(org.springframework.web.bind.annotation.RequestMapping)")

public void controllerMethodPointcut(){}

/**

* 拦截器具体实现

* @param pjp

* @return JsonResult(被拦截方法的执行结果,或需要登录的错误提示。)

*/

@Around("controllerMethodPointcut()") //指定拦截器规则;也可以直接把“execution(* com.xjj.........)”写进这里

public Object Interceptor(ProceedingJoinPoint pjp){

long beginTime = System.currentTimeMillis();

MethodSignature signature = (MethodSignature) pjp.getSignature();

Method method = signature.getMethod(); //获取被拦截的方法

String methodName = method.getName(); //获取被拦截的方法名

Set<Object> allParams = new LinkedHashSet<>(); //保存所有请求参数,用于输出到日志中

logger.info("请求开始,方法:{}", methodName);

Object result = null;

Object[] args = pjp.getArgs();

for(Object arg : args){

//logger.debug("arg: {}", arg);

if (arg instanceof Map<?, ?>) {

//提取方法中的MAP参数,用于记录进日志中

@SuppressWarnings("unchecked")

Map<String, Object> map = (Map<String, Object>) arg;

allParams.add(map);

}else if(arg instanceof HttpServletRequest){

HttpServletRequest request = (HttpServletRequest) arg;

if(isLoginRequired(method)){

if(!isLogin(request)){

result = new JsonResult(ResultCode.NOT_LOGIN, "该操作需要登录!去登录吗?\\n\\n(不知道登录账号?请联系老许。)", null);

}

}

//获取query string 或 posted form data参数

Map<String, String[]> paramMap = request.getParameterMap();

if(paramMap!=null && paramMap.size()>0){

allParams.add(paramMap);

}

}else if(arg instanceof HttpServletResponse){

//do nothing...

}else{

//allParams.add(arg);

}

}

try {

if(result == null){

// 一切正常的情况下,继续执行被拦截的方法

result = pjp.proceed();

}

} catch (Throwable e) {

logger.info("exception: ", e);

result = new JsonResult(ResultCode.EXCEPTION, "发生异常:"+e.getMessage());

}

if(result instanceof JsonResult){

long costMs = System.currentTimeMillis() - beginTime;

logger.info("{}请求结束,耗时:{}ms", methodName, costMs);

}

return result;

}

/**

* 判断一个方法是否需要登录

* @param method

* @return

*/

private boolean isLoginRequired(Method method){

if(!env.equals("prod")){ //只有生产环境才需要登录

return false;

}

boolean result = true;

if(method.isAnnotationPresent(Permission.class)){

result = method.getAnnotation(Permission.class).loginReqired();

}

return result;

}

//判断是否已经登录

private boolean isLogin(HttpServletRequest request) {

return true;

/*String token = XWebUtils.getCookieByName(request, WebConstants.CookieName.AdminToken);

if("1".equals(redisOperator.get(RedisConstants.Prefix.ADMIN_TOKEN+token))){

return true;

}else {

return false;

}*/

}

}

3、测试

浏览器中输入:http://localhost:8082/api/admin/login

测试结果:

?

1

2
2016-07-26 11:58:12,057:INFO http-nio-8082-exec-1 (ControllerInterceptor.java:58) - 请求开始,方法:login

2016-07-26 11:58:12,061:INFO http-nio-8082-exec-1 (ControllerInterceptor.java:103) - login请求结束,耗时:8ms

证明拦截器已经生效。

源代码参考:https://github.com/xujijun/my-spring-boot

源码下载:my-spring-boot.rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。

原文链接:http://blog.csdn.net/clementad/article/details/52035199

收藏 (0) 打赏

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

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

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

快网idc优惠网 建站教程 spring boot如何使用spring AOP实现拦截器 https://www.kuaiidc.com/117260.html

相关文章

发表评论
暂无评论