声明:本文纯属个人随手笔记,如果对您有参考价值我十分开心,如果有存在错误,或者有更好的解决办法也麻烦您留言告诉我,大家共同成长,切勿恶言相。 欢迎加入资源共享QQ群:275343679,一起发现知识、了解知识、学习知识、分享知识。网站:www.itlantian.top

=======================================================================

SpringBoot   拦截器和自定义注解进行数据拦截

切面开关配置:

spring.aop.auto: true
spring.aop.proxy-target-class: true

1.实现代码如下:

  • 控制层
package com.xxx.product.admin.controller.stocks;import java.util.List;
import java.util.Map;import javax.servlet.http.HttpServletRequest;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;/*** @ClassName StockRedisController* @Description * @Author zhangs* @Date 2018年10月9日 上午11:04:43*/
@Controller
@RequestMapping("/stockRedis")
public class StockRedisController {private static final Logger logger = LoggerFactory.getLogger(StockRedisController.class);@StockAnnotation(modelName = "stockRedis", option = "test")@RequestMapping("/test")@ResponseBodypublic String test(@RequestBody String param, HttpServletRequest request){try {logger.info("request start ..."+param);Thread.sleep(1000L);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}logger.info("request end ..."+param);return  "OK";}}
  • 定义注解
package com.xxx.common.stock.aop;import java.lang.annotation.*;//@Retention: 定义注解的保留策略,
@Retention(RetentionPolicy.RUNTIME)// 注解会在class字节码文件中存在,在运行时可以通过反射获取到
//@Target:定义注解的作用目标
@Target({ElementType.METHOD,ElementType.PARAMETER})// 方法和方法参数
@Inherited//说明子类可以继承父类中的该注解
@Documented//说明该注解将被包含在javadoc中
public @interface StockAnnotation {/*** 模块名字*/String modelName() default "";/*** 操作类型*/String option();
}
  • 定义切面
package com.xxx.common.stock.interceptor;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;import javax.servlet.http.HttpServletRequest;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import com.xxx.common.stock.aop.StockAnnotation;
import com.xxx.common.utils.mapper.JsonMapper;
import com.xxx.product.stocks.domain.vo.StockPara;
import com.xxx.product.stocks.service.intf.StockService;/*** @ClassName StockUpdateAspect* @Description * @Author zhangs* @Date 2018年10月26日 下午3:17:49*/
@Aspect //将一个类定义为一格切面
@Component //标记切面类的处理优先级,i值越小,优先级别越高。ps:可以注解类,也可以注解到方法上
public class StockUpdateAspect {private static final Logger logger = LoggerFactory.getLogger(StockUpdateAspect.class); @Autowiredprivate StockService          stockService;/*** 定义Pointcut,Pointcut的名称,此方法不能有返回值,该方法只是一个标示*/@Pointcut("@annotation(com.xxx.common.stock.aop.StockAnnotation)")public void StockAspect (){System.out.println("一个切入点");}/*** 拦截执行体* @param pjp* @param stockAnnotation* @return* @throws Throwable*/@Around(value = "StockAspect()  && @annotation(stockAnnotation)")public Object doAround(ProceedingJoinPoint pjp, StockAnnotation stockAnnotation) throws Throwable {Object result = null;try {logger.info("数据拦截 >> Name:{} >> Option:{} >> param:{}",stockAnnotation.modelName(),stockAnnotation.option(),Arrays.toString(pjp.getArgs()));//接收到请求,记录请求内容//ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();//HttpServletRequest request = attributes.getRequest();// 记录下请求内容/*logger.info("IP: {} >> URI: {} >> HTTP_METHOD: {} >> CLASS_METHOD: {} >> ARGS: {}",request.getRemoteAddr() ,request.getRequestURI(),request.getMethod(),pjp.getSignature().getDeclaringTypeName() + "_" + pjp.getSignature().getName(),Arrays.toString(pjp.getArgs()));*/result =pjp.proceed();//业务执行代码String data=JsonMapper.toJsonString(pjp.getArgs()[0]);logger.info("ARGS对象1:{}", data);List<StockPara>  stockList=new ArrayList<StockPara>();StockPara stock=null;String regex="(\"activeCode\":\"|\"goodsSid\":)(.*?)(\"|,|},|}|}]$)";//正则表达式Matcher matcher = Pattern.compile(regex).matcher(data);while (matcher.find()) {logger.info("参数:{} >> 参数名:{} >> 参数值: {}",matcher.group(0),matcher.group(1),matcher.group(2));stock=new StockPara();String value=matcher.group(2);if(!ObjectUtils.isEmpty(matcher.group(2))){if(matcher.group(1).indexOf("activeCode")>0){stock.setActiveCode(value);}else if(matcher.group(1).indexOf("goodsSid")>0){stock.setGoodsSid(Long.valueOf(value));}stockList.add(stock);}};stockRedisService.synUpdateStockForRedis(stockList);} catch (Exception e) {// TODO: handle exceptionlogger.error("数据拦截  >> 模板名称:{} >> 操作类型:{} >> 异常:{}",stockAnnotation.modelName(),stockAnnotation.option(),e.toString());}          return result;}}

SpringBoot 拦截器和AOP自定义注解进行数据拦截实例相关推荐

