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

1、引入依赖:

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-aop</artifactId>
  4. </dependency>
  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-aop</artifactId>
  4. </dependency>

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

    1. /**
    2. * 拦截器:记录用户操作日志,检查用户是否登录……
    3. * @author XuJijun
    4. */
    5. @Aspect
    6. @Component
    7. public class ControllerInterceptor {
    8. private static final Logger logger = LoggerFactory.getLogger(ControllerInterceptor.class);
    9. @Value(“${spring.profiles}”)
    10. private String env;
    11. /**
    12. * 定义拦截规则:拦截com.xjj.web.controller包下面的所有类中,有@RequestMapping注解的方法。
    13. */
    14. @Pointcut(“execution(* com.xjj.web.controller..*(..)) and @annotation(org.springframework.web.bind.annotation.RequestMapping)”)
    15. public void controllerMethodPointcut(){}
    16. /**
    17. * 拦截器具体实现
    18. * @param pjp
    19. * @return JsonResult(被拦截方法的执行结果,或需要登录的错误提示。)
    20. */
    21. @Around(“controllerMethodPointcut()”) //指定拦截器规则;也可以直接把“execution(* com.xjj………)”写进这里
    22. public Object Interceptor(ProceedingJoinPoint pjp){
    23. long beginTime = System.currentTimeMillis();
    24. MethodSignature signature = (MethodSignature) pjp.getSignature();
    25. Method method = signature.getMethod(); //获取被拦截的方法
    26. String methodName = method.getName(); //获取被拦截的方法名
    27. Set<Object> allParams = new LinkedHashSet<>(); //保存所有请求参数,用于输出到日志中
    28. logger.info(”请求开始,方法:{}”, methodName);
    29. Object result = null;
    30. Object[] args = pjp.getArgs();
    31. for(Object arg : args){
    32. //logger.debug(“arg: {}”, arg);
    33. if (arg instanceof Map<?, ?>) {
    34. //提取方法中的MAP参数,用于记录进日志中
    35. @SuppressWarnings(“unchecked”)
    36. Map<String, Object> map = (Map<String, Object>) arg;
    37. allParams.add(map);
    38. }else if(arg instanceof HttpServletRequest){
    39. HttpServletRequest request = (HttpServletRequest) arg;
    40. if(isLoginRequired(method)){
    41. if(!isLogin(request)){
    42. result = new JsonResult(ResultCode.NOT_LOGIN, “该操作需要登录!去登录吗?\n\n(不知道登录账号?请联系老许。)”, null);
    43. }
    44. }
    45. //获取query string 或 posted form data参数
    46. Map<String, String[]> paramMap = request.getParameterMap();
    47. if(paramMap!=null && paramMap.size()>0){
    48. allParams.add(paramMap);
    49. }
    50. }else if(arg instanceof HttpServletResponse){
    51. //do nothing…
    52. }else{
    53. //allParams.add(arg);
    54. }
    55. }
    56. try {
    57. if(result == null){
    58. // 一切正常的情况下,继续执行被拦截的方法
    59. result = pjp.proceed();
    60. }
    61. } catch (Throwable e) {
    62. logger.info(”exception: ”, e);
    63. result = new JsonResult(ResultCode.EXCEPTION, “发生异常:”+e.getMessage());
    64. }
    65. if(result instanceof JsonResult){
    66. long costMs = System.currentTimeMillis() - beginTime;
    67. logger.info(”{}请求结束,耗时:{}ms”, methodName, costMs);
    68. }
    69. return result;
    70. }
    71. /**
    72. * 判断一个方法是否需要登录
    73. * @param method
    74. * @return
    75. */
    76. private boolean isLoginRequired(Method method){
    77. if(!env.equals(“prod”)){ //只有生产环境才需要登录
    78. return false;
    79. }
    80. boolean result = true;
    81. if(method.isAnnotationPresent(Permission.class)){
    82. result = method.getAnnotation(Permission.class).loginReqired();
    83. }
    84. return result;
    85. }
    86. //判断是否已经登录
    87. private boolean isLogin(HttpServletRequest request) {
    88. return true;
    89. /*String token = XWebUtils.getCookieByName(request, WebConstants.CookieName.AdminToken);
    90. if(“1”.equals(redisOperator.get(RedisConstants.Prefix.ADMIN_TOKEN+token))){
    91. return true;
    92. }else {
    93. return false;
    94. }*/
    95. }
    96. }

最新文章

  1. 利用private font改变PDF文件的字体
  2. poj 1195 - Mobile phones(树状数组)
  3. thinkphp学习笔记13-15集
  4. 奇怪吸引子---WimolBanlue
  5. .net架构设计读书笔记--第三章 第8节 域模型简介(Introducing Domain Model)
  6. [转]超详细图解:自己架设NuGet服务器
  7. nginx配置 php 单入口
  8. (02)odoo自定义模块
  9. SaaS、PaaS和IaaS
  10. 仿校内textarea输入框字数限制效果
  11. 分布式传输协调程序MSDTC配置
  12. PHP第一章学习——了解PHP(上)
  13. Balsamiq Mockups注册码
  14. fs模块(一)
  15. JavaScript OOP(二):this关键字以及call、apply、bind
  16. 图论之Dijkstra算法
  17. Thread和Runnable的区别
  18. 【XSY2679】修墙 最短路
  19. python3+requests库框架设计06-测试脚本
  20. JS 日期转换,格式化等常用的函数定义

热门文章

  1. 手把手教你实现热更新功能,带你了解 Arthas 热更新背后的原理
  2. windows,linux安装redis
  3. nyoj 199-无线网络覆盖 (ceil())
  4. NetCore下搭建websocket集群方案
  5. Python3.7.1学习(五) 将列表中的元素转化为数字并排序
  6. CSS中越界问题的经典解决方案
  7. 力扣(LeetCode)旋转字符串 个人题解
  8. C语言|博客作业02
  9. Session,Token,Cookie相关区别
  10. C# 彻底搞懂async/await