spring boot通过自定义注解和AOP拦截指定的请求
一 准备工作
1.1 添加依赖
通过spring boot创建好工程后,添加如下依赖,不然工程中无法使用切面的注解,就无法对制定的方法进行拦截
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。<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 { }
三 切面类
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.aspectj.lang.annotation.Aspect; 8 import org.slf4j.Logger; 9 import org.slf4j.LoggerFactory; 10 import org.springframework.stereotype.Component; 11 import org.springframework.web.context.request.RequestContextHolder; 12 import org.springframework.web.context.request.ServletRequestAttributes; 13 14 /** 15 * Created by xingle on 2019/5/15 16 * 此类为一个切面类,主要作用就是对接口的请求进行拦截 17 * 拦截的方式,只需要在指定接口方法上面加上@MonitorRequest注解即可 18 */ 19 20 @Aspect 21 @Component 22 public class RequestAspect { 23 24 private Logger logger = LoggerFactory.getLogger(this.getClass()); 25 26 /** 27 * 环绕通知: 28 * 环绕通知非常强大,可以决定目标方法是否执行,什么时候执行,执行时是否需要替换方法参数,执行完毕是否需要替换返回值。 29 * 环绕通知第一个参数必须是org.aspectj.lang.ProceedingJoinPoint类型 30 */ 31 @Around(value = "@annotation(com.tinno.word.advice.MonitorRequest)") 32 public Object doBefore(ProceedingJoinPoint joinPoint) { 33 34 //获取到请求的属性 35 ServletRequestAttributes attributes = 36 (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); 37 //获取到请求对象 38 HttpServletRequest request = attributes.getRequest(); 39 40 //获取请求的方法,是Get还是Post请求 41 logger.info("method=" + request.getMethod()); 42 43 Object[] args = joinPoint.getArgs(); 44 String de_input = ""; 45 try { 46 logger.debug("解密前:" + args[0].toString()); 47 //这里具体解密方法不再列出 48 de_input = CodeUtils.decrypt(args[0].toString()); 49 logger.debug("解密后:" + de_input); 50 } catch (Exception e) { 51 e.printStackTrace(); 52 } 53 args[0] = de_input; 54 55 Object returnValue = null; 56 try { 57 //执行方法,以新的参数(如果不带args就是用原先的参数) 58 returnValue = joinPoint.proceed(args); 59 logger.debug("returnValue:" +returnValue.toString()); 60 } catch (Throwable throwable) { 61 throwable.printStackTrace(); 62 } 63 64 //执行完毕也可以替换目标方法返回值,这里没有替换 65 return returnValue; 66 67 } 68 69 70 }
四 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
返回结果:
{ "status":true, "msg":"成功", "result":{ "allList":[ { "rand":"小学", "versionLs":[ "人教版(PEP)" ] } ], "bookList":[ { "rand":"小学", "version":"人教版(PEP)", "bookLs":[ { "id":1, "rand":"小学", "version":"人教版(PEP)", "grand":"三年级", "volume":"上册", "publish":"人民教育出版社", "image":"http://study-voice.oss-cn-hangzhou.aliyuncs.com/pictureBook/PEP/Grade_3_1/cover.jpg", "updateTime":"2019-02-15 19:12:49.0", "learnedWordNum":0, "totalNum":64, "learnStatus":"1", "isMyBook":"1", "unitList":[ "Unit 1", "Unit 2", "Unit 3", "Unit 4", "Unit 5", "Unit 6" ] }, { "id":2, "rand":"小学", "version":"人教版(PEP)", "grand":"三年级", "volume":"下册", "publish":"人民教育出版社", "image":"http://study-voice.oss-cn-hangzhou.aliyuncs.com/pictureBook/PEP/Grade_3_2/cover.jpg", "updateTime":"2019-02-15 19:12:51.0", "learnedWordNum":0, "totalNum":71, "learnStatus":"1", "isMyBook":"1", "unitList":[ "Unit 1", "Unit 2", "Unit 3", "Unit 4", "Unit 5", "Unit 6" ] }, { "id":3, "rand":"小学", "version":"人教版(PEP)", "grand":"四年级", "volume":"上册", "publish":"人民教育出版社", "image":"http://study-voice.oss-cn-hangzhou.aliyuncs.com/pictureBook/PEP/Grade_4_1/cover.jpg", "updateTime":"2019-02-15 19:12:53.0", "learnedWordNum":0, "totalNum":84, "learnStatus":"1", "isMyBook":"1", "unitList":[ "Unit 1", "Unit 2", "Unit 3", "Unit 4", "Unit 5", "Unit 6" ] }, { "id":4, "rand":"小学", "version":"人教版(PEP)", "grand":"四年级", "volume":"下册", "publish":"人民教育出版社", "image":"http://study-voice.oss-cn-hangzhou.aliyuncs.com/pictureBook/PEP/Grade_4_2/cover.jpg", "updateTime":"2019-02-15 19:12:56.0", "learnedWordNum":0, "totalNum":104, "learnStatus":"1", "isMyBook":"0", "unitList":[ "Unit 1", "Unit 2", "Unit 3", "Unit 4", "Unit 5", "Unit 6" ] }, { "id":5, "rand":"小学", "version":"人教版(PEP)", "grand":"五年级", "volume":"上册", "publish":"人民教育出版社", "image":"http://study-voice.oss-cn-hangzhou.aliyuncs.com/pictureBook/PEP/Grade_5_1/cover.jpg", "updateTime":"2019-02-15 19:12:59.0", "learnedWordNum":0, "totalNum":129, "learnStatus":"1", "isMyBook":"1", "unitList":[ "Unit 1", "Unit 2", "Unit 3", "Unit 4", "Unit 5", "Unit 6" ] }, { "id":6, "rand":"小学", "version":"人教版(PEP)", "grand":"五年级", "volume":"下册", "publish":"人民教育出版社", "image":"http://study-voice.oss-cn-hangzhou.aliyuncs.com/pictureBook/PEP/Grade_5_2/cover.jpg", "updateTime":"2019-02-18 17:21:42.0", "learnedWordNum":0, "totalNum":156, "learnStatus":"1", "isMyBook":"0", "unitList":[ "Unit 1", "Unit 2", "Unit 3", "Unit 4", "Unit 5", "Unit 6" ] }, { "id":7, "rand":"小学", "version":"人教版(PEP)", "grand":"六年级", "volume":"上册", "publish":"人民教育出版社", "image":"http://study-voice.oss-cn-hangzhou.aliyuncs.com/pictureBook/PEP/Grade_6_1/cover.jpg", "updateTime":"2019-02-18 17:33:50.0", "learnedWordNum":0, "totalNum":147, "learnStatus":"1", "isMyBook":"1", "unitList":[ "Unit 1", "Unit 2", "Unit 3", "Unit 4", "Unit 5", "Unit 6" ] }, { "id":8, "rand":"小学", "version":"人教版(PEP)", "grand":"六年级", "volume":"下册", "publish":"人民教育出版社", "image":"http://study-voice.oss-cn-hangzhou.aliyuncs.com/pictureBook/PEP/Grade_6_2/cover.jpg", "updateTime":"2019-02-18 17:33:57.0", "learnedWordNum":0, "totalNum":91, "learnStatus":"1", "isMyBook":"0", "unitList":[ "Unit 1", "Unit 2", "Unit 3", "Unit 4" ] } ] } ] } }

更多精彩