springboot 自定義錯誤頁面
Spring Boot 默認(rèn)使用嵌入式 Tomcat,默認(rèn)沒有頁面來處理404等常見錯誤。因此,為了給用戶最佳的使用體驗,404等常見錯誤需要我們自定義頁面來處理。
在 springboot 2.0 之前用
org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer
類來實現(xiàn)該功能。
使用 Java7 內(nèi)部類的實現(xiàn):
@Bean
public?EmbeddedServletContainerCustomizer?containerCustomizer()?{
????return?new?EmbeddedServletContainerCustomizer()?{
????????@Override
????????public?void?customize(ConfigurableEmbeddedServletContainer?container)?{
????????????ErrorPage?error401Page?=?new?ErrorPage(HttpStatus.UNAUTHORIZED,?"/401.html");
????????????ErrorPage?error404Page?=?new?ErrorPage(HttpStatus.NOT_FOUND,?"/404.html");
????????????ErrorPage?error500Page?=?new?ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR,?"/500.html");
????????????container.addErrorPages(error401Page,?error404Page,?error500Page);
????????}
????};
}Java8 的 lambda 表達(dá)式寫法:
@Bean
public?EmbeddedServletContainerCustomizer?containerCustomizer()?{
???return?(container?->?{
????????ErrorPage?error401Page?=?new?ErrorPage(HttpStatus.UNAUTHORIZED,?"/401.html");
????????ErrorPage?error404Page?=?new?ErrorPage(HttpStatus.NOT_FOUND,?"/404.html");
????????ErrorPage?error500Page?=?new?ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR,?"/500.html");
????????container.addErrorPages(error401Page,?error404Page,?error500Page);
???});
}在代碼中創(chuàng)建了三個 ErrorPage 實例來處理三個通用的 HTTP 錯誤狀態(tài)碼,并將他們添加到 container 當(dāng)中。ErrorPage 類是一個封裝了錯誤信息的類,它可以在 Jetty 和 Tomcat 環(huán)境下使用。
錯誤頁面需要放在項目static內(nèi)容目錄下,它的默認(rèn)位置是:src/main/resources/static,如下圖所示:

在Spring Boot2.0以上配置嵌入式Servlet容器時EmbeddedServletContainerCustomizer類不存在,被WebServerFactoryCustomizer替代
使用WebServerFactoryCustomizer接口替換EmbeddedServletContainerCustomizer 組件完成對嵌入式Servlet容器的配置,示例代碼如下:
@Bean
public?WebServerFactoryCustomizer?webServerFactoryCustomizer() {
return?(container?->?{
???? ErrorPage?error401Page?=?new?ErrorPage(HttpStatus.UNAUTHORIZED,?"/error/401.html");
???? ErrorPage?error404Page?=?new?ErrorPage(HttpStatus.NOT_FOUND,?"/error/404.html");
???? ErrorPage?error500Page?=?new?ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR,?"/error/500.html");
???? container.addErrorPages(error401Page,?error404Page,?error500Page);
});
?}在 WebServerFactoryCustomizer 接口中使用 ConfigurableWebServerFactory 對象實現(xiàn)對 customize() 方法的轉(zhuǎn)換,從而實現(xiàn)對嵌入式 servlet 容器的配置。
附錄
springboot 1.x
import?org.apache.catalina.connector.Connector;
import?org.apache.coyote.ProtocolHandler;
import?org.apache.coyote.http11.Http11NioProtocol;
import?org.apache.tomcat.util.threads.ThreadPoolExecutor;
import?org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
import?org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
import?org.springframework.boot.context.embedded.tomcat.TomcatConnectorCustomizer;
import?org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
import?org.springframework.boot.web.servlet.ErrorPage;
import?org.springframework.context.annotation.Bean;
import?org.springframework.context.annotation.Configuration;
import?org.springframework.http.HttpStatus;
import?org.springframework.stereotype.Component;
@Component
public?class?EmbeddedTomcatConfig?implements?EmbeddedServletContainerCustomizer{
????@Override
????public?void?customize(ConfigurableEmbeddedServletContainer?container)?{
????????TomcatEmbeddedServletContainerFactory?factory?=?(TomcatEmbeddedServletContainerFactory)container;
????????factory.addConnectorCustomizers(new?TomcatConnectorCustomizer()?{
????????????@Override
????????????public?void?customize(Connector?connector)?{
????????????????Http11NioProtocol?protocol?=?(Http11NioProtocol)?connector.getProtocolHandler();
????????????????protocol.setMaxConnections(200);
????????????????protocol.setMaxThreads(200);
????????????????protocol.setSelectorTimeout(3000);
????????????????protocol.setSessionTimeout(3000);
????????????????protocol.setConnectionTimeout(3000);
????????????}
????????});
????}
}通過實現(xiàn)org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer的customize方法來實現(xiàn)自定義
springboot 2.x
import?org.apache.catalina.connector.Connector;
import?org.apache.coyote.ProtocolHandler;
import?org.apache.coyote.http11.Http11NioProtocol;
import?org.apache.tomcat.util.threads.ThreadPoolExecutor;
import?org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import?org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import?org.springframework.boot.web.server.WebServerFactoryCustomizer;
import?org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import?org.springframework.context.annotation.Bean;
import?org.springframework.context.annotation.Configuration;
import?org.springframework.core.Ordered;
import?org.springframework.stereotype.Component;
@Component
public?class?EmbeddedTomcatConfig?implements?WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>?{
????@Override
????public?void?customize(ConfigurableServletWebServerFactory?factory)?{
??????((TomcatServletWebServerFactory)factory).addConnectorCustomizers(new?TomcatConnectorCustomizer()?{
????????????@Override
????????????public?void?customize(Connector?connector)?{
????????????????Http11NioProtocol?protocol?=?(Http11NioProtocol)?connector.getProtocolHandler();
????????????????protocol.setMaxConnections(200);
????????????????protocol.setMaxThreads(200);
????????????????protocol.setSelectorTimeout(3000);
????????????????protocol.setSessionTimeout(3000);
????????????????protocol.setConnectionTimeout(3000);
????????????}
????????});
????}
}在2.x版本改為實現(xiàn)org.springframework.boot.web.server.WebServerFactoryCustomizer接口的customize方法
springboot1.x 相關(guān)類如下:
org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer
org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer
org.springframework.boot.context.embedded.tomcat.TomcatConnectorCustomizer
org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactoryspringboot2.x 相關(guān)類如下:
org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory
org.springframework.boot.web.server.WebServerFactoryCustomizer
org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer
org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory

喜歡,在看
