最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Springboot打印接口的三種方式分享

 更新時間:2022年08月10日 09:56:39   作者:look-word  
這篇文章主要為大家詳細介紹了Springboot打印接口的三種方式:aop切面的方式、過濾器的方式和攔截器的方式,感興趣的可以跟隨小編一起學習一下

1 aop切面的方式 

1.1 實現思路

  • 引入aop依賴
  • 自定義注解
  • 定義切面,采用環(huán)繞通知

1.2 代碼實現

1)引入依賴

xml
<!--aop-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

2)自定義注解LogAnnotation

java
/**
 * 日志注解
 * METHOD 方法上 type 類上
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogAnnotation {

    /**
     * 模塊
     */
    String module() default "";

    /**
     * 簡單描述接口的作用
     */
    String operation() default "";
}

3)定義切面

簡單分析一下切面實現的功能:

java
/**
 * @author : look-word
 * 2022-07-27 16:03
 **/
@Slf4j
@Aspect
@Component
public class LogAspect {

    /**
     * 切入點
     */
    @Pointcut("@annotation(look.word.reggie.common.aop.LogAnnotation)")
    public void logPointCut() {
    }

    /**
     * 環(huán)繞通知
     *
     * @param point 連接點
     */
    @Around("logPointCut()")
    public Object around(ProceedingJoinPoint point) throws Throwable {
        long beginTime = System.currentTimeMillis();
        //執(zhí)行方法
        Object result = point.proceed();
        //執(zhí)行時長(毫秒)
        long time = System.currentTimeMillis() - beginTime;
        //保存日志
        recordLog(point, time);
        return result;
    }

    private void recordLog(ProceedingJoinPoint joinPoint, long time) {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        // 獲取當前方法
        Method method = signature.getMethod();
        LogAnnotation logAnnotation = method.getAnnotation(LogAnnotation.class);
        log.info("=====================log start================================");
        log.info("module:{}", logAnnotation.module());
        log.info("operation:{}", logAnnotation.operation());

        //請求的方法名
        String className = joinPoint.getTarget().getClass().getName();
        String methodName = signature.getName();
        log.info("request method:{}", className + "." + methodName + "()");

        //請求的參數
        Object[] args = joinPoint.getArgs();
        Stream<?> stream = ArrayUtils.isEmpty(args) ? Stream.empty() : Arrays.stream(args);
        List<Object> logArgs =
                stream.filter(arg -> (!(arg instanceof HttpServletRequest) && !(arg instanceof HttpServletResponse))).collect(Collectors.toList());
        String params = JSON.toJSONString(logArgs);
        log.info("params:{}", params);

        //獲取request 設置IP地址
        HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
        log.info("ip:{}", IpUtils.getIpAddr(request));
        
        log.info("execute time : {} ms", time);
        log.info("=====================log end================================");
    }
}

1.3 功能測試

在接口上添加注解即可,還有描述信息

2 過濾器的方式

這種方式簡單點 但是可配置性不高

注意:一定得掃描到spring容器中

創(chuàng)建一個類 實現 filter接口

  • init:該方法是對filter對象進行初始化的方法,僅在容器初始化filter對象結束后被調用一次,參數FilterConfig可以獲得filter的初始化參數;
  • doFilter:可以對request和response進行<u>預處理</u>。其中FilterChain可以將處理后的request和response對象傳遞到過濾鏈上的下一個資源。
  • destroy():該方法在容器銷毀對象前被調用。
java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

@Component
public class LogFilter implements Filter {

    private static final Logger LOG = LoggerFactory.getLogger(LogFilter.class);

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // 打印請求信息
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        LOG.info("------------- LogFilter 開始 -------------");
        LOG.info("請求地址: {} {}", request.getRequestURL().toString(), request.getMethod());
        LOG.info("遠程地址: {}", request.getRemoteAddr());

        long startTime = System.currentTimeMillis();
        filterChain.doFilter(servletRequest, servletResponse);
        LOG.info("------------- LogFilter 結束 耗時:{} ms -------------", System.currentTimeMillis() - startTime);
    }
}

結果

總結

1.過濾器用來實現通用的功能,減少代碼冗余,提高可維護性;

2.一個過濾器可以配置給多個資源使用(編碼過濾器);

3.一個資源也可以配置多個過濾器,按照配置順序調用。

3 攔截器的方式

如果不懂 請先看了 介紹再來

攔截器的介紹

話不說多 直接上代碼

創(chuàng)建攔截器

java
/**
 * 攔截器:Spring框架特有的,常用于登錄校驗,權限校驗,請求日志打印 /login
 * @author : look-word
 * 2022-06-26 13:55
 **/
