Heim > Java > javaLernprogramm > Hauptteil

So implementieren Sie die einheitliche Verarbeitungsfunktion von SpringBoot

WBOY
Freigeben: 2023-05-11 16:04:06
nach vorne
1306 Leute haben es durchsucht

Bei der Verarbeitung von Netzwerkanforderungen müssen einige Funktionen einheitlich extrahiert und verarbeitet werden, getrennt vom Geschäft.

Anmeldeüberprüfung

Sie können den Interceptor Interceptor von Spring MVC verwenden, um die HandlerInterceptor-Schnittstelle zu implementieren. Nach der Implementierung dieser Schnittstelle wird die Anfrage abgefangen, bevor sie an den Controller gesendet wird.

Die Implementierung des Interceptors ist in die folgenden zwei Schritte unterteilt:

  • Erstellen Sie einen benutzerdefinierten Interceptor und implementieren Sie die preHandle-Methode (Vorverarbeitung vor Ausführung der spezifischen Methode) der HandlerInterceptor-Schnittstelle.

  • Fügen Sie benutzerdefinierte Interceptoren zur addInterceptors-Methode von WebMvcConfigurer hinzu.

Wir verwenden die Sitzung als Beispiel für die Anmeldeüberprüfung. Die Implementierung lautet wie folgt:

package com.demo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
 * 登录拦截器
 */
@Component
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {
    /**
     * 为 false 则不能继续往下执行;为 true 则可以。
     */ 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 判断session的信息是否合法
        HttpSession session = request.getSession(false);
        if (session != null && session.getAttribute("userinfo") != null) {
            return true;
        }
        log.error("当前用户没有访问权限");
        response.setStatus(401);
        return false;
    }
}
Nach dem Login kopieren

Registrieren Sie den geschriebenen ⾃Definitions-Interceptor über WebMvcConfigurer, um den Interceptor wirksam zu machen

Wenn kein Objekt injiziert wird, können die Parameter von addInterceptor() auch direkt ein neues Objekt erstellen:

package com.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class MyConfig implements WebMvcConfigurer {
    @Autowired
    private LoginInterceptor loginInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/**") // 拦截所有请求
                .excludePathPatterns("/user/login"); // 排除不拦截的 url
    }
}
Nach dem Login kopieren

Prinzip

Alle Controller-Ausführungen werden über den Spring MVC-Scheduler DispatcherServlet implementiert, und alle Methoden führen die doDispatch-Planung aus DispatcherServlet-Methode, der doDispatch-Quellcode lautet wie folgt:

@Configuration // 一定不要忘记
public class MyConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor())
                .addPathPatterns("/**") // 拦截所有请求
                .excludePathPatterns("/user/login"); // 排除不拦截的 url
    }
}
Nach dem Login kopieren

Aus dem obigen Quellcode können wir ersehen, dass vor Beginn der Ausführung des Controllers zuerst die Vorverarbeitungsmethode applyPreHandle aufgerufen wird. Der Implementierungsquellcode der applyPreHandle-Methode lautet wie folgt folgt:

protected void doDispatch(HttpServletRequest request, HttpServletResponse
        response) throws Exception {
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    try {
        try {
            ModelAndView mv = null;
            Object dispatchException = null;
            try {
                // ...  忽略不重要的代码
                // 调⽤预处理
                if (!mappedHandler.applyPreHandle(processedRequest, respon
                        se)) {
                    return;
                }
                // 执⾏ Controller 中的业务
                mv = ha.handle(processedRequest, response, mappedHandler.g
                        etHandler());
               // ...  忽略不重要的代码
            } catch (Exception var20) {
                dispatchException = var20;
            } catch (Throwable var21) {
                dispatchException = new NestedServletException("Handler di
                        spatch failed", var21);
            }
            this.processDispatchResult(processedRequest, response, mappedH
                    andler, mv, (Exception)dispatchException);
        } catch (Exception var22) {
            this.triggerAfterCompletion(processedRequest, response, mapped
                    Handler, var22);
        } catch (Throwable var23) {
            this.triggerAfterCompletion(processedRequest, response, mapped
                    Handler, new NestedServletException("Handler processing failed", var23));
        }
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processe
                        dRequest, response);
            }
        } else if (multipartRequestParsed) {
            this.cleanupMultipart(processedRequest);
        }
    }
}
Nach dem Login kopieren

Ausnahmebehandlung

Request Die zeitbasierte Ausnahmebehandlung ist ebenfalls ein häufiges Objekt der einheitlichen Verarbeitung.

Die einheitliche Ausnahmebehandlung wird mithilfe von @ControllerAdvice + @ExceptionHandler implementiert. @ControllerAdvice stellt die Controller-Benachrichtigungsklasse dar, und @ExceptionHandler ist der Ausnahmehandler. Die Kombination der beiden bedeutet, dass eine bestimmte Benachrichtigung ausgeführt wird, wenn eine Ausnahme auftritt Um ein bestimmtes Methodenereignis auszuführen, lautet der spezifische Implementierungscode wie folgt:

rrree

Wenn zu diesem Zeitpunkt eine Ausnahme auftritt, wird der Code weiterhin ausgeführt, aber die benutzerdefinierten Ausnahmeinformationen werden an die Vorderseite zurückgegeben Ende!

Prinzip

@ControllerAdvice ist der AOP von Spring, der alle Attribute des Controllers ausschneidet, einschließlich der Einstiegspunkte und der Facettenlogik, die eingebunden werden muss. Er arbeitet mit @ExceptionHandler zusammen, um bestimmte Arten von Ausnahmen zu erfassen, die im Controller ausgelöst werden Um verschiedene Arten von Ausnahmebehandlungszwecken zu erreichen.

Rückgabedatenstruktur

Die einheitliche Rückgabedatenstruktur kann mithilfe der @ControllerAdvice + ResponseBodyAdvice-Schnittstelle implementiert werden. Der spezifische Implementierungscode lautet wie folgt:

boolean applyPreHandle(HttpServletRequest request, HttpServletResponse response) throws Exception {
    for(int i = 0; i < this.interceptorList.size(); this.interceptorIndex
            = i++) {
        // 获取项⽬中使⽤的拦截器 HandlerInterceptor
        HandlerInterceptor interceptor = (HandlerInterceptor)this.intercep
        torList.get(i);
        if (!interceptor.preHandle(request, response, this.handler)) {
            this.triggerAfterCompletion(request, response, (Exception)null
            );
            return false;
        }
    }
    return true;
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonSo implementieren Sie die einheitliche Verarbeitungsfunktion von SpringBoot. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:yisu.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage