国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SpringMVC-2-Spring MVC攔截器詳解:從入門到精通

這篇具有很好參考價(jià)值的文章主要介紹了SpringMVC-2-Spring MVC攔截器詳解:從入門到精通。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

SpringMVC-2-Spring MVC攔截器詳解:從入門到精通

今日目標(biāo)

能夠編寫攔截器并配置攔截器

1.攔截器【理解】

1 攔截器介紹

1.1 攔截器概念和作用

SpringMVC-2-Spring MVC攔截器詳解:從入門到精通,JavaWeb,spring

  • 攔截器(Interceptor)是一種動(dòng)態(tài)攔截方法調(diào)用的機(jī)制,在SpringMVC中動(dòng)態(tài)攔截控制器方法的執(zhí)行

  • 作用:
    1. 在指定的方法調(diào)用前后執(zhí)行預(yù)先設(shè)定的代碼

    2. 阻止原始方法的執(zhí)行

    3. 總結(jié):增強(qiáng)

  • 核心原理:AOP思想

1.2 攔截器和過濾器的區(qū)別

  • 歸屬不同:Filter屬于Servlet技術(shù),Interceptor屬于SpringMVC技術(shù)

  • 攔截內(nèi)容不同:Filter對(duì)所有訪問進(jìn)行增強(qiáng),Interceptor僅針對(duì)SpringMVC的訪問進(jìn)行增強(qiáng)

1.3 攔截器應(yīng)用場(chǎng)景

攔截器本質(zhì)上是面向切面編程(AOP),符合橫切關(guān)注點(diǎn)的功能都可以放在攔截器中來實(shí)現(xiàn),主要的應(yīng)用場(chǎng)景包括:

  • 登錄驗(yàn)證,判斷用戶是否登錄。

  • 權(quán)限驗(yàn)證,判斷用戶是否有權(quán)限訪問資源,如校驗(yàn)token

  • 日志記錄,記錄請(qǐng)求操作日志(用戶ip,訪問時(shí)間等),以便統(tǒng)計(jì)請(qǐng)求訪問量。

  • 處理cookie、本地化、國際化、主題等。

  • 性能監(jiān)控,監(jiān)控請(qǐng)求處理時(shí)長等。

2 入門案例

2.1 實(shí)現(xiàn)步驟

1?創(chuàng)建web工程(Maven?web結(jié)構(gòu))
2?導(dǎo)入坐標(biāo)(SpringMVC+Servlet)
3?SpringMVCConfig?配置類?配置前綴”/pages/”和后綴”.jsp”
4?ServletConfig?配置類創(chuàng)建IOC容器和攔截請(qǐng)求路徑”/”
5?自定義控制器類(StudentController)
6?開發(fā)視圖頁面/pages/success.jsp

2.2 代碼實(shí)現(xiàn)

【第一步】創(chuàng)建web工程(Maven結(jié)構(gòu))

SpringMVC-2-Spring MVC攔截器詳解:從入門到精通,JavaWeb,spring