@Component
public class LogInterceptor implements HandlerInterceptor {
    private static final Logger LOG = LoggerFactory.getLogger(LogInterceptor.class);

        
    @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
         // 打印請求信息
         LOG.info("------------- LogInterceptor 開始 -------------");
         LOG.info("請求地址: {} {}", request.getRequestURL().toString(), request.getMethod());
         LOG.info("遠程地址: {}", request.getRemoteAddr());

         long startTime = System.currentTimeMillis();
         request.setAttribute("requestStartTime", startTime);
         return true;
     }

     @Override
     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
         long startTime = (Long) request.getAttribute("requestStartTime");
         LOG.info("------------- LogInterceptor 結束 耗時:{} ms -------------", System.currentTimeMillis() - startTime);
     }
}

注冊攔截器

把我們的攔截器 注冊到 攔截器鏈中

java
/**
 * @author : look-word
 * 2022-06-26 14:03
 **/
@Configuration
public class SpringMvcConfig implements WebMvcConfigurer {

    @Resource
    private LogInterceptor logInterceptor;
    /**
     * 注冊攔截器
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry
                .addInterceptor(logInterceptor)
                .addPathPatterns("/**")// 對那些接口攔截
                .excludePathPatterns("/login");// 對哪些接機口放行
        WebMvcConfigurer.super.addInterceptors(registry);
    }
}

測試結果

到此這篇關于Springboot打印接口的三種方式分享的文章就介紹到這了,更多相關Springboot打印接口內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • JAVA如何讀取Excel數據

    JAVA如何讀取Excel數據

    這篇文章主要介紹了JAVA如何讀取Excel數據,幫助大家更好的理解和學習Java,感興趣的朋友可以了解下
    2020-09-09
  • Java如何將處理完異常之后的程序能夠從拋出異常的地點向下執(zhí)行?

    Java如何將處理完異常之后的程序能夠從拋出異常的地點向下執(zhí)行?

    今天小編就為大家分享一篇關于Java如何將處理完異常之后的程序能夠從拋出異常的地點向下執(zhí)行?,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • java ant 配置及構建項目圖文教程

    java ant 配置及構建項目圖文教程

    以下是對java ant配置及構建項目進行了詳細的分析介紹,需要的朋友可以過來參考下
    2013-08-08
  • Java如何通過反射取實體類字段取值

    Java如何通過反射取實體類字段取值

    這篇文章主要介紹了Java如何通過反射取實體類字段取值問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • java調用ffmpeg實現轉換視頻

    java調用ffmpeg實現轉換視頻

    這篇文章主要為大家詳細介紹了java調用ffmpeg實現轉換視頻功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • 異步線程traceId如何實現傳遞

    異步線程traceId如何實現傳遞

    文章介紹了如何在異步請求中傳遞traceId,通過重寫ThreadPoolTaskExecutor的方法和實現TaskDecorator接口來增強線程池,確保異步線程間的traceId同步
    2025-02-02
  • SpringBoot項目中HTTP請求體只能讀一次的解決方案

    SpringBoot項目中HTTP請求體只能讀一次的解決方案

    在基于Spring開發(fā)Java項目時,可能需要重復讀取HTTP請求體中的數據,例如使用攔截器打印入參信息等,但當我們重復調用getInputStream()或者getReader()時,通常會遇到SpringBoot HTTP請求只讀一次的問題,本文給出了幾種解決方案,需要的朋友可以參考下
    2024-08-08
  • mybatis那些約定的配置你真的都了解嗎(經驗總結)

    mybatis那些約定的配置你真的都了解嗎(經驗總結)

    mybatsi中Mapper和xml文件之間有很多約定俗稱的規(guī)則,比如名稱匹配,包掃描,別名等,這些規(guī)則是什么。如果想更加靈活,該如何配置呢?今天就給大家講一下如何配置mybatsi的xml文件
    2021-06-06
  • Java垃圾回收機制的finalize方法實例分析

    Java垃圾回收機制的finalize方法實例分析

    這篇文章主要介紹了Java垃圾回收機制的finalize方法,結合實例形式分析了finalize方法的特點及在垃圾回收機制中的相關操作技巧,需要的朋友可以參考下
    2019-08-08
  • MyBatis連接池的深入和動態(tài)SQL詳解

    MyBatis連接池的深入和動態(tài)SQL詳解

    這篇文章主要介紹了MyBatis連接池的深入和動態(tài)SQL詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02

最新評論

金川县| 栾城县| 五大连池市| 大足县| 庐江县| 奎屯市| 昆山市| 万安县| 绥宁县| 清涧县| 同心县| 包头市| 临汾市| 台北市| 蓬安县| 萍乡市| 宝应县| 桦甸市| 海淀区| 大邑县| 淄博市| 玉环县| 黄大仙区| 喀喇| 夏河县| 永平县| 延长县| 定远县| 天祝| 洛川县| 赤水市| 海阳市| 宜川县| 光泽县| 永登县| 嘉兴市| 蓬安县| 顺义区| 闽清县| 洪江市| 西乡县|