spring boot通过自定义注解和AOP拦截指定的请求
一 准备工作
1.1 添加依赖
通过spring boot创建好工程后,添加如下依赖,不然工程中无法使用切面的注解,就无法对制定的方法进行拦截
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-aop</artifactId>
- </dependency>
1.2 工程目录结构
其中
- MonitorRequest 自定义注解
- RequestAspect 切面类
- BookController 测试接口请求
二 自定义注解
- package com.tinno.word.advice;
- import java.lang.annotation.*;
- import org.springframework.web.bind.annotation.Mapping;
- /**
- * Created by xingle on 2019/5/15
- */
- @Target(ElementType.METHOD)
- @Retention(RetentionPolicy.RUNTIME)
- @Mapping
- @Documented
- public @interface MonitorRequest {
- }
三 切面类
- package com.tinno.word.aspect;
- import com.tinno.word.utils.CodeUtils;
- import javax.servlet.http.HttpServletRequest;
- import org.aspectj.lang.ProceedingJoinPoint;
- import org.aspectj.lang.annotation.Around;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.web.context.request.RequestContextHolder;
- import org.springframework.web.context.request.ServletRequestAttributes;
- /**
- * Created by xingle on 2019/5/15
- * 此类为一个切面类,主要作用就是对接口的请求进行拦截
- * 拦截的方式,只需要在指定接口方法上面加上@MonitorRequest注解即可
- */
- @Aspect
- @Component
- public class RequestAspect {
- private Logger logger = LoggerFactory.getLogger(this.getClass());
- /**
- * 环绕通知:
- * 环绕通知非常强大,可以决定目标方法是否执行,什么时候执行,执行时是否需要替换方法参数,执行完毕是否需要替换返回值。
- * 环绕通知第一个参数必须是org.aspectj.lang.ProceedingJoinPoint类型
- */
- @Around(value = "@annotation(com.tinno.word.advice.MonitorRequest)")
- public Object doBefore(ProceedingJoinPoint joinPoint) {
- //获取到请求的属性
- ServletRequestAttributes attributes =
- (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
- //获取到请求对象
- HttpServletRequest request = attributes.getRequest();
- //获取请求的方法,是Get还是Post请求
- logger.info("method=" + request.getMethod());
- Object[] args = joinPoint.getArgs();
- String de_input = "";
- try {
- logger.debug("请求参数 解密前:" + args[0].toString());
- //这里具体解密方法不再列出
- de_input = CodeUtils.decrypt(args[0].toString());
- logger.debug("请求参数 解密后:" + de_input);
- } catch (Exception e) {
- e.printStackTrace();
- }
- args[0] = de_input;
- Object returnValue = null;
- try {
- //执行方法,以新的参数(如果不带args就是用原先的参数)
- returnValue = joinPoint.proceed(args);
- logger.debug("returnValue 加密前:" +returnValue.toString());
- } catch (Throwable throwable) {
- throwable.printStackTrace();
- }
- //执行完毕也可以替换目标方法返回值,这里加密替换,也可以不加密原样返回
- returnValue = CodeUtils.encrypt(returnValue.toString());
- logger.debug("returnValue 加密后:" +returnValue.toString());
- return returnValue;
- }
- }
四 Controller类
- @MonitorRequest
- @RequestMapping(value = "/getBookVersionLs", method = {RequestMethod.GET,RequestMethod.POST},produces={"text/html;charset=UTF-8;","application/json;"})
- public String getBookVersionLs(@RequestBody String json){
- logger.info("Controller-getBookVersionLs 版本选择书本列表,请求参数:"+json);
- JSONObject jsonObject = JSONObject.parseObject(json);
- String userId = jsonObject.getString("udid");
- String device_id = jsonObject.getString("device_id");
- Map<String, Object> data = JsonUtil.jsonText2JsonMap(jsonObject.getString("data"));
- String rand = data.get("rand").toString();
- String version = data.get("version").toString();
- if (isEmpty(userId) || isEmpty(device_id)){
- ResultBody result = ResultBody.toFailure(ErrorInfoEnum.PARAMS_NO_COMPLETE.getStatus(),ErrorInfoEnum.PARAMS_NO_COMPLETE.getDest());
- return new Gson().toJson(result);
- }
- List<AllBookVersion> allList = bookService.getAllBookVersionLs();
- AllBookVersion first = allList.get(0);
- if (isEmpty(rand) && isEmpty(version)){
- rand = first.getRand();
- version = first.getVersionLs().get(0);
- }
- List<BookVersion> bookList = bookService.getBookVersionLs(device_id,rand,version);
- JSONObject obj = new JSONObject();
- obj.put("bookList",bookList);
- obj.put("allList",allList);
- ResultBody resultBody = ResultBody.toSussess(obj,"");
- return new Gson().toJson(resultBody);
- }
四 结果
请求参数:
D1D329BF7D4C02CB97C29CB03DF243D79A280D3DD1C6B0EC89B353394409DE0C950A48E2809E6539DE3A641CBA6A89957296D9E7E1DD4906505C5ADFAF89C0AA0B585B1338A57F1CAD8ABE8538E74B75C7947C0B593E3C6DB66DB2CDE07305B671E4405FFA5701C44590D3DE4973174E7D8FB983E82768A0DE086534494CAA49
返回结果:
加密后的结果
spring boot通过自定义注解和AOP拦截指定的请求的更多相关文章
- Spring Boot中自定义注解+AOP实现主备库切换
摘要: 本篇文章的场景是做调度中心和监控中心时的需求,后端使用TDDL实现分表分库,需求:实现关键业务的查询监控,当用Mybatis查询数据时需要从主库切换到备库或者直接连到备库上查询,从而减小主库的 ...
- Spring Boot实现自定义注解
在Spring Boot项目中可以使用AOP实现自定义注解,从而实现统一.侵入性小的自定义功能. 实现自定义注解的过程也比较简单,只需要3步,下面实现一个统一打印日志的自定义注解: 1. 引入AOP依 ...
- Spring Boot Web 自定义注解篇(注解很简单很好用)
自从spring 4.0 开放以后,可以添加很多新特性的注解了.使用系统定义好的注解可以大大方便的提高开发的效率. 下面我贴一段代码来讲解注解: 通过小小的注解我们支持了以下功能: 使 spring. ...
- SpringBoot自定义注解、AOP打印日志
前言 在SpringBoot中使用自定义注解.aop切面打印web请求日志.主要是想把controller的每个request请求日志收集起来,调用接口.执行时间.返回值这几个重要的信息存储到数据库里 ...
- spring自定义注解实现登陆拦截器
1.spring自定义注解实现登陆拦截器 原理:定义一个注解和一个拦截器,拦截器拦截所有方法请求,判断该方法有没有该注解.没有,放行:有,要进行验证.从而实现方法加注解就需要验证是否登陆. 2.自定义 ...
- Spring Boot 声明式事务结合相关拦截器
我这项目的读写分离方式在使用ThreadLocal实现的读写分离在迁移后的偶发错误里提了,我不再说一次了,这次是有要求读写分离与事务部分要完全脱离配置文件,程序员折腾了很久,于是我就查了一下,由于我还 ...
- 如何通过自定义注解实现AOP切点定义
面向切面编程(Aspect Oriented Programming, AOP)是面向对象编程(Object Oriented Programming,OOP)的强大补充,通过横切面注入的方式引入其他 ...
- (32)Spring Boot使用@SpringBootApplication注解,从零开始学Spring Boot
[来也匆匆,去也匆匆,在此留下您的脚印吧,转发点赞评论] 如果看了我之前的文章,这个节你就可以忽略了,这个是针对一些刚入门的选手存在的困惑进行写的一篇文章. 很多Spring Boot开发者总是使用 ...
- Spring Boot2 系列教程(十八)Spring Boot 中自定义 SpringMVC 配置
用过 Spring Boot 的小伙伴都知道,我们只需要在项目中引入 spring-boot-starter-web 依赖,SpringMVC 的一整套东西就会自动给我们配置好,但是,真实的项目环境比 ...
随机推荐
- sonarqube执行命令遇上的小问题
在安装好sonarqube,本地或是服务器上都是可疑正常运行的情况下. 这一次我重新上传,修改配置SonarQube.Analysis.xml,sonar.host.url的值已经改为服务器上的,执行 ...
- 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/ ...
- js 数值精确运算使用math.js
javaScript 浮点数运算的精度问题 问题:编程中你可能会遇到0.1*7=0.7000000000000001; 原因:几乎所有的编程语言都采用了 IEEE-745 浮点数表示法,任何使用二进制 ...
- 了解认识asp.net运行机制
asp.net 运行机制 下面了解认识httpModule 要创建一个httpModule类 using System;using System.Collections.Generic;using ...
- bug是前端还是后端
分析bug是前端还是后端的 如何分析一个bug是前端还是后端的? 平常提bug的时候,前端开发和后端开发总是扯皮,不承认是对方的bug这种情况很容易判断,先抓包看请求报文,对着接口文档,看请求报文 ...
- linux自由软件安装 ./config, make的理解
在linux系统中安装软件的其中一种:源码安装的方法是,先输入./configure,然后输入make,最后make install.或许有人留意到没有,这些软件的根目录中开始是没有Makefile的 ...
- BZOJ5017 [Snoi2017]炸弹[线段树优化建边+scc缩点+DAG上DP/线性递推]
方法一: 朴素思路:果断建图,每次二分出一个区间然后要向这个区间每个点连有向边,然后一个环的话是可以互相引爆的,缩点之后就是一个DAG,求每个点出发有多少可达点. 然后注意两个问题: 上述建边显然$n ...
- [HBase]region compaction流程
- BZOJ 4009: [HNOI2015]接水果 (整体二分+扫描线 树状数组)
整体二分+扫描线 树状数组 具体做法看这里a CODE #include <cctype> #include <cstdio> #include <cstring> ...
- 题解 [CF803C] Maximal GCD
题面 解析 一开始以为这题很难的... 其实只要设\(d\)为\(a\)的最大公因数, 即\(a[i]=s[i]*d\), 因为\(n=\sum_{i=1}^{n}a[i]=\sum_{i=1}^ns ...