SpringBoot自定义注解,打印Http请求详细信息

本文介绍了如何自定义Java注解ProhibitDupAccess,用于标记方法并防止重复访问。同时,展示了如何通过AspectJ实现一个切面,捕获请求信息并在执行前后打印日志。控制层中使用了该注解,并在DataSyncController中演示了其应用。
摘要由CSDN通过智能技术生成
  1. 自定义注解
import java.lang.annotation.*;

/**
 * 打印HTTP基本信息以及头信息
 * 可拓展:禁止重复访问
 *
 * @author 
 * @date 2021/8/17 16:41
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ProhibitDupAccess {

}
  1. 定义切面,用于打印请求信息
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.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.Enumeration;

/**
 * 打印HTTP基本信息以及头信息
 * 可拓展:禁止重复访问切面
 *
 * @author 
 * @date 2021/8/17 16:59
 */
@Aspect
@Component
public class ProhibitDupAccessAscpect {

    private final static Logger logger = LoggerFactory.getLogger(ProhibitDupAccessAscpect.class);

    @Pointcut("@annotation(com.hanhua.jkpsp.fesco.aspects.ProhibitDupAccess)")
    public void cut() {
    }

    @Around("cut()")
    public Object invoke(ProceedingJoinPoint pjp) throws Throwable {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request;
        if (attributes != null) {
            request = attributes.getRequest();
            logger.info("<=====================================");
            logger.info("请求来源:" + request.getRemoteAddr());
            logger.info("请求路径:" + request.getRequestURL().toString());
            logger.info("请求方式:" + request.getMethod());
            logger.info("响应方法:" + pjp.getSignature().getDeclaringTypeName() + "." + pjp.getSignature().getName());
            logger.info("请求参数:" + Arrays.toString(pjp.getArgs()));
            logger.info("--------------------------------------");
            Enumeration<String> headerNames = request.getHeaderNames();
            while (headerNames.hasMoreElements()) {
                String key = headerNames.nextElement();
                String value = request.getHeader(key);
                logger.info(key + ":" + value);
            }
            logger.info("=====================================>");
        }

        Object result = pjp.proceed();
        logger.info("响应结果为{}", result);
        return result;
    }

}
  1. 控制层使用注解
@RestController
@RequestMapping("/api")
public class DataSyncController {

    /**
     * 数据同步
     *
     * @param dto dto
     * @return 结果
     */
    @ProhibitDupAccess
    @RequestMapping(path = "/sync", method = RequestMethod.POST)
    public HttpResult sync(@RequestBody DataDTO dto) {
        return new HttpResult(null);
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值