【第二步】導(dǎo)入坐標(biāo)(SpringMVC+Servlet)
<dependencies>?
?<!--spring-webmvc-->??
?<dependency>?
???<groupId>org.springframework</groupId>??
???<artifactId>spring-webmvc</artifactId>??
???<version>5.3.15</version>?
?</dependency>??
?<!--servlet-->??
?<dependency>?
???<groupId>javax.servlet</groupId>??
???<artifactId>javax.servlet-api</artifactId>??
???<version>4.0.1</version>??
???<scope>provided</scope>?
?</dependency>?
</dependencies>?
【第三步】創(chuàng)建SpringMvc配置文件
/**
*?SpringMVC配置類
*/
@Configuration?//1.標(biāo)識(shí)當(dāng)前是配置類?指定這個(gè)類為配置類,替代application.xml
@ComponentScan("com.zbbmeta")//2.配置掃描web層包?代替<context:component-scan?base-package="com.zbbmeta"?/>
@EnableWebMvc?//如果使用接口的方式,攔截器需要添加這個(gè)注解。不建議使用這種方式,兩種方式只能配置一種,否則會(huì)有沖突
public?class?SpringMvcConfig?{
}
【第四步】創(chuàng)建Web容器初始化的配置類
public?class?ServletConfig??extends?AbstractAnnotationConfigDispatcherServletInitializer?{

????//?暫時(shí)不管,整合Spring才需要
????@Override
????protected?Class<?>[]?getRootConfigClasses()?{
????????return?new?Class[0];
????}
????//在tomcat啟動(dòng)時(shí)調(diào)用,用于創(chuàng)建springmvc框架的IOC容器對(duì)象
????//加載springmvc配置類,?Tomcat會(huì)拿這個(gè)配置類去創(chuàng)建IoC容器,產(chǎn)生springmvc容器(本質(zhì)還是spring容器)
????@Override
????protected?Class<?>[]?getServletConfigClasses()?{
????????return?new?Class[]?{SpringMvcConfig.class};
????}
????//?指定SpringMVC要處理哪些請(qǐng)求,?/表示SpringMVC處理項(xiàng)目中的所有請(qǐng)求,?靜態(tài)資源不要讓SpringMVC處理,要放行
????//設(shè)置DispatcherServlet綁定處理請(qǐng)求的路徑"/",處理除了jsp的所有資源請(qǐng)求
????@Override
????protected?String[]?getServletMappings()?{
????????return?new?String[]?{"/"};
????}
}
【第五步】創(chuàng)建控制器
package?com.zbbmeta.controller;

import?org.springframework.web.bind.annotation.RequestMapping;
import?org.springframework.web.bind.annotation.RestController;
import?javax.servlet.http.HttpServletRequest;
import?javax.servlet.http.HttpServletResponse;

@RestController
@RequestMapping("/student")//RequestMapping可以在類或者方法上添加
public?class?StudentController?{
????/**
?????*?查找Student
?????*/
????@RequestMapping("/find")
????public?String?find(HttpServletRequest?request,?HttpServletResponse?response)?{
????????System.out.println("查找Student");
????????return?"find?success";
????}
}

2.3 攔截器代碼實(shí)現(xiàn)

【第一步】定義攔截器

做法:定義一個(gè)類,實(shí)現(xiàn)HandlerInterceptor接口即可

package?com.zbbmeta.Iinterceptor;

import?org.springframework.web.servlet.HandlerInterceptor;
import?org.springframework.web.servlet.ModelAndView;

import?javax.servlet.http.HttpServletRequest;
import?javax.servlet.http.HttpServletResponse;

public?class?StudentInterceptor?implements?HandlerInterceptor?{
????//原始方法調(diào)用前執(zhí)行的內(nèi)容
????//返回值類型可以攔截控制的執(zhí)行,true放行,false終止
????@Override
????public?boolean?preHandle(HttpServletRequest?request,?HttpServletResponse?response,?Object?handler)?throws?Exception?{
????????System.out.println("=================前置通知=================");
????????return?true;
????}
????//原始方法調(diào)用后執(zhí)行的內(nèi)容
????@Override
????public?void?postHandle(HttpServletRequest?request,?HttpServletResponse?response,?Object?handler,?ModelAndView?modelAndView)?throws?Exception?{
????????System.out.println("=================后置通知=================");
????}
????//原始方法調(diào)用完成后執(zhí)行的內(nèi)容
????@Override
????public?void?afterCompletion(HttpServletRequest?request,?HttpServletResponse?response,?Object?handler,?Exception?ex)?throws?Exception?{
????????System.out.println("=================最終通知=================");
????}
}
【第二步】配置加載攔截器

配置加載攔截器的方式有兩種我們分別介紹:

加載攔截器方法1:

