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

Spring Boot 系列4 -- 統(tǒng)一功能處理

這篇具有很好參考價(jià)值的文章主要介紹了Spring Boot 系列4 -- 統(tǒng)一功能處理。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

前言

1.?Spring AOP 用戶統(tǒng)?登錄驗(yàn)證的問題

1.1 自定義攔截器

1.2 配置攔截器并配置攔截的規(guī)則

1.3 攔截器的原理源碼分析

2. 統(tǒng)一異常處理

2.1 實(shí)現(xiàn)統(tǒng)一異常處理

2.2 測(cè)試統(tǒng)一異常處理

3. 統(tǒng)一的數(shù)據(jù)格式返回

3.1?統(tǒng)?數(shù)據(jù)返回格式的實(shí)現(xiàn)

3.2 測(cè)試統(tǒng)一的數(shù)據(jù)返回


Spring Boot 系列4 -- 統(tǒng)一功能處理,# SpringBoot,spring boot,java,后端

前言

? ? ? ? Spring AOP是一個(gè)面向切面編程的框架,可以同設(shè)置要做處理的類為切面,設(shè)置切點(diǎn)進(jìn)行設(shè)置攔截規(guī)則,然后定義通知,實(shí)現(xiàn)一定的攔截規(guī)則.但是我們?cè)腟pring AOP的框架使用起來比較繁瑣.為了解決如此之類的Spring AOP的問題.對(duì)于Spring AOP的實(shí)戰(zhàn),本文將介紹三種功能.

1. 統(tǒng)一用戶登錄權(quán)限驗(yàn)證

2. 統(tǒng)一數(shù)據(jù)返回格式

3. 統(tǒng)一異常處理

1.?Spring AOP 用戶統(tǒng)?登錄驗(yàn)證的問題

假設(shè)我們要實(shí)現(xiàn)這樣一個(gè)功能,在多個(gè)頁面進(jìn)行判斷用戶的登錄狀態(tài),然后發(fā)現(xiàn)當(dāng)前用戶的登錄狀態(tài)為空的時(shí)候進(jìn)行跳轉(zhuǎn)到登錄頁.

????????我們之前的做法是,在每個(gè)頁面的路由中進(jìn)行判斷用戶的登錄狀態(tài),顯然這些操作是重復(fù)的,后來我們又學(xué)習(xí)了Spring AOP,我們?cè)囅肟梢詫⑿枰M(jìn)行驗(yàn)證的類進(jìn)行設(shè)置為切面,在需要地方進(jìn)行配置攔截的規(guī)則,然后進(jìn)行設(shè)置前置通知.這個(gè)思想是可以的,但是我們實(shí)現(xiàn)起來會(huì)遇到兩個(gè)問題.

1.??沒辦法獲取到 HttpSession 對(duì)象(我們需要對(duì)Session進(jìn)行判斷當(dāng)前的用戶登錄狀態(tài))

2.??我們要對(duì)?部分方法進(jìn)行攔截,而另?部分方法不攔截,如注冊(cè)?法和登錄方法是不攔截的,這樣的話排除?法的規(guī)則很難定義,甚至沒辦法定義。

針對(duì)一以上的問題,Spring 框架為我們提供了一個(gè)具體實(shí)現(xiàn)的攔截器:HandlerInterceptor

而我們要使用這個(gè)攔截器實(shí)現(xiàn)自己的功能,可以具體分為兩步:

Spring Boot 系列4 -- 統(tǒng)一功能處理,# SpringBoot,spring boot,java,后端

?下面我們使用代碼進(jìn)行實(shí)現(xiàn)上述的功能:

1.1 自定義攔截器

Spring Boot 系列4 -- 統(tǒng)一功能處理,# SpringBoot,spring boot,java,后端

具體代碼:

public class LoginInterceptor implements HandlerInterceptor {
    /**
     * 此方法返回一個(gè)boolean類型的值,返回true表示驗(yàn)證成功,繼續(xù)執(zhí)行后續(xù)流程
     */
    //  重寫preHandle方法實(shí)現(xiàn)自己的業(yè)務(wù)代碼
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 用戶登錄登錄業(yè)務(wù)判斷
        HttpSession session = request.getSession(false);
        if (session != null && session.getAttribute("userinfo") != null){
            // 用戶已經(jīng)登錄
            return true;
        }
        // 沒有登錄,可以進(jìn)行跳轉(zhuǎn)到登錄頁面,或者返回一個(gè)401 或者403 沒有權(quán)限碼
        response.sendRedirect("/login1.html");
//        response.setStatus(403);
        // 上面兩者取一個(gè)即可
        return false;
    }

}

