Springboot Aop统一管理web请求日志

1.需要依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.47</version>
</dependency>
package com.example.demo.Aop;

import com.alibaba.fastjson.JSONObject;
import com.example.demo.request.RequestBody;
import com.example.demo.request.RequestHeader;
import com.example.demo.request.RequestMessage;
import com.example.demo.respond.ResponseMessage;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.util.Enumeration;
import java.util.HashMap;
import java.util.Map;


@Aspect
@Component
public class WebLogApplication {
    private static Logger logger = (Logger) LoggerFactory.getLogger(WebLogApplication.class);
       ThreadLocal<Long> time=new ThreadLocal<>();
    @Pointcut("execution(public * com.example.demo.controller..*.*(..))")
    public void webLog() {
    }

    @Before("webLog()") //在切入点的方法run之前要干的
    public void logBeforeController(JoinPoint joinPoint) {
        String string = joinPoint.toString();
        Object[] args = joinPoint.getArgs();
        final Object target = joinPoint.getTarget();
        System.out.println("########前置通知########");
        long startTime = System.currentTimeMillis();
        time.set(startTime);
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        RequestMessage requestMessage = new RequestMessage();
        RequestHeader requestHeader = new RequestHeader();
        RequestBody requestbody = new RequestBody();
        //url
        requestHeader.setRequestURI(request.getRequestURI());//返回除去host(域名或者ip)部分的路径
        requestHeader.setRequestURL(request.getRequestURL());//返回全路径
        requestHeader.setContextPath(request.getContextPath());//返回工程名部分,如果工程映射为/,此处返回则为空
        requestHeader.setServletPath(request.getServletPath());返回除去host和工程名部分的路径

        //addr
        requestHeader.setRemoteAddr(request.getRemoteAddr());//获得客户端的ip地址
        requestHeader.setLocalAddr(request.getLocalAddr());获取服务器的IP地址
        requestHeader.setServerName(request.getServerName());//当前页面所在的服务器的名字
        requestHeader.setServerPort(request.getServerPort());
        requestHeader.setScheme(request.getScheme());//返回当前页面使用的协议,http 或是 https;
        requestHeader.setRemoteHost(request.getRemoteHost());//获得客户端的主机名
        requestMessage.setRequestHeader(requestHeader);
        Map<String, Object> parameters = new HashMap<String, Object>();
        Enumeration<String> en = request.getParameterNames();
        while (en.hasMoreElements()) {
            String name = en.nextElement();
            String value = request.getParameter(name);
            parameters.put(name, value);

        }
        JSONObject content = new JSONObject(parameters);
        requestbody.setContent(content);
        requestMessage.setRequestHeader(requestHeader);
        requestMessage.setRequestBody(requestbody);
        logger.info("REQUEST:"+JSONObject.toJSONString(requestMessage));

    }

    @AfterReturning(returning = "object", pointcut = "webLog()")
    public void doAfterReturning(JoinPoint JoinPoint ,Object object) throws Throwable {
        // 处理完请求,返回内容
         System.out.println("########后置通知########");
         JSONObject jsonObject=new JSONObject();
        String json=JSONObject.toJSONString(object);
        ResponseMessage responseMessage = JSONObject.parseObject(json, ResponseMessage.class);
        long endTime = System.currentTimeMillis();
        long  t= endTime-time.get();
        JSONObject jsonObject1 = JSONObject.parseObject(json);
                   jsonObject1.put("time",t);
         logger.info(jsonObject1.toJSONString());
        //logger.info("RESPONSE :" + JSONObject.toJSONString(object));




    }
    @After("webLog()")
    public void doAfter(JoinPoint JoinPoint ){
    System.out.println("########最终通知####");
    }
    @AfterThrowing(pointcut = "webLog()")
    public void afterThrow(JoinPoint JoinPoint ){
        System.out.println("#####报错了######" );
    }
    @Around("webLog()")
  public Object  doAround(ProceedingJoinPoint proceedingJoinPoint ){
        try {
            time.set(System.currentTimeMillis());
            System.out.println("###########方法前#########");
            Object proceed = proceedingJoinPoint.proceed();
            System.out.println("###########方法后#########");
            return proceed;
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        return null;
    }

}
package com.example.demo.respond;

import com.example.demo.constant.Constant;

import java.util.HashMap;
import java.util.Map;



public class ResponseMessage {
	private String resultcode; //返回码
    private String description; //返回描述
    private Map<String,Object> returnResult=new HashMap<String,Object>(); //返回结果
    
	public ResponseMessage() {}

	public ResponseMessage(String resultcode, String description, Map<String, Object> returnResult) {
		super();
		this.resultcode = resultcode;
		this.description = description;
		this.returnResult = returnResult;
	}

