一 准备工作

1.1 添加依赖

通过spring boot创建好工程后,添加如下依赖,不然工程中无法使用切面的注解,就无法对制定的方法进行拦截

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

1.2 工程目录结构

其中

  1. MonitorRequest 自定义注解
  1. RequestAspect 切面类
  1. BookController 测试接口请求

二 自定义注解

  1. package com.tinno.word.advice;
  2.  
  3. import java.lang.annotation.*;
  4. import org.springframework.web.bind.annotation.Mapping;
  5.  
  6. /**
  7. * Created by xingle on 2019/5/15
  8. */
  9. @Target(ElementType.METHOD)
  10. @Retention(RetentionPolicy.RUNTIME)
  11. @Mapping
  12. @Documented
  13. public @interface MonitorRequest {
  14.  
  15. }

注解的作用目标:
  @Target(ElementType.TYPE)                      // 接口、类、枚举、注解
  @Target(ElementType.FIELD)                     // 字段、枚举的常量
  @Target(ElementType.METHOD)                 // 方法
  @Target(ElementType.PARAMETER)            // 方法参数
  @Target(ElementType.CONSTRUCTOR)       // 构造函数
  @Target(ElementType.LOCAL_VARIABLE)   // 局部变量
  @Target(ElementType.ANNOTATION_TYPE) // 注解
  @Target(ElementType.PACKAGE)               // 包

