首頁 > 軟體

SpringBoot 錯誤頁面跳轉方式

2022-02-17 16:01:10

SpringBoot錯誤頁面跳轉

SpringBoot實現MVC 404、500等錯誤時跳轉自定義頁面

一、新增設定類

package com.study.demo.config;
import org.springframework.boot.web.server.ErrorPage;
import org.springframework.boot.web.server.ErrorPageRegistrar;
import org.springframework.boot.web.server.ErrorPageRegistry;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
/**
 * 錯誤頁面的設定
 */
@Component
public class ErrorPageConfig implements ErrorPageRegistrar {
    @Override
    public void registerErrorPages(ErrorPageRegistry registry) {
        ErrorPage error400Page = new ErrorPage(HttpStatus.BAD_REQUEST, "/errorPageController/error_400");
        ErrorPage error401Page = new ErrorPage(HttpStatus.UNAUTHORIZED, "/errorPageController/error_401");
        ErrorPage error404Page = new ErrorPage(HttpStatus.NOT_FOUND, "/errorPageController/error_404");
        ErrorPage error500Page = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/errorPageController/error_500");
        registry.addErrorPages(error400Page,error401Page,error404Page,error500Page);
    }
}

二、錯誤頁面跳轉控制器

package com.study.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/errorPageController")
public class ErrorPageController {
    @RequestMapping("/error_{errorCode}")
    public String error(@PathVariable int errorCode){
        String responseMsg;
        switch (errorCode) {
            case 400: responseMsg = "/400.html"; break;
            case 401: responseMsg = "/401.html"; break;
            case 404: responseMsg = "/404.html"; break;
            case 500: responseMsg = "/500.html"; break;
            default: responseMsg = "/404.html"; break;
        }
        return responseMsg;
    }
}

SpringBoot自定義錯誤頁面

一、錯誤頁面

請求出現錯誤時,跳轉到自定義的頁面中,比如404,假如沒對錯誤進行處理,那麼系統預設的頁面與專案的頁面會有很大的不搭。

解決:在預設的靜態路徑下,新建error檔案,裡面放入錯誤頁面,頁面命名為錯誤狀態碼,如:404.html,也可以命名為4xx.html,但如果兩個檔案同時存在,那麼會優先展示404.html

注:靜態路徑為

private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{
"classpath:/META-INF/resources/",
 "classpath:/resources/", 
 "classpath:/static/", 
 "classpath:/public/"
 };
 // 注:還有一個預設的根路徑    "/"

二、處理過程

出現4xx或5xx錯誤時,ErrorPageCustomizer生效,就會來到/error請求,就會被BasicErrorController處理。

//在DefaultErrorViewResolver中有一段程式碼
// 處理4xx和5xx的請求
static {
    Map<Series, String> views = new EnumMap(Series.class);
    views.put(Series.CLIENT_ERROR, "4xx");
    views.put(Series.SERVER_ERROR, "5xx");
    SERIES_VIEWS = Collections.unmodifiableMap(views);
}
// 解析,並會跳轉到error/錯誤狀態碼; 頁面中
private ModelAndView resolve(String viewName, Map<String, Object> model) {
    String errorViewName = "error/" + viewName;
    TemplateAvailabilityProvider provider = this.templateAvailabilityProviders.getProvider(errorViewName, this.applicationContext);
    // 對是否有模板引擎做出相應的檢視處理
    return provider != null ? new ModelAndView(errorViewName, model) : this.resolveResource(errorViewName, model);
}

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com