最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot?ErrorPageFilter的實(shí)際應(yīng)用詳解

 更新時(shí)間:2022年01月27日 14:50:56   作者:零零落落。  
這篇文章主要介紹了springboot?ErrorPageFilter的實(shí)際應(yīng)用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

ErrorPageFilter的實(shí)際應(yīng)用

Spring框架錯(cuò)誤頁(yè)過(guò)濾器

springboot提供了一個(gè)ErrorPageFilter,用來(lái)處理當(dāng)程序發(fā)生錯(cuò)誤時(shí)如何展現(xiàn)錯(cuò)誤,話不多說(shuō)請(qǐng)看代碼

private void doFilter(HttpServletRequest request, HttpServletResponse response,
? ? ? ? ? ? FilterChain chain) throws IOException, ServletException {
? ? ErrorWrapperResponse wrapped = new ErrorWrapperResponse(response);
? ? try {
? ? ? ? chain.doFilter(request, wrapped);
? ? ? ? if (wrapped.hasErrorToSend()) {
? ? ? ? ? ? // 重點(diǎn)關(guān)注此方法
? ? ? ? ? ? handleErrorStatus(request, response, wrapped.getStatus(),
? ? ? ? ? ? ? ? ? ? wrapped.getMessage());
? ? ? ? ? ? response.flushBuffer();
? ? ? ? }
? ? ? ? else if (!request.isAsyncStarted() && !response.isCommitted()) {
? ? ? ? ? ? response.flushBuffer();
? ? ? ? }
? ? }
? ? catch (Throwable ex) {
? ? ? ? Throwable exceptionToHandle = ex;
? ? ? ? if (ex instanceof NestedServletException) {
? ? ? ? ? ? exceptionToHandle = ((NestedServletException) ex).getRootCause();
? ? ? ? }
? ? ? ? handleException(request, response, wrapped, exceptionToHandle);
? ? ? ? response.flushBuffer();
? ? }
}
private void handleErrorStatus(HttpServletRequest request,
? ? ? ? ? ? HttpServletResponse response, int status, String message)
? ? ? ? ? ? ? ? ? ? throws ServletException, IOException {
? ? if (response.isCommitted()) {
? ? ? ? handleCommittedResponse(request, null);
? ? ? ? return;
? ? }
? ? // 獲取錯(cuò)誤頁(yè),來(lái)關(guān)注下這個(gè)屬性this.statuses,就是一個(gè)map,而錯(cuò)誤頁(yè)就是從這屬性中獲取,那此屬性的內(nèi)容是什么時(shí)候添加進(jìn)去的呢
? ? String errorPath = getErrorPath(this.statuses, status);
? ? if (errorPath == null) {
? ? ? ? response.sendError(status, message);
? ? ? ? return;
? ? }
? ? response.setStatus(status);
? ? setErrorAttributes(request, status, message);
? ? // 拿到錯(cuò)誤頁(yè)地址后,通過(guò)服務(wù)器重定向的方式跳轉(zhuǎn)到錯(cuò)誤頁(yè)面
? ? request.getRequestDispatcher(errorPath).forward(request, response);
}

ErrorPageFilter implements Filter, ErrorPageRegistry,此類(lèi)實(shí)現(xiàn)了ErrorPageRegistry接口,接口內(nèi)方法如下,我們可以看到這個(gè)入?yún)rrorPages便是錯(cuò)誤頁(yè)集合,然后把所有錯(cuò)誤頁(yè)put到statuses屬性?xún)?nèi),但是此方法入?yún)暮味鴣?lái)呢?

@Override
public void addErrorPages(ErrorPage... errorPages) {
? ? for (ErrorPage errorPage : errorPages) {
? ? ? ? if (errorPage.isGlobal()) {
? ? ? ? ? ? this.global = errorPage.getPath();
? ? ? ? }
? ? ? ? else if (errorPage.getStatus() != null) {
? ? ? ? ? ? this.statuses.put(errorPage.getStatus().value(), errorPage.getPath());
? ? ? ? }
? ? ? ? else {
? ? ? ? ? ? this.exceptions.put(errorPage.getException(), errorPage.getPath());
? ? ? ? }
? ? }
}

通過(guò)源碼分析,發(fā)現(xiàn)此接口,只要實(shí)現(xiàn)此接口并生成bean交給spring,便可以往ErrorPageRegistry添加你自己的錯(cuò)誤頁(yè)了。

