Spring Aop中execution的语法
在制作日志管理前要先复习一下Spring Aop中execution的语法,以下面的项目目录结构为例。
@Pointcut(“execution(public * com.example.demo.….*(…))”)
execution语法解析
符号 | 含义 |
---|---|
execution() | 表达式的主体 |
第一个”*“符号 | 代表返回值的类型任意 |
com.shxp | 项目目录结构表示目录com.shxp这个目录 |
第二个”*“符号 | 代表com.shxp目录下面的目录包 |
第一个”controller“符号 | 代表com.shxp下面目录包的controller子包 |
. .* | 代表controller下面的包以及controller下面包的子包里的类 |
.*(…) | 表示任何方法名,括号表示参数,两个点表示任何参数类型 |
需要的jar包
<!-- springboot核心包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- spring-web包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- springboot-aop包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
下面是具体代码
package com.example.demo.aop;
import javax.servlet.http.HttpServletRequest;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.mvc.condition.RequestConditionHolder;
import com.alibaba.fastjson.JSON;
import com.example.demo.until.IpUtil;
@Component
@Aspect
public class LogAspect {
/*需要扫描添加日志的类路径*/
@Pointcut("execution(public * com.example.demo.*..*.*(..))")
private void pointcuts(){
}
/*后置通知*/
@After("pointcuts()")
public void insertLogSuccess(JoinPoint jp) {
/*获取目标类路径*/
String a = jp.getSignature().getDeclaringTypeName();
/*获取目标方法名字*/
String b = jp.getSignature().getName();
/*把方法路径和方法名字拼接*/
String c = a+"."+b;
/*调用添加日志方法*/
/*用路径的+方法名去数据库比对确认访问的方法含义*/
addLog(jp, getDesc(jp));
}
/*添加日志*/
public void addLog(JoinPoint jp,String text){
/*获取参数数组*/
Object[] obj = jp.getArgs();
StringBuffer buffer = new StringBuffer();
if(obj!=null){
for (int i = 0; i < obj.length; i++){
buffer.append("[参数"+(i+1)+":");
System.out.println("=====参数===="+obj[i].toString());
String parameter = JSON.toJSONString(obj[i]);
//System.out.println("========"+json);
buffer.append(parameter);
buffer.append("]");
}
System.out.println("访问的参数是"+buffer);
}
/*获取访问ip地址*/
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
if (requestAttributes != null) {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String ip = IpUtil.getIp(request);
System.out.println("=====ip是====="+ip+"==========");
}
}
/*把方法的目录转译为方法名字*/
public String getDesc(JoinPoint jp){
return "";
}
}
附带ip工具类代码
package com.example.demo.until;
import javax.servlet.http.HttpServletRequest;
public class IpUtil {
public static String getIp(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("X-Real-IP");
}
if(ip==null || ip.length()==0 || "unknown".equalsIgnoreCase(ip)){
ip=request.getRemoteAddr();
}
return ip;
}
}