注:@Configuration注解已經(jīng)包含@Component的功能

  1. 在上面添加靜態(tài)資源的配置類中重寫addInterceptors方法

  2. 添加攔截器和多個(gè)攔截路徑:/book和/book/**

  3. 要注入攔截器對(duì)象

package?com.zbbmeta.config;

import?com.zbbmeta.Iinterceptor.StudentInterceptor;
import?org.springframework.context.annotation.Configuration;
import?org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import?org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

@Configuration
public?class?SpringMvcSupport?extends?WebMvcConfigurationSupport?{

????@Override
????protected?void?addInterceptors(InterceptorRegistry?registry)?{
????????//注解攔截器和攔截地址???表示添加?StudentInterceptor??取攔截路徑是?/student/*?所有請(qǐng)求
????????registry.addInterceptor(new?StudentInterceptor()).addPathPatterns("/student/*");
????}
}
加載攔截器方法2:

使用標(biāo)準(zhǔn)接口WebMvcConfigurer簡化開發(fā)(注意:侵入式較強(qiáng))

  1. 在SpringMvcConfig主配置類上實(shí)現(xiàn)WebMvcConfigurer接口,接口中全是默認(rèn)方法

  2. 注入攔截器對(duì)象,重寫addInterceptors方法

注:與方式一兩者只能選一種,不然會(huì)有沖突,如果方式一起作用會(huì)導(dǎo)致第二種方式的攔截器不起使用。

即:如果項(xiàng)目中出現(xiàn)了一次 extends WebMvcConfigurationSupport ,其他的 extends WebMvcConfigurationSupport 和 implements WebMvcConfigurer 會(huì)失效 。

/**
?*?SpringMVC配置類
?*/
@Configuration?//1.標(biāo)識(shí)當(dāng)前是配置類?指定這個(gè)類為配置類,替代application.xml
@ComponentScan("com.zbbmeta")//2.配置掃描web層包?代替<context:component-scan?base-package="com.zbbmeta"?/>
@EnableWebMvc?//如果使用接口的方式,攔截器需要添加這個(gè)注解。不建議使用這種方式,兩種方式只能配置一種,否則會(huì)有沖突
public?class?SpringMvcConfig??implements?WebMvcConfigurer?{
????@Override
????public?void?addInterceptors(InterceptorRegistry?registry)?{
????????//注解攔截器和攔截地址???表示添加?StudentInterceptor??取攔截路徑是?/student/*?所有請(qǐng)求
????????registry.addInterceptor(new?StudentInterceptor()).addPathPatterns("/student/*");
????}
}

2.4 攔截器流程分析

SpringMVC-2-Spring MVC攔截器詳解:從入門到精通,JavaWeb,spring

3 攔截器參數(shù)

3.1 前置處理

//原始方法調(diào)用前執(zhí)行的內(nèi)容
//返回值類型可以攔截控制的執(zhí)行,true放行,false終止
@Override
public?boolean?preHandle(HttpServletRequest?request,?HttpServletResponse?response,?Object?handler)?throws?Exception?{
????System.out.println("=================前置通知=================");
????return?true;
}
  • 參數(shù)

    1. request:請(qǐng)求對(duì)象

    2. response:響應(yīng)對(duì)象

    3. handler:被調(diào)用的處理器對(duì)象,本質(zhì)上是一個(gè)方法對(duì)象,對(duì)反射技術(shù)中的Method對(duì)象進(jìn)行了再包裝

  • 返回值 返回值為false,被攔截的處理器將不執(zhí)行。

3.2 后置處理

//原始方法調(diào)用后執(zhí)行的內(nèi)容
@Override
public?void?postHandle(HttpServletRequest?request,?HttpServletResponse?response,?Object?handler,?ModelAndView?modelAndView)?throws?Exception?{
????System.out.println("=================后置通知=================");
}
  • 參數(shù) modelAndView:如果處理器執(zhí)行完成具有返回結(jié)果,可以讀取到對(duì)應(yīng)數(shù)據(jù)與頁面信息,并進(jìn)行跳轉(zhuǎn)

注意:如果處理器方法出現(xiàn)異常了,該方法不會(huì)執(zhí)行

3.3 完成后處理