1.2 配置攔截器并配置攔截的規(guī)則

紅色部分就是將自定義的攔截器添加到項(xiàng)目中,然后綠色是一個(gè)擴(kuò)展,就是在路由前面加前綴.

Spring Boot 系列4 -- 統(tǒng)一功能處理,# SpringBoot,spring boot,java,后端

?具體代碼:

package com.example.demo.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * Created with IntelliJ IDEA.
 * Description:將自定義攔截器加入到WebMvcConfigurer中,重寫addInterceptors方法進(jìn)行設(shè)置攔截規(guī)則
 * User: YAO
 * Date: 2023-07-14
 * Time: 15:04
 */
@Configuration
public class AppConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor())
                .addPathPatterns("/**")  // 攔截規(guī)則設(shè)置,此處進(jìn)行攔截所有請(qǐng)求
                .excludePathPatterns("/user/login")
                .excludePathPatterns("/user/reg")
                .excludePathPatterns("/user/get-num")
                .excludePathPatterns("/user/get-string")
                .excludePathPatterns("/img/**")
                .excludePathPatterns("/**/*.html");
    }

    // 所有的接?添加 api 前綴
      // 給路由進(jìn)行添加前綴 ,設(shè)置為 true 表示啟動(dòng)前綴
//    @Override
//    public void configurePathMatch(PathMatchConfigurer configurer) {
//        configurer.addPathPrefix("api", c -> true);
//    }
}

我們對(duì)上述實(shí)現(xiàn)的攔截器進(jìn)行驗(yàn)證

Spring Boot 系列4 -- 統(tǒng)一功能處理,# SpringBoot,spring boot,java,后端

Spring Boot 系列4 -- 統(tǒng)一功能處理,# SpringBoot,spring boot,java,后端?當(dāng)進(jìn)行點(diǎn)擊的時(shí)候,因?yàn)闆]有Session所以直接跳轉(zhuǎn)到我們?cè)O(shè)置的登錄頁面了.

Spring Boot 系列4 -- 統(tǒng)一功能處理,# SpringBoot,spring boot,java,后端

可以看出沒有進(jìn)行設(shè)置過Cookie的,就是沒有Session連接.?

Spring Boot 系列4 -- 統(tǒng)一功能處理,# SpringBoot,spring boot,java,后端

1.3 攔截器的原理源碼分析

Spring Boot 系列4 -- 統(tǒng)一功能處理,# SpringBoot,spring boot,java,后端

Spring Boot 系列4 -- 統(tǒng)一功能處理,# SpringBoot,spring boot,java,后端

所有的方法都會(huì)執(zhí)行 DispatcherServlet 中的 doDispatch 調(diào)度方法,觀察源碼發(fā)現(xiàn):

Spring Boot 系列4 -- 統(tǒng)一功能處理,# SpringBoot,spring boot,java,后端??點(diǎn)擊這個(gè)applyPreHandle,applyPreHandle 中會(huì)獲取所有攔截器 HandlerInterceptor 并執(zhí)行攔截器中的 preHandle 方法,這與之前我們實(shí)現(xiàn)攔截器的步驟對(duì)應(yīng).

Spring Boot 系列4 -- 統(tǒng)一功能處理,# SpringBoot,spring boot,java,后端

2. 統(tǒng)一異常處理

????????統(tǒng)一異常處理是指?在應(yīng)用程序中定義一個(gè)公共的異常處理機(jī)制,用來處理所有的異常情況。?這樣可以避免在應(yīng)用程序中分散地處理異常,降低代碼的復(fù)雜度和重復(fù)度,提高代碼的可維護(hù)性和可擴(kuò)展性.\

????????統(tǒng)?異常處理使?的是 @ControllerAdvice + @ExceptionHandler 來實(shí)現(xiàn)的,@ControllerAdvice 表示控制器通知類,@ExceptionHandler 是異常處理器,兩個(gè)結(jié)合表示當(dāng)出現(xiàn)異常的時(shí)候執(zhí)行某個(gè)通知,也就是執(zhí)行某個(gè)方法事件.

