spring boot通过自定义注解和AOP拦截指定的请求

时间:2022-11-10 18:03:12

一 准备工作

1.1 添加依赖

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

 <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>

1.2 工程目录结构

其中

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

spring boot通过自定义注解和AOP拦截指定的请求

二 自定义注解

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 { }

注解的作用目标:
  @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)               // 包

三 切面类

 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

返回结果:

加密后的结果