public interface ErrorPageRegistrar {
? ? /**
? ? ?* Register pages as required with the given registry.
? ? ?* @param registry the error page registry
? ? ?*/
? ? void registerErrorPages(ErrorPageRegistry registry);
}

看個(gè)例子吧,這樣就可以了,是不是很簡(jiǎn)單。

@Component
public class MyErrorPage implements ErrorPageRegistrar {
? ? @Override
? ? public void registerErrorPages(ErrorPageRegistry registry) {
? ? ? ? ErrorPage error404Page = new ErrorPage(HttpStatus.NOT_FOUND, "/WEB-INF/errorpage/404.html");
? ? ? ? ErrorPage error405Page = new ErrorPage(HttpStatus.METHOD_NOT_ALLOWED, "/WEB-INF/errorpage/405.html");
? ? ? ? ErrorPage error500Page = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/WEB-INF/errorpage/500.html");
? ? ? ? registry.addErrorPages(error404Page, error405Page, error500Page);
? ? }
}

springboot項(xiàng)目出現(xiàn)ErrorPageFilter異常

今天用springboot(2.2.12.RELEASE)+beetl模板的時(shí)候,由于某個(gè)模板找不到,

系統(tǒng)一直出現(xiàn)報(bào)錯(cuò)日子

[http-nio-8080-exec-1] ERROR o.s.b.w.s.s.ErrorPageFilter - [handleCommittedResponse,219] - Cannot forward to error page for request [/yuantuannews/list/index_1.html] as the response has already been committed. As a result, the response may have the wrong status code. If your application is running on WebSphere Application Server you may be able to resolve this problem by setting com.ibm.ws.webcontainer.invokeFlushAfterService to false

看了網(wǎng)上的一些解決方法,大體上都是重寫(xiě)ErrorPageFilter,然后在FilterRegistrationBean中設(shè)置 filterRegistrationBean.setEnabled(false);

代碼如下

? ? @Bean
? ? public ErrorPageFilter errorPageFilter() {
? ? ? ? return new ErrorPageFilter();
? ? }
?
? ? @Bean
? ? public FilterRegistrationBean disableSpringBootErrorFilter(ErrorPageFilter filter) {
? ? ? ? FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
? ? ? ? filterRegistrationBean.setFilter(filter);
? ? ? ? filterRegistrationBean.setEnabled(false);
? ? ? ? return filterRegistrationBean;
? ? }

按照這個(gè)方法,我做了多次嘗試,系統(tǒng)直接報(bào)錯(cuò)說(shuō)errorPageFilter沖突了,原來(lái)是

ErrorPageFilterConfiguration.java中已經(jīng)定義了這么一個(gè)bean:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package org.springframework.boot.web.servlet.support;
import javax.servlet.DispatcherType;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration(
    proxyBeanMethods = false
)
class ErrorPageFilterConfiguration {
    ErrorPageFilterConfiguration() {
    }
    @Bean
    ErrorPageFilter errorPageFilter() {
        return new ErrorPageFilter();
    }
    @Bean
    FilterRegistrationBean<ErrorPageFilter> errorPageFilterRegistration(ErrorPageFilter filter) {
        FilterRegistrationBean<ErrorPageFilter> registration = new FilterRegistrationBean(filter, new ServletRegistrationBean[0]);
        registration.setOrder(filter.getOrder());
        registration.setDispatcherTypes(DispatcherType.REQUEST, new DispatcherType[]{DispatcherType.ASYNC});
        return registration;
    }
}

最后我的解決方式是在啟動(dòng)類(lèi)中設(shè)置:

@SpringBootApplication
public class App extends SpringBootServletInitializer {
public App() {
? ? super();
? ? //下面設(shè)置為false
? ? setRegisterErrorPageFilter(false);?
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
? ? return application.sources(App.class);
}
public static void main(String[] args) {
? ? SpringApplication.run(App.class, args);
}

問(wèn)題解決。 

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot配置文件中數(shù)據(jù)庫(kù)密碼加密兩種方案(推薦)

    SpringBoot配置文件中數(shù)據(jù)庫(kù)密碼加密兩種方案(推薦)