2.1 實(shí)現(xiàn)統(tǒng)一異常處理

Spring Boot 系列4 -- 統(tǒng)一功能處理,# SpringBoot,spring boot,java,后端

2.2 測(cè)試統(tǒng)一異常處理

我們自己創(chuàng)建一個(gè)路由,其中內(nèi)容出現(xiàn)一個(gè)空指針異常,我們查看是否能進(jìn)行返回給前端處理.?

Spring Boot 系列4 -- 統(tǒng)一功能處理,# SpringBoot,spring boot,java,后端

Spring Boot 系列4 -- 統(tǒng)一功能處理,# SpringBoot,spring boot,java,后端

我們?cè)O(shè)置的異常處理起到作用了.那么如果不設(shè)置,異常的處理,會(huì)出現(xiàn)什么樣的現(xiàn)象?

就會(huì)直接將控制臺(tái)打印的異常返回給前端,前端拿到數(shù)據(jù)就很懵.所以統(tǒng)一的異常處理還是很有必要的.

3. 統(tǒng)一的數(shù)據(jù)格式返回

Spring Boot 系列4 -- 統(tǒng)一功能處理,# SpringBoot,spring boot,java,后端

3.1?統(tǒng)?數(shù)據(jù)返回格式的實(shí)現(xiàn)

下述是我們一般的統(tǒng)一返回的數(shù)據(jù)的格式

Spring Boot 系列4 -- 統(tǒng)一功能處理,# SpringBoot,spring boot,java,后端

實(shí)現(xiàn)統(tǒng)一的數(shù)據(jù)返回格式可以使用 @ControllerAdvice + ResponseBodyAdvice 的方式實(shí)現(xiàn),具體步驟如下:

  1. 創(chuàng)建一個(gè)類,并添加 @ControllerAdvice 注解;
  2. 實(shí)現(xiàn) ResponseBodyAdvice 接口,并重寫 supports 和 beforeBodyWrite 方法.

Spring Boot 系列4 -- 統(tǒng)一功能處理,# SpringBoot,spring boot,java,后端?上述部分就是記性統(tǒng)一的數(shù)據(jù)格式返回.

其中需要注意的是,當(dāng)返回的類型為String類型的時(shí)候,我們需要使用Jackson將String轉(zhuǎn)換成json再進(jìn)行返回.也就是綠色的部分.

package com.example.demo.config;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

import java.util.HashMap;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: YAO
 * Date: 2023-07-14
 * Time: 17:25
 */
@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {

    @Autowired
    private ObjectMapper objectMapper;
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
                                  Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        HashMap<String, Object> result = new HashMap<>();
        result.put("state",1);
        result.put("msg", "");
        result.put("data", body);
        if (body instanceof String){
            // 需要特殊進(jìn)行處理,因?yàn)镾tring比較特殊,既不是基礎(chǔ)類型也不是對(duì)象,進(jìn)行重寫的時(shí)候String用的格式化工具是自己獨(dú)有的
            // 在body返回之前沒有加載好.需要將String進(jìn)行單獨(dú)進(jìn)行處理.使用Jackson將String轉(zhuǎn)換成json再進(jìn)行返回.
            try {
                return objectMapper.writeValueAsString(result);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
        }
        return result;
    }
}

3.2 測(cè)試統(tǒng)一的數(shù)據(jù)返回

Spring Boot 系列4 -- 統(tǒng)一功能處理,# SpringBoot,spring boot,java,后端

Spring Boot 系列4 -- 統(tǒng)一功能處理,# SpringBoot,spring boot,java,后端

可以看出返回的格式是我們規(guī)定好的格式.這就變得更加統(tǒng)一.


?好啦本文就總結(jié)到這了,點(diǎn)個(gè)贊吧,謝謝!!!

Spring Boot 系列4 -- 統(tǒng)一功能處理,# SpringBoot,spring boot,java,后端文章來源地址http://www.zghlxwxcb.cn/news/detail-625619.html

