springboot aop 自定义注解
枚举类:
/**
* Created by tzq on 2018/5/21.
*/
public enum MyAnnoEnum {
SELECT("select","查询"),
INSERT("insert","添加"),
UPDATE("update","修改"),
DELECT("delect","删除"); private MyAnnoEnum(String code, String name) {
this.code = code;
this.name = name;
}
public static String getNameByCode(String code) {
for (MyAnnoEnum enm : MyAnnoEnum.values()) {
if (enm.getCode() == code) {
return enm.getName();
}
}
return null;
}
private String code;
private String name; public String getCode() {
return code;
} public void setCode(String code) {
this.code = code;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}
pom.xml
<!--aop-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
MyAnno类:自定义注解类
import cn.supercop.idss.enm.MyAnnoEnum; import java.lang.annotation.*; /**
* 自定义注解类
* Created by tzq on 2018/5/19.
*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAnno { MyAnnoEnum value(); }
HtppHandlerMethodAspect : aop 类
import ch.qos.logback.core.net.SyslogOutputStream;
import cn.supercop.idss.config.MyAnno;
import cn.supercop.idss.domain.system.AuditLog;
import cn.supercop.idss.enm.MyAnnoEnum;
import cn.supercop.idss.service.AuditLogService;
import com.alibaba.fastjson.JSON;
import org.apache.commons.lang.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.*; @Aspect //定义一个切面
@Component
public class HtppHandlerMethodAspect { private Logger log = LoggerFactory.getLogger(HtppHandlerMethodAspect.class);
private static final String[] IGNORE_URI = {"api/login"};//放行集合不进行aop
@Autowired
private AuditLogService auditLogService; /**
* 过滤指定url不aop
* @return true or false
*/
public boolean filter_URL(){
// 接收到请求,记录请求内容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
boolean flag = false;
String url = request.getRequestURL().toString();
log.info(">>>: " + url);
for (String s : IGNORE_URI) {
if (url.contains(s)) {
log.info("访问路径包含在放行集合中");
flag = true;
break;
}
}
return flag ;
} /**
* 所有的 controller 层进行aop扫描
* @param joinPoint
* @throws Exception
*/
@Before("execution(* cn.supercop.idss.controller..*(..))")
public void executioncontroller(JoinPoint joinPoint) throws Exception {
System.out.println("****************************controller 开始****************************");
if(!filter_URL()){
analysis(joinPoint);
}
System.out.println("****************************controller 结束****************************"); } /**
* 所有的mapper层进行aop扫描,
* @param joinPoint
* @throws Exception @Before("execution(* cn.supercop.idss.mapper..*(..)) ")
public void executemapper(JoinPoint joinPoint) throws Exception {
System.out.println("****************************mapper 开始****************************");
if(!"cn.supercop.idss.mapper.AuditLogMapper.insert".equals(joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName()))
analysis(joinPoint);
System.out.println("****************************mapper 结束****************************");
}
*/
public void analysis(JoinPoint joinPoint) throws Exception {
// 接收到请求,记录请求内容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// 记录下请求内容
System.out.println("URL : " + request.getRequestURL().toString());//请求路径
System.out.println("HTTP_METHOD : " + request.getMethod());//请求方法类型
System.out.println("IP : " + request.getRemoteAddr());//
//aop 切点的方法
System.out.println("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
System.out.println("ARGS : " + Arrays.toString(joinPoint.getArgs()));
//获取目标方法的参数信息
Object[] obj = joinPoint.getArgs();
for (Object o : obj) {
System.out.println(o);
} Enumeration<String> enumeration = request.getParameterNames();
Map<String, String> parameterMap = new HashMap();
while (enumeration.hasMoreElements()) {
String parameter = enumeration.nextElement();
parameterMap.put(parameter, request.getParameter(parameter));
}
String str = JSON.toJSONString(parameterMap);
if (obj.length > 0) {
System.out.println("请求的参数信息为:" + str);
}
String action = "缺少类型";//动作
//取自定义注解
Method method=((MethodSignature)joinPoint.getSignature()).getMethod();
Method realMethod = joinPoint.getTarget().getClass().getDeclaredMethod(joinPoint.getSignature().getName(),
method.getParameterTypes());
Annotation an = method.getAnnotation(MyAnno.class);
if(an instanceof MyAnno){
MyAnno myAnno = (MyAnno) an;
action = myAnno.value().getName();
System.out.println("value: " + myAnno.value().getName());
}
//取用户名
Subject subject = SecurityUtils.getSubject();
String username = subject.getPrincipal().toString();
if(MyAnnoEnum.SELECT.getName() != action){
AuditLog auditLog = new AuditLog();
auditLog.setOccurredTime(new Date());//发生时间
auditLog.setAction(action);//动作
auditLog.setObjectName(joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());//操作对像名称
auditLog.setDescription(str);//描述
auditLog.setSource(request.getRequestURL().toString());// '源头';
auditLog.setClientIp(this.getRemortIP(request));//客户端IP
auditLog.setUserId(new Long(1));//用户ID
auditLog.setUserType("内部");//用户类型
auditLog.setStatus((short) 1);//执行状态
auditLog.setCreatedBy(username);//创建人
auditLog.setModifiedBy(username);//创建人
auditLogService.addAuditLog(auditLog);
} } public String getRemortIP(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
} }
主要注解的类:
如Controller:
/**
* 查询蓝牙访问列表
*/
@MyAnno(MyAnnoEnum.SELECT)
@RequestMapping("/selectBluetoothAccess")
@ResponseBody
public Result<Object> selectBluetoothAccess(BluetoothAccess bluetoothAccess) {
如mapper or Dao :
public interface WifiAccessMapper {
Long count(@Param("personId") String personId);
//查询
@MyAnno(MyAnnoEnum.SELECT)
List<WifiAccess> select (WifiAccess wifiAccess);
}
总结:
自定义一个注解,注解引用一个枚举来约束注解后的值,定义来insert/update/select/deltet, 定义在dao层或者Controller层都可以实现,可根据业务需要实现,
在aop HtppHandlerMethodAspect类,根据execution表达式来切,在类中定义来一个常量数组,来过滤一些一个表达式中需要过滤的信息,analysis方法解析参数;
springboot aop 自定义注解的更多相关文章
- springboot aop 自定义注解方式实现完善日志记录(完整源码)
版权声明:本文为博主原创文章,欢迎转载,转载请注明作者.原文超链接 一:功能简介 本文主要记录如何使用aop切面的方式来实现日志记录功能. 主要记录的信息有: 操作人,方法名,参数,运行时间,操作类型 ...
- springboot aop 自定义注解方式实现一套完善的日志记录(完整源码)
https://www.cnblogs.com/wenjunwei/p/9639909.html https://blog.csdn.net/tyrant_800/article/details/78 ...
- springboot+aop+自定义注解,打造通用的全局异常处理和参数校验切面(通用版)
一.引入相应的maven依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifa ...
- SpringBoot系列(十三)统一日志处理,logback+slf4j AOP+自定义注解,走起!
往期精彩推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列(三)配置文件详解 SpringBoot系列(四)we ...
- redis分布式锁-spring boot aop+自定义注解实现分布式锁
接这这一篇redis分布式锁-java实现末尾,实现aop+自定义注解 实现分布式锁 1.为什么需要 声明式的分布式锁 编程式分布式锁每次实现都要单独实现,但业务量大功能复杂时,使用编程式分布式锁无疑 ...
- 利用Spring AOP自定义注解解决日志和签名校验
转载:http://www.cnblogs.com/shipengzhi/articles/2716004.html 一.需解决的问题 部分API有签名参数(signature),Passport首先 ...
- ssm+redis整合(通过aop自定义注解方式)
此方案借助aop自定义注解来创建redis缓存机制. 1.创建自定义注解类 package com.tp.soft.common.util; import java.lang.annotation.E ...
- spring AOP自定义注解方式实现日志管理
今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在appli ...
- spring AOP自定义注解 实现日志管理
今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在appli ...
随机推荐
- Android 性能优化之减少UI过度绘制
什么是过度绘制(OverDraw) 在多层次重叠的UI结构里面,如果不可见的UI也在做绘制的操作,会导致某些像素区域被绘制了多次.这样就会浪费大量的CPU以及GPU资源.过度绘制最直观的影响就是会导致 ...
- JIRA笔记(一):安装部署JIRA
(一) 说明 说明JIRA的安装及破解. 操作系统:WIN 10 数据库:Oracle 12C R2(这个版本的jira,atlassian建议的是 12C R1,不过R2也能用,其他版本不清 ...
- org.springframework.beans.factory.NoUniqueBeanDefinitionException 导致原因之一
导致此异常原因很多,以下仅是针对其中一种因素的解决办法. 下面是DAO接口.Service接口.Service实现类的全路径名(全部定义在com.xxx.projetc包下) com.xxx.proj ...
- awk、grep、sed是linux操作文本的三大利器,也是必须掌握的linux命令之一
awk.grep.sed是linux操作文本的三大利器,也是必须掌握的linux命令之一.三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂.grep更适合单纯的查找或匹配文 ...
- 在android中进行单元测试的步骤
若不知道怎么配上面两个参数
- Git常用命令集锦
本篇Git命令博客主要是一些Git常用命令,适合于有一定Git或linux基础的小伙伴进行参考 1.新建文件夹 mkdir 文件夹名 2.查看目录机构: pwd 3.将文件添加至Git管理范围:git ...
- vue 快速入门、常用指令(1)
1. vue.js的快速入门使用 1.1 vue.js库的下载 vue.js是目前前端web开发最流行的工具库之一,由尤雨溪在2014年2月发布的. 官方网站 中文:https://cn.vuejs. ...
- Python开发【第三篇】基本数据类型
整型 int __author__ = 'Tang' # 将字符串转换为数字 a = " b = int(a) # 前面是0的数转换,默认base按照十进制 a = " b = i ...
- Jenkins pipeline:pipeline 语法详解
jenkins pipeline 总体介绍 pipeline 是一套运行于jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化. ...
- 苹果手机连接Wifi认证机制
Wifi状态保持方法和nas设备 https://patents.google.com/patent/CN106793171A/zh 基于ios终端的离线wifi热点认证方法和认证系统 https:/ ...