//原始方法調(diào)用完成后執(zhí)行的內(nèi)容
@Override
public?void?afterCompletion(HttpServletRequest?request,?HttpServletResponse?response,?Object?handler,?Exception?ex)?throws?Exception?{
????System.out.println("=================最終通知=================");
}
  • 參數(shù) ex:如果處理器執(zhí)行過程中出現(xiàn)異常對(duì)象,可以針對(duì)異常情況進(jìn)行單獨(dú)處理

注意:無論處理器方法內(nèi)部是否出現(xiàn)異常,該方法都會(huì)執(zhí)行。

**思考:postHandle()和afterCompletion()方法都是處理器方法執(zhí)行之后執(zhí)行,有什么區(qū)別?

4 攔截器鏈配置

4.1 多個(gè)攔截器配置

  • 定義第二個(gè)攔截器

package?com.zbbmeta.Iinterceptor;

import?org.springframework.web.servlet.HandlerInterceptor;
import?org.springframework.web.servlet.ModelAndView;
import?javax.servlet.http.HttpServletRequest;
import?javax.servlet.http.HttpServletResponse;

public?class?StudentInterceptor2?implements?HandlerInterceptor?{
????//原始方法調(diào)用前執(zhí)行的內(nèi)容
????//返回值類型可以攔截控制的執(zhí)行,true放行,false終止
????@Override
????public?boolean?preHandle(HttpServletRequest?request,?HttpServletResponse?response,?Object?handler)?throws?Exception?{
????????System.out.println("=================Student2前置通知=================");
????????return?true;
????}
????//原始方法調(diào)用后執(zhí)行的內(nèi)容
????@Override
????public?void?postHandle(HttpServletRequest?request,?HttpServletResponse?response,?Object?handler,?ModelAndView?modelAndView)?throws?Exception?{
????????System.out.println("=================Student2后置通知=================");
????}
????//原始方法調(diào)用完成后執(zhí)行的內(nèi)容
????@Override
????public?void?afterCompletion(HttpServletRequest?request,?HttpServletResponse?response,?Object?handler,?Exception?ex)?throws?Exception?{
????????System.out.println("=================Student2最終通知=================");
????}
}

  • 配置加載第二個(gè)攔截器

/**
?*?SpringMVC配置類
?*/
@Configuration?//1.標(biāo)識(shí)當(dāng)前是配置類?指定這個(gè)類為配置類,替代application.xml
@ComponentScan("com.zbbmeta")//2.配置掃描web層包?代替<context:component-scan?base-package="com.zbbmeta"?/>
@EnableWebMvc?//如果使用接口的方式,攔截器需要添加這個(gè)注解。不建議使用這種方式,兩種方式只能配置一種,否則會(huì)有沖突
public?class?SpringMvcConfig??implements?WebMvcConfigurer?{
????@Override
????public?void?addInterceptors(InterceptorRegistry?registry)?{
????????//注解攔截器和攔截地址???表示添加?StudentInterceptor??取攔截路徑是?/student/*?所有請(qǐng)求
????????registry.addInterceptor(new?StudentInterceptor()).addPathPatterns("/student/*");
????????registry.addInterceptor(new?StudentInterceptor2()).addPathPatterns("/student/*");
????}
}

提示:可以使用excludePathPatterns()方法排除某些地址不被攔截

  • 執(zhí)行效果

SpringMVC-2-Spring MVC攔截器詳解:從入門到精通,JavaWeb,spring

4.2 多個(gè)連接器工作流程分析

  • 當(dāng)配置多個(gè)攔截器時(shí),形成攔截器鏈

  • 攔截器鏈的運(yùn)行順序參照攔截器添加順序?yàn)闇?zhǔn)

  • 當(dāng)攔截器中出現(xiàn)對(duì)原始處理器的攔截,后面的攔截器均終止運(yùn)行

  • 當(dāng)攔截器運(yùn)行中斷,僅運(yùn)行配置在前面的攔截器的afterCompletion操作文章來源地址http://www.zghlxwxcb.cn/news/detail-664019.html