  1. Spring拦截器(实现自定义注解)

    一.定义注解类 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Authority ...

  2. 【Spring MVC拦截器+logback日志+自定义注解】实现用户鉴权登陆和访问日志记录

    摘要说明: 项目中经常这样的需要 1. 登陆鉴权:比如用户浏览器发出某个请求的时候我们需要判断这个用户是否已经登陆,也就是cookie中是否有他的登陆信息. 2. 访问日志记录:用户访问请求的时候我们 ...

  3. SpringBoot 整合JWT实现基于自定义注解的-登录请求验证拦截(保姆级教学,附:源码)

    学习目标: Spring Boot 整合JWT实现基于自定义注解的 登录请求接口拦截 例: 一篇掌握 JWT 入门知识  1.1 在学习SpringBoot 整合JWT之前,我们先来说说JWT进行用户 ...

  4. springboot+aop+自定义注解,打造通用的全局异常处理和参数校验切面(通用版)

    springboot+aop+自定义注解,打造通用的全局异常处理和参数校验切面(通用版) 参考文章: (1)springboot+aop+自定义注解,打造通用的全局异常处理和参数校验切面(通用版) ( ...

  5. 使用拦截器或者AOP实现权限管理(OA系统中实现权限控制)

    在开发类似与OA管理系统类型的项目中,经常需要设置到权限管理.例如对某个部门的人员CURD操作,默认是该部门的普通员工是不会有该权限的.但若某个员工升级为该部分的负责人.则此时它就拥有对该部门的CUR ...

  6. spring AOP自定义注解方式实现日志管理

    转:spring AOP自定义注解方式实现日志管理 今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接 ...

  7. Java AOP自定义注解

    一.背景 在之前文章:Java注解详解中,主要介绍了注解的含义.作用.以及常用的各类注解.今天主要介绍在Springboot中如何实现一个自定义注解,通过自定义注解去实现一些定制化的需求. 二.了解元 ...

  8. 过滤器、拦截器和AOP的分析与对比

    文章目录 一.过滤器(Filter) 1.1 简介 1.2 应用场景 1.3 源码分析 二.拦截器(Interceptor) 2.1 简介 2.2 应用场景 2.2 源码分析 三.面向切面编程(AOP ...

  9. 过滤器,拦截器,aop 比较

    Filter过滤器 过滤器拦截web访问url地址. 严格意义上讲,filter只是适用于web中,依赖于Servlet容器,利用Java的回调机制进行实现. Filter过滤器:和框架无关,可以控制 ...

最新文章

  1. SQL Server 中print Datetime类型问题
  2. Services(服务)
  3. linux mint 17.3 内核,LinuxMint 17.3 Cinnamon抢鲜评测
  4. 如何解决Document transaction is being distributed的message
  5. 真是的= =还是对linux不太了解啊
  6. 测试工程师---笔试面试题
  7. 基于Solana区块链的去中心化交易所Orca正式启动
  8. git配置全局用户名和密码_centos安装mongodb 4.x及配置用户名密码(官方推荐)
  9. 使用Poedit汉化wordpress主题
  10. mysql 父子关系查询_如何让MySQL中单句实现无限层次父子关系查询
  11. 5月27日股市趋势追踪策略分析
  12. python游戏制作rpg_python实现的简单RPG游戏流程实例
  13. 快速保存网页资料——fireshot与PDFdownload
  14. 独家 | 零基础入门优化问题
  15. Hive学习(7)pmod()函数详解
  16. Kafka High Level API vs. Low Level API
  17. 频率控制方式及优缺点总结
  18. 格力造车梦碎,终止筹划发行股份收购珠海银隆
  19. 我从小就有一个疑问,为什么所有的星球都是漂浮在空中的?
  20. aion单机服务器维护中,永恒之塔(AION)单机版架设图文教程

热门文章

  1. 每日新闻 | 中国移动与中国工商银行签署战略合作协议
  2. pandas_因子标准化(例子)
  3. css3实现动画效果完整代码demo
  4. [实体关系抽取]TPLinker: Single-stage Joint Extraction of Entities and Relations Through Token Pair Link
  5. 用execjs破解百度翻译sign
  6. 用工具测试游戏的平衡性-简单的打架机器人编写
  7. 怎么把gif变成一张一张的png图片?
  8. 弘辽科技:直通车如何拉回精准人群
  9. Unity制作手机端VR第一步
  10. 大学生可以参加的计算机比赛