到了這里,關(guān)于Spring Boot 系列4 -- 統(tǒng)一功能處理的文章就介紹完了。如果您還想了解更多內(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)文章

  • 【Spring Boot】攔截器與統(tǒng)一功能處理:統(tǒng)一登錄驗(yàn)證、統(tǒng)一異常處理與統(tǒng)一數(shù)據(jù)返回格式

    【Spring Boot】攔截器與統(tǒng)一功能處理:統(tǒng)一登錄驗(yàn)證、統(tǒng)一異常處理與統(tǒng)一數(shù)據(jù)返回格式

    ?Spring AOP是一個(gè)基于面向切面編程的框架,用于將橫切性關(guān)注點(diǎn)(如日志記錄、事務(wù)管理)與業(yè)務(wù)邏輯分離,通過代理對(duì)象將這些關(guān)注點(diǎn)織入到目標(biāo)對(duì)象的方法執(zhí)行前后、拋出異?;蚍祷亟Y(jié)果時(shí)等特定位置執(zhí)行,從而提高程序的可復(fù)用性、可維護(hù)性和靈活性。但使用原生Sp

    2024年02月16日
    瀏覽(25)
  • 【Spring Boot統(tǒng)一功能處理】統(tǒng)一異常處理,統(tǒng)一的返回格式,@ControllerAdvice簡(jiǎn)單分析,即將走進(jìn)SSM項(xiàng)目的大門! ! !

    【Spring Boot統(tǒng)一功能處理】統(tǒng)一異常處理,統(tǒng)一的返回格式,@ControllerAdvice簡(jiǎn)單分析,即將走進(jìn)SSM項(xiàng)目的大門! ! !

    前言: 大家好,我是 良辰丫 ,在上一篇文章中我們已經(jīng)學(xué)習(xí)了一些統(tǒng)一功能處理的相關(guān)知識(shí),今天我們繼續(xù)深入學(xué)習(xí)這些知識(shí),主要學(xué)習(xí)統(tǒng)一異常處理,統(tǒng)一的返回格式,@ControllerAdvice簡(jiǎn)單分析.?????? ??個(gè)人主頁:良辰針不戳 ??所屬專欄:javaEE進(jìn)階篇之框架學(xué)習(xí) ??勵(lì)志語句:生

    2024年02月16日
    瀏覽(36)
  • Spring Boot 統(tǒng)一功能處理(攔截器實(shí)現(xiàn)用戶登錄權(quán)限的統(tǒng)一校驗(yàn)、統(tǒng)一異常返回、統(tǒng)一數(shù)據(jù)格式返回)

    Spring Boot 統(tǒng)一功能處理(攔截器實(shí)現(xiàn)用戶登錄權(quán)限的統(tǒng)一校驗(yàn)、統(tǒng)一異常返回、統(tǒng)一數(shù)據(jù)格式返回)

    目錄 1. 用戶登錄權(quán)限校驗(yàn) 1.1 最初用戶登錄權(quán)限效驗(yàn) 1.2 Spring AOP 用戶統(tǒng)?登錄驗(yàn)證 1.3 Spring 攔截器 (1)創(chuàng)建自定義攔截器 (2)將自定義攔截器添加到系統(tǒng)配置中,并設(shè)置攔截的規(guī)則 1.4 練習(xí):登錄攔截器 (1)實(shí)現(xiàn) UserController 實(shí)體類 (2)返回的登錄頁面:login.html (3)實(shí)

    2024年02月12日
    瀏覽(59)
  • Spring Boot 優(yōu)雅實(shí)現(xiàn)統(tǒng)一數(shù)據(jù)返回格式+統(tǒng)一異常處理+統(tǒng)一日志處理

    Spring Boot 優(yōu)雅實(shí)現(xiàn)統(tǒng)一數(shù)據(jù)返回格式+統(tǒng)一異常處理+統(tǒng)一日志處理

    ????????在我們的項(xiàng)目開發(fā)中,我們都會(huì)對(duì)數(shù)據(jù)返回格式進(jìn)行統(tǒng)一的處理,這樣可以方便前端人員取數(shù)據(jù),當(dāng)然除了正常流程的數(shù)據(jù)返回格式需要統(tǒng)一以外,我們也需要對(duì)異常的情況進(jìn)行統(tǒng)一的處理,以及項(xiàng)目必備的日志。 ????????在項(xiàng)目開發(fā)中返回的是json格式的數(shù)據(jù)

    2024年01月19日
    瀏覽(31)
  • Spring Boot 統(tǒng)一數(shù)據(jù)返回格式 分析 和 處理

    Spring Boot 統(tǒng)一數(shù)據(jù)返回格式 分析 和 處理

    目錄 實(shí)現(xiàn)統(tǒng)一數(shù)據(jù)格式 ?測(cè)試? ?原因分析 ?解決方案 ???個(gè)人主頁:Dikz12 ??格言:吾愚多不敏,而愿加學(xué) 歡迎大家??點(diǎn)贊?評(píng)論?收藏 統(tǒng)?的數(shù)據(jù)返回格式使? @ControllerAdvice 和 ResponseBodyAdvice 的?式實(shí)現(xiàn); @ControllerAdvice : 表?控制器通知類. 比如:添加類 ResponseAdvic

    2024年04月08日
    瀏覽(22)
  • Spring Boot實(shí)現(xiàn)統(tǒng)一異常處理的技術(shù)解析

    Spring Boot實(shí)現(xiàn)統(tǒng)一異常處理的技術(shù)解析

    引言 在軟件開發(fā)過程中,異常處理是非常重要的一環(huán)。一個(gè)好的異常處理機(jī)制可以幫助我們更好地定位問題,提高代碼的可維護(hù)性和穩(wěn)定性。Spring Boot作為一款輕量級(jí)的Java開發(fā)框架,提供了一種簡(jiǎn)單而高效的方式來實(shí)現(xiàn)統(tǒng)一異常處理。本文將詳細(xì)介紹如何使用Spring Boot實(shí)現(xiàn)統(tǒng)

    2024年01月21日
    瀏覽(29)
  • 【Spring Boot 使用Filter統(tǒng)一處理請(qǐng)求數(shù)據(jù)轉(zhuǎn)換】

    Spring Boot Filter 使用場(chǎng)景 身份驗(yàn)證和授權(quán) 場(chǎng)景描述: 在用戶訪問應(yīng)用程序的敏感資源之前,需要驗(yàn)證用戶的身份并授權(quán)用戶訪問特定的內(nèi)容。 實(shí)現(xiàn)方式: 使用Filter攔截請(qǐng)求,檢查HTTP請(qǐng)求中的身份驗(yàn)證令牌(如JWT),并確定用戶是否具有執(zhí)行操作的權(quán)限。 日志記錄和審計(jì) 場(chǎng)景

    2024年02月21日
    瀏覽(37)
  • 【Spring】SpringBoot 統(tǒng)一功能處理

    【Spring】SpringBoot 統(tǒng)一功能處理

    在日常使用 Spring 框架進(jìn)行開發(fā)的時(shí)候,對(duì)于一些板塊來說,可能需要實(shí)現(xiàn)一個(gè)相同的功能,這個(gè)功能可以是驗(yàn)證你的登錄信息,也可以是其他的,但是由于各個(gè)板塊實(shí)現(xiàn)這個(gè)功能的代碼邏輯都是相同的,如果一個(gè)板塊一個(gè)板塊進(jìn)行添加的話,開發(fā)效率就會(huì)很低,所以 Spring

    2024年01月18日
    瀏覽(24)
  • 【Redis系列】Spring Boot 集成 Redis 實(shí)現(xiàn)緩存功能

    【Redis系列】Spring Boot 集成 Redis 實(shí)現(xiàn)緩存功能

    ??????歡迎來到我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內(nèi)容和知識(shí),也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續(xù)學(xué)習(xí),不斷總結(jié),共同進(jìn)步,活到老學(xué)到老 導(dǎo)航 檀越劍指大廠系列:全面總

    2024年04月10日
    瀏覽(96)
  • 【SpringBoot系列】Spring Boot 3核心技術(shù)與最佳實(shí)踐

    【SpringBoot系列】Spring Boot 3核心技術(shù)與最佳實(shí)踐

    強(qiáng)烈推薦 前些天發(fā)現(xiàn)了一個(gè)巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家。點(diǎn)擊跳轉(zhuǎn)到網(wǎng)站: 人工智能 引言 Spring Boot 3 是對(duì) Spring Boot 框架的一個(gè)重要更新版本,它延續(xù)了 Spring Boot 簡(jiǎn)化 Spring 應(yīng)用程序開發(fā)的宗旨,進(jìn)一步提升了開發(fā)者體驗(yàn)和應(yīng)用程

    2024年03月09日
    瀏覽(29)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包