到了這里,關(guān)于SpringMVC-2-Spring MVC攔截器詳解:從入門到精通的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • SpringMvc攔截器入門 -- SpringMVC快速入門保姆級(jí)教程(五)

    SpringMvc攔截器入門 -- SpringMVC快速入門保姆級(jí)教程(五)

    為了鞏固所學(xué)的知識(shí),作者嘗試著開始發(fā)布一些學(xué)習(xí)筆記類的博客,方便日后回顧。當(dāng)然,如果能幫到一些萌新進(jìn)行新技術(shù)的學(xué)習(xí)那也是極好的。作者菜菜一枚,文章中如果有記錄錯(cuò)誤,歡迎讀者朋友們批評(píng)指正。 (博客的參考源碼可以在我主頁的資源里找到,如果在學(xué)習(xí)的

    2024年02月10日
    瀏覽(25)
  • Spring MVC攔截器和跨域請(qǐng)求

    Spring MVC攔截器和跨域請(qǐng)求

    SpringMVC的攔截器(Interceptor)也是AOP思想的一種實(shí)現(xiàn)方式。它與Servlet的過濾器(Filter)功能類似,主要用于攔截用戶的請(qǐng)求并做相應(yīng)的處理,通常應(yīng)用在權(quán)限驗(yàn)證、記錄請(qǐng)求信息的日志、判斷用戶是否登錄等功能上。 攔截器和過濾器的區(qū)別 攔截器是SpringMVC組件,而過濾器是

    2024年02月16日
    瀏覽(89)
  • Spring MVC攔截器Interceptor使用(判斷用戶登錄)

    Spring MVC攔截器Interceptor使用(判斷用戶登錄)

    Spring MVC中的攔截器(Interceptor)類似于Servlet中的過濾器(Filter),它主要用于攔截用戶請(qǐng)求并作相應(yīng)的處理。例如通過攔截器可以進(jìn)行權(quán)限驗(yàn)證、記錄請(qǐng)求信息的日志、判斷用戶是否登錄等。 攔截器可以在進(jìn)入處理器之前做一些操作,或者在處理器完成后進(jìn)行操作,甚至是

    2024年02月09日
    瀏覽(33)
  • SpringMvc攔截器和手寫模擬SpringMvc工作流程源碼詳解

    SpringMvc攔截器和手寫模擬SpringMvc工作流程源碼詳解

    目錄 1. SpringMvc簡介 1.1 什么是MVC 1.2 什么是SpringMvc 1.3 SpringMvc 能干什么 1.4 SpringMvc 工作流程 2. SpringMvc攔截器和過濾器 2.1 攔截器 2.1.1 攔截器作用 2.1.2 攔截器和過濾器的區(qū)別 2.1.3 攔截器方法說明 2.1.4 多個(gè)攔截器執(zhí)行順序 2.1.5 自定義攔截器 2.2?過濾器(附加) 3. 手寫模擬Spri

    2024年02月09日
    瀏覽(25)
  • Spring MVC學(xué)習(xí)筆記,包含mvc架構(gòu)使用,過濾器、攔截器、執(zhí)行流程等等

    Spring MVC學(xué)習(xí)筆記,包含mvc架構(gòu)使用,過濾器、攔截器、執(zhí)行流程等等

    ??????創(chuàng)作不易,各位看官點(diǎn)贊收藏. Spring MVC:Spring MVC是Spring Framework的一部分,是基于java實(shí)現(xiàn)的MVC的輕量級(jí)Web框架。 官網(wǎng)文檔地址:https://docs.spring.io/spring-framework/docs/4.2.4.RELEASE/spring-framework-reference/html/mvc.html 輕量級(jí),簡單易學(xué)。 高效,基于請(qǐng)求和響應(yīng)的MVC框架。 與Spri

    2024年02月15日
    瀏覽(29)
  • 學(xué)習(xí) [Spring MVC] 的JSR 303和攔截器,提高開發(fā)效率

    學(xué)習(xí) [Spring MVC] 的JSR 303和攔截器,提高開發(fā)效率

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? 艷艷耶?? :個(gè)人主頁 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ???個(gè)人專欄 : 《推薦】Spring與Mybatis集成整合》 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ??生活的理想,不斷更

    2024年02月09日
    瀏覽(27)
  • 【SpringMVC】| 攔截器 | 跨域請(qǐng)求 | 原理詳解 | 代碼實(shí)操

    【SpringMVC】| 攔截器 | 跨域請(qǐng)求 | 原理詳解 | 代碼實(shí)操

    Spring MVC 是 Spring 框架的一部分,主要用于構(gòu)建 Web 應(yīng)用程序和 RESTful 服務(wù)。Spring MVC 攔截器是一種在請(qǐng)求到達(dá)控制器之前或響應(yīng)返回視圖之前對(duì)請(qǐng)求進(jìn)行處理的機(jī)制。它可以對(duì)請(qǐng)求進(jìn)行攔截和修改,比如在請(qǐng)求中添加一些頭信息、記錄請(qǐng)求日志、進(jìn)行身份驗(yàn)證等??缬蛘?qǐng)求則

    2024年02月03日
    瀏覽(21)
  • 掌握Spring MVC攔截器整合技巧,實(shí)現(xiàn)靈活的請(qǐng)求處理與權(quán)限控制!

    掌握Spring MVC攔截器整合技巧,實(shí)現(xiàn)靈活的請(qǐng)求處理與權(quán)限控制!

    (1)瀏覽器發(fā)送一個(gè)請(qǐng)求會(huì)先到Tomcat的web服務(wù)器。 (2)Tomcat服務(wù)器接收到請(qǐng)求以后,會(huì)去判斷請(qǐng)求的是靜態(tài)資源還是動(dòng)態(tài)資源。 (3)如果是靜態(tài)資源,會(huì)直接到Tomcat的項(xiàng)目部署目錄下去直接訪問。 (4)如果是動(dòng)態(tài)資源,就需要交給項(xiàng)目的后臺(tái)代碼進(jìn)行處理。 (5)在找到具體的方法之前

    2024年01月22日
    瀏覽(22)
  • Spring-MVC使用JSR303及攔截器,增強(qiáng)網(wǎng)絡(luò)隱私安全

    Spring-MVC使用JSR303及攔截器,增強(qiáng)網(wǎng)絡(luò)隱私安全

    目錄 一、JSR303 ( 1 )? 是什么 ( 2 )? 作用 ( 3 )??常用注解 ( 4 )? 入門使用 二、攔截器 2.1? 是什么 2.2? 攔截器與過濾器的區(qū)別 2.3? 應(yīng)用場(chǎng)景 2.4 基礎(chǔ)使用 2.5?用戶登錄權(quán)限控制 給我們帶來的收獲 JSR 303是Java規(guī)范請(qǐng)求(Java Specification Request)的一部分, 它定義了一套標(biāo)準(zhǔn)的Jav

    2024年02月09日
    瀏覽(31)
  • Spring MVC學(xué)習(xí)隨筆-Ajax集成(JSON格式返回?cái)?shù)據(jù))、攔截器(MyInterceptor)、全局異常處理(GlobalExceptionResolver)

    Spring MVC學(xué)習(xí)隨筆-Ajax集成(JSON格式返回?cái)?shù)據(jù))、攔截器(MyInterceptor)、全局異常處理(GlobalExceptionResolver)

    學(xué)習(xí)視頻:【編程不良人】繼spring之后快速入門springmvc,面對(duì)SpringMVC不用慌 引入相關(guān)依賴 開發(fā)控制器 日期格式修正 可以正常響應(yīng) 攔截器 :Interceptor 攔截 中斷 類似于javaweb中的Filter,不過沒有Filter那么強(qiáng)大 作用 Spring MVC的攔截器是一種用于在請(qǐng)求處理過程中進(jìn)行預(yù)處理和后處

    2024年02月05日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包