三 切面类

  1. package com.tinno.word.aspect;
  2.  
  3. import com.tinno.word.utils.CodeUtils;
  4. import javax.servlet.http.HttpServletRequest;
  5. import org.aspectj.lang.ProceedingJoinPoint;
  6. import org.aspectj.lang.annotation.Around;
  7. import org.slf4j.Logger;
  8. import org.slf4j.LoggerFactory;
  9. import org.springframework.web.context.request.RequestContextHolder;
  10. import org.springframework.web.context.request.ServletRequestAttributes;
  11.  
  12. /**
  13. * Created by xingle on 2019/5/15
  14. * 此类为一个切面类,主要作用就是对接口的请求进行拦截
  15. * 拦截的方式,只需要在指定接口方法上面加上@MonitorRequest注解即可
  16. */
  17.  
  18. @Aspect
  19. @Component
  20. public class RequestAspect {
  21.  
  22. private Logger logger = LoggerFactory.getLogger(this.getClass());
  23.  
  24. /**
  25. * 环绕通知:
  26. * 环绕通知非常强大,可以决定目标方法是否执行,什么时候执行,执行时是否需要替换方法参数,执行完毕是否需要替换返回值。
  27. * 环绕通知第一个参数必须是org.aspectj.lang.ProceedingJoinPoint类型
  28. */
  29. @Around(value = "@annotation(com.tinno.word.advice.MonitorRequest)")
  30. public Object doBefore(ProceedingJoinPoint joinPoint) {
  31.  
  32. //获取到请求的属性
  33. ServletRequestAttributes attributes =
  34. (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
  35. //获取到请求对象
  36. HttpServletRequest request = attributes.getRequest();
  37.  
  38. //获取请求的方法,是Get还是Post请求
  39. logger.info("method=" + request.getMethod());
  40.  
  41. Object[] args = joinPoint.getArgs();
  42. String de_input = "";
  43. try {
  44. logger.debug("请求参数 解密前:" + args[0].toString());
  45. //这里具体解密方法不再列出
  46. de_input = CodeUtils.decrypt(args[0].toString());
  47. logger.debug("请求参数 解密后:" + de_input);
  48. } catch (Exception e) {
  49. e.printStackTrace();
  50. }
  51. args[0] = de_input;
  52.  
  53. Object returnValue = null;
  54. try {
  55. //执行方法,以新的参数(如果不带args就是用原先的参数)
  56. returnValue = joinPoint.proceed(args);
  57. logger.debug("returnValue 加密前:" +returnValue.toString());
  58. } catch (Throwable throwable) {
  59. throwable.printStackTrace();
  60. }
  61. //执行完毕也可以替换目标方法返回值,这里加密替换,也可以不加密原样返回
  62. returnValue = CodeUtils.encrypt(returnValue.toString());
  63. logger.debug("returnValue 加密后:" +returnValue.toString());
  64. return returnValue;
  65.  
  66. }
  67.  
  68. }

四 Controller类

  1. @MonitorRequest
  2. @RequestMapping(value = "/getBookVersionLs", method = {RequestMethod.GET,RequestMethod.POST},produces={"text/html;charset=UTF-8;","application/json;"})
  3. public String getBookVersionLs(@RequestBody String json){
  4. logger.info("Controller-getBookVersionLs 版本选择书本列表,请求参数:"+json);
  5. JSONObject jsonObject = JSONObject.parseObject(json);
  6. String userId = jsonObject.getString("udid");
  7. String device_id = jsonObject.getString("device_id");
  8. Map<String, Object> data = JsonUtil.jsonText2JsonMap(jsonObject.getString("data"));
  9.  
  10. String rand = data.get("rand").toString();
  11. String version = data.get("version").toString();
  12.  
  13. if (isEmpty(userId) || isEmpty(device_id)){
  14. ResultBody result = ResultBody.toFailure(ErrorInfoEnum.PARAMS_NO_COMPLETE.getStatus(),ErrorInfoEnum.PARAMS_NO_COMPLETE.getDest());
  15. return new Gson().toJson(result);
  16. }
  17. List<AllBookVersion> allList = bookService.getAllBookVersionLs();
  18. AllBookVersion first = allList.get(0);
  19. if (isEmpty(rand) && isEmpty(version)){
  20. rand = first.getRand();
  21. version = first.getVersionLs().get(0);
  22. }
  23. List<BookVersion> bookList = bookService.getBookVersionLs(device_id,rand,version);
  24.  
  25. JSONObject obj = new JSONObject();
  26. obj.put("bookList",bookList);
  27. obj.put("allList",allList);
  28. ResultBody resultBody = ResultBody.toSussess(obj,"");
  29. return new Gson().toJson(resultBody);
  30. }

四 结果

请求参数:

D1D329BF7D4C02CB97C29CB03DF243D79A280D3DD1C6B0EC89B353394409DE0C950A48E2809E6539DE3A641CBA6A89957296D9E7E1DD4906505C5ADFAF89C0AA0B585B1338A57F1CAD8ABE8538E74B75C7947C0B593E3C6DB66DB2CDE07305B671E4405FFA5701C44590D3DE4973174E7D8FB983E82768A0DE086534494CAA49

返回结果:

加密后的结果

spring boot通过自定义注解和AOP拦截指定的请求的更多相关文章

  1. Spring Boot中自定义注解+AOP实现主备库切换

    摘要: 本篇文章的场景是做调度中心和监控中心时的需求,后端使用TDDL实现分表分库,需求:实现关键业务的查询监控,当用Mybatis查询数据时需要从主库切换到备库或者直接连到备库上查询,从而减小主库的 ...

  2. Spring Boot实现自定义注解

    在Spring Boot项目中可以使用AOP实现自定义注解,从而实现统一.侵入性小的自定义功能. 实现自定义注解的过程也比较简单,只需要3步,下面实现一个统一打印日志的自定义注解: 1. 引入AOP依 ...

  3. Spring Boot Web 自定义注解篇(注解很简单很好用)

    自从spring 4.0 开放以后,可以添加很多新特性的注解了.使用系统定义好的注解可以大大方便的提高开发的效率. 下面我贴一段代码来讲解注解: 通过小小的注解我们支持了以下功能: 使 spring. ...

  4. SpringBoot自定义注解、AOP打印日志

    前言 在SpringBoot中使用自定义注解.aop切面打印web请求日志.主要是想把controller的每个request请求日志收集起来,调用接口.执行时间.返回值这几个重要的信息存储到数据库里 ...

  5. spring自定义注解实现登陆拦截器

    1.spring自定义注解实现登陆拦截器 原理:定义一个注解和一个拦截器,拦截器拦截所有方法请求,判断该方法有没有该注解.没有,放行:有,要进行验证.从而实现方法加注解就需要验证是否登陆. 2.自定义 ...

  6. Spring Boot 声明式事务结合相关拦截器

    我这项目的读写分离方式在使用ThreadLocal实现的读写分离在迁移后的偶发错误里提了,我不再说一次了,这次是有要求读写分离与事务部分要完全脱离配置文件,程序员折腾了很久,于是我就查了一下,由于我还 ...

  7. 如何通过自定义注解实现AOP切点定义

    面向切面编程(Aspect Oriented Programming, AOP)是面向对象编程(Object Oriented Programming,OOP)的强大补充,通过横切面注入的方式引入其他 ...

  8. (32)Spring Boot使用@SpringBootApplication注解,从零开始学Spring Boot

    [来也匆匆,去也匆匆,在此留下您的脚印吧,转发点赞评论] 如果看了我之前的文章,这个节你就可以忽略了,这个是针对一些刚入门的选手存在的困惑进行写的一篇文章. 很多Spring Boot开发者总是使用 ...

  9. Spring Boot2 系列教程(十八)Spring Boot 中自定义 SpringMVC 配置

    用过 Spring Boot 的小伙伴都知道,我们只需要在项目中引入 spring-boot-starter-web 依赖,SpringMVC 的一整套东西就会自动给我们配置好,但是,真实的项目环境比 ...

随机推荐

  1. sonarqube执行命令遇上的小问题

    在安装好sonarqube,本地或是服务器上都是可疑正常运行的情况下. 这一次我重新上传,修改配置SonarQube.Analysis.xml,sonar.host.url的值已经改为服务器上的,执行 ...

  2. MySQL5.7 启动报错:initialize specified but the data directory has files in it. Aborting.

    $ vi /etc/my.cnf ## datadir=/var/lib/mysql, 这个是data保存目录,进入/var/lib/mysql后,查看到确实有数据. #解决方法:将/var/lib/ ...

  3. js 数值精确运算使用math.js

    javaScript 浮点数运算的精度问题 问题:编程中你可能会遇到0.1*7=0.7000000000000001; 原因:几乎所有的编程语言都采用了 IEEE-745 浮点数表示法,任何使用二进制 ...

  4. 了解认识asp.net运行机制

    asp.net  运行机制 下面了解认识httpModule 要创建一个httpModule类 using System;using System.Collections.Generic;using ...

  5. bug是前端还是后端

    分析bug是前端还是后端的   如何分析一个bug是前端还是后端的? 平常提bug的时候,前端开发和后端开发总是扯皮,不承认是对方的bug这种情况很容易判断,先抓包看请求报文,对着接口文档,看请求报文 ...

  6. linux自由软件安装 ./config, make的理解

    在linux系统中安装软件的其中一种:源码安装的方法是,先输入./configure,然后输入make,最后make install.或许有人留意到没有,这些软件的根目录中开始是没有Makefile的 ...

  7. BZOJ5017 [Snoi2017]炸弹[线段树优化建边+scc缩点+DAG上DP/线性递推]

    方法一: 朴素思路:果断建图,每次二分出一个区间然后要向这个区间每个点连有向边,然后一个环的话是可以互相引爆的,缩点之后就是一个DAG,求每个点出发有多少可达点. 然后注意两个问题: 上述建边显然$n ...

  8. [HBase]region compaction流程

  9. BZOJ 4009: [HNOI2015]接水果 (整体二分+扫描线 树状数组)

    整体二分+扫描线 树状数组 具体做法看这里a CODE #include <cctype> #include <cstdio> #include <cstring> ...

  10. 题解 [CF803C] Maximal GCD

    题面 解析 一开始以为这题很难的... 其实只要设\(d\)为\(a\)的最大公因数, 即\(a[i]=s[i]*d\), 因为\(n=\sum_{i=1}^{n}a[i]=\sum_{i=1}^ns ...