    SpringBoot項(xiàng)目經(jīng)常將連接數(shù)據(jù)庫(kù)的密碼明文放在配置文件里,安全性就比較低一些,尤其在一些企業(yè)對(duì)安全性要求很高,因此我們就考慮如何對(duì)密碼進(jìn)行加密,文中給大家介紹加密的兩種方式,感興趣的朋友一起看看吧
    2019-10-10
  • Java線程休眠之sleep方法詳解

    Java線程休眠之sleep方法詳解

    這篇文章主要介紹了Java線程休眠之sleep方法詳解,Thread?類(lèi)中有一個(gè)靜態(tài)方法的sleep方法,當(dāng)該線程調(diào)用sleep方法后,就會(huì)暫時(shí)讓CPU的調(diào)度權(quán),但是監(jiān)視器資源比如鎖并不會(huì)釋放出去,需要的朋友可以參考下
    2024-01-01
  • Mybatis分頁(yè)插件使用方法詳解

    Mybatis分頁(yè)插件使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了Mybatis分頁(yè)插件的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • 最常用的1000個(gè)Java類(lèi)(附代碼示例)

    最常用的1000個(gè)Java類(lèi)(附代碼示例)

    這篇文章主要介紹了最常用的1000個(gè)Java類(lèi)(附代碼示例),需要的朋友可以參考下
    2015-04-04
  • 詳解Spring boot上配置與使用mybatis plus

    詳解Spring boot上配置與使用mybatis plus

    這篇文章主要介紹了詳解Spring boot上配置與使用mybatis plus,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • Java設(shè)計(jì)模式之觀察者模式

    Java設(shè)計(jì)模式之觀察者模式

    這篇文章主要介紹了Java設(shè)計(jì)模式之觀察者模式,觀察者模式,是一種行為性模型,又叫發(fā)布-訂閱模式,他定義對(duì)象之間一種一對(duì)多的依賴(lài)關(guān)系,使得當(dāng)一個(gè)對(duì)象改變狀態(tài),則所有依賴(lài)于它的對(duì)象都會(huì)得到通知并自動(dòng)更新,需要的朋友可以參考下
    2023-11-11
  • springboot2.3 整合mybatis-plus 高級(jí)功能及用法詳解

    springboot2.3 整合mybatis-plus 高級(jí)功能及用法詳解

    這篇文章主要介紹了springboot2.3 整合mybatis-plus 高級(jí)功能,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Java Map 按照Value排序的實(shí)現(xiàn)方法

    Java Map 按照Value排序的實(shí)現(xiàn)方法

    Map是鍵值對(duì)的集合接口,它的實(shí)現(xiàn)類(lèi)主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等。這篇文章主要介紹了Java Map 按照Value排序的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2016-08-08
  • java實(shí)現(xiàn)cassandra高級(jí)操作之分頁(yè)實(shí)例(有項(xiàng)目具體需求)

    java實(shí)現(xiàn)cassandra高級(jí)操作之分頁(yè)實(shí)例(有項(xiàng)目具體需求)

    這篇文章主要介紹了java實(shí)現(xiàn)cassandra高級(jí)操作之分頁(yè)實(shí)例(有項(xiàng)目具體需求),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-04-04
  • 一文徹底弄懂零拷貝原理以及java實(shí)現(xiàn)

    一文徹底弄懂零拷貝原理以及java實(shí)現(xiàn)

    零拷貝(英語(yǔ): Zero-copy) 技術(shù)是指計(jì)算機(jī)執(zhí)行操作時(shí),CPU不需要先將數(shù)據(jù)從某處內(nèi)存復(fù)制到另一個(gè)特定區(qū)域,下面這篇文章主要給大家介紹了關(guān)于零拷貝原理以及java實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2021-08-08

最新評(píng)論

石景山区| 株洲县| 拉孜县| 青神县| 叶城县| 瑞昌市| 炎陵县| 宝丰县| 永吉县| 邢台市| 建水县| 改则县| 南江县| 淅川县| 漳平市| 竹溪县| 福安市| 辛集市| 忻城县| 南平市| 柘荣县| 武邑县| 鄄城县| 时尚| 巴中市| 霍林郭勒市| 麻阳| 武冈市| 洪洞县| 临沭县| 广西| 台山市| 家居| 来凤县| 泽普县| 仙居县| 贵州省| 离岛区| 云和县| 靖安县| 剑阁县|