	public ResponseMessage(String resultcode, String description) {
		super();
		this.resultcode = resultcode;
		this.description = description;
	}

	public String getResultcode() {
		return resultcode;
	}
	public String getDescription() {
		return description;
	}
	public Map<String, Object> getReturnResult() {
		return returnResult;
	}
	public void setResultcode(String resultcode) {
		this.resultcode = resultcode;
	}
	public void setDescription(String description) {
		this.description = description;
	}
	public void setReturnResult(Map<String, Object> returnResult) {
		this.returnResult = returnResult;
	}
   public static ResponseMessage getSuccess(Map<String,Object> map){

	  return new ResponseMessage(Constant.SUCCESS, Constant.SUCCESS_DESCRIPTION, map);
   }
   public static ResponseMessage getSuccess(){
		return new ResponseMessage(Constant.SUCCESS,Constant.SUCCESS_DESCRIPTION);
   }
   public static ResponseMessage getFailed(Map<String,Object> map){
	   return new ResponseMessage(Constant.FAILED, Constant.FAILED_SYSTEM_ERROR, map);
   }
   public ResponseMessage add(String key,Object object){
		returnResult.put(key,object);
	   return this;
   }

@Override
public String toString() {
	return "ResponseMessage [resultcode=" + resultcode + ", description=" + description + ", returnResult="
			+ returnResult + "]";
}
}
package com.example.demo.request;

import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import com.alibaba.fastjson.JSONObject;

public class RequestMessage {
private RequestHeader requestHeader;
private RequestBody requestBody;
public RequestHeader getRequestHeader() {
	return requestHeader;
}
public RequestBody getRequestBody() {
	return requestBody;
}
public void setRequestHeader(RequestHeader requestHeader) {
	this.requestHeader = requestHeader;
}
public void setRequestBody(RequestBody requestBody) {
	this.requestBody = requestBody;
}

	public static void main(String[] args) {
		ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
		HttpServletRequest request = attributes.getRequest();
		RequestMessage requestMessage=new RequestMessage();
		RequestHeader requestHeader=new RequestHeader();
		RequestBody  requestbody=new RequestBody();
		//url
		requestHeader.setRequestURI(request.getRequestURI());//返回除去host(域名或者ip)部分的路径
		requestHeader.setRequestURL(request.getRequestURL());//返回全路径
		requestHeader.setContextPath(request.getContextPath());//返回工程名部分,如果工程映射为/,此处返回则为空
		requestHeader.setServletPath(request.getServletPath());返回除去host和工程名部分的路径
		
		//addr	
		requestHeader.setRemoteAddr(request.getRemoteAddr());//获得客户端的ip地址
		requestHeader.setLocalAddr(request.getLocalAddr());获取服务器的IP地址
		requestHeader.setServerName(request.getServerName());//当前页面所在的服务器的名字
		requestHeader.setServerPort(request.getServerPort());
		requestHeader.setScheme(request.getScheme());//返回当前页面使用的协议,http 或是 https;
	    requestHeader.setRemoteHost(request.getRemoteHost());//获得客户端的主机名
	    requestMessage.setRequestHeader(requestHeader);
	    Map<String,Object> parameters=new HashMap<String,Object>();
		Enumeration<String> en = request.getParameterNames();
		while (en.hasMoreElements()) {
			 String name = en.nextElement();
			 String value = request.getParameter(name);
			 parameters.put(name, value);
			
		}
		JSONObject content=new JSONObject(parameters);
		requestbody.setContent(content);
		requestMessage.setRequestHeader(requestHeader);
		requestMessage.setRequestBody(requestbody);
		
	}

	@Override
	public String toString() {
		return "RequestMessage{" +
				"requestHeader=" + requestHeader +
				", requestBody=" + requestBody +
				'}';
	}
}
package com.example.demo.request;

public class RequestHeader {
	private String requestURI;
	private StringBuffer requestURL;
	private String contextPath;
	private String servletPath;
	private String remoteAddr;
	private String LocalAddr;
	private String serverName;
	private int serverPort;
	private String scheme;
	private String remoteHost;
	private long time;

	。。。。。get/set
}
package com.example.demo.request;

import com.alibaba.fastjson.JSONObject;

public class RequestBody {
private JSONObject content;//客户端传入的数据
//用户信息
//....
public JSONObject getContent() {
	return content;
}

public void setContent(JSONObject content) {
	this.content = content;
}

	@Override
	public String toString() {
		return "RequestBody{" +
				"content=" + content +
				'}';
	}
}
package com.example.demo.constant;

public class Constant {
public static final String SUCCESS="10";
public static final String FAILED="00";
public static final String SUCCESS_DESCRIPTION  = "操作成功";
public static final String FAILED_SYSTEM_ERROR  = "系统错误";
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值