返回顶部
首页 > 资讯 > 后端开发 > Python >springboot ErrorPageFilter的实际应用详解
  • 319
分享到

springboot ErrorPageFilter的实际应用详解

2024-04-02 19:04:59 319人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录ErrorPageFilter的实际应用spring框架错误页过滤器SpringBoot项目出现ErrorPageFilter异常系统一直出现报错日子代码如下ErrorPageF

ErrorPageFilter的实际应用

Spring框架错误页过滤器

springboot提供了一个ErrorPageFilter,用来处理当程序发生错误时如何展现错误,话不多说请看代码

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()) {
            // 重点关注此方法
            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;
    }
    // 获取错误页,来关注下这个属性this.statuses,就是一个map,而错误页就是从这属性中获取,那此属性的内容是什么时候添加进去的呢
    String errorPath = getErrorPath(this.statuses, status);
    if (errorPath == null) {
        response.sendError(status, message);
        return;
    }
    response.setStatus(status);
    setErrorAttributes(request, status, message);
    // 拿到错误页地址后,通过服务器重定向的方式跳转到错误页面
    request.getRequestDispatcher(errorPath).forward(request, response);
}

ErrorPageFilter implements Filter, ErrorPageReGIStry,此类实现了ErrorPageRegistry接口,接口内方法如下,我们可以看到这个入参errorPages便是错误页集合,然后把所有错误页put到statuses属性内,但是此方法入参从何而来呢?

@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());
        }
    }
}

通过源码分析,发现此接口,只要实现此接口并生成bean交给spring,便可以往ErrorPageRegistry添加你自己的错误页了。

public interface ErrorPageRegistrar {
    
    void registerErrorPages(ErrorPageRegistry registry);
}

看个例子吧,这样就可以了,是不是很简单。

@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项目出现ErrorPageFilter异常

今天用springboot(2.2.12.RELEASE)+beetl模板的时候,由于某个模板找不到,

系统一直出现报错日子

[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

看了网上的一些解决方法,大体上都是重写ErrorPageFilter,然后在FilterRegistrationBean中设置 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;
    }

按照这个方法,我做了多次尝试,系统直接报错说errorPageFilter冲突了,原来是

ErrorPageFilterConfiguration.java中已经定义了这么一个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;
    }
}

最后我的解决方式是在启动类中设置:

@SpringBootApplication
public class App extends SpringBootServletInitializer {
public App() {
    super();
    //下面设置为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);
}

问题解决。 

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: springboot ErrorPageFilter的实际应用详解

本文链接: https://lsjlt.com/news/164018.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • springboot ErrorPageFilter的实际应用详解
    目录ErrorPageFilter的实际应用Spring框架错误页过滤器springboot项目出现ErrorPageFilter异常系统一直出现报错日子代码如下ErrorPageF...
    99+
    2024-04-02
  • springboot ErrorPageFilter怎么应用
    本篇内容主要讲解“springboot ErrorPageFilter怎么应用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“springboot ErrorPageFilte...
    99+
    2023-06-29
  • centos7 esxi6.7模板实际应用详解
    一、创建centos7.6系统并优化系统 1.关闭NetworkManager systemctl disable NetworkManager systemctl stop NetworkManager 2...
    99+
    2022-06-04
    centos7 esxi6.7模板 centos esxi模板应用
  • C++abs函数实际应用详解
    目录abs函数是用来干什么的abs使用的头文件abs函数用法abs函数使用说明实战带入知识点实战导入算法分析 代码实现总结abs函数是用来干什么的 abs函数主要的作用是用...
    99+
    2022-11-13
    C++ abs函数 C++ abs函数用法
  • 一文详解Qt中线程的实际应用
    目录1、多线程操作UI界面的示例2、避免多次connect3、优雅地结束线程的两种方法为了让程序尽快响应用户操作,在开发应用程序时经常会使用到线程。对于耗时操作如果不使用线程,UI界...
    99+
    2023-03-10
    Qt线程应用 Qt线程
  • C#中逆变的实际应用场景详解
    目录前言协变的应用场景逆变的应用场景讨论总结前言 早期在学习泛型的协变与逆变时,网上的文章讲解、例子算是能看懂,但关于逆变的具体应用场景这方面的知识,我并没有深刻的认识。本文将在具体...
    99+
    2024-04-02
  • Android五大布局与实际应用详解
    Android总体有五大布局: 线性布局(LiearLayout): 屏幕垂直或水平方向布局。 帧布局(FrameLayout):控件从屏幕左上角开始布局。 相对布...
    99+
    2022-06-06
    布局 Android
  • JavaScript中正则表达式的实际应用详解
    实际工作中,JavaScript正则表达式还是经常用到的。所以这部分的知识是非常重要的。 一、基础语法: 第一种:字面量语法 var expression=/pattern/f...
    99+
    2024-04-02
  • SpringBoot实现前后端分离国际化的示例详解
    目录前言1、设置国际化属性文件2、创建解析器和拦截器3、启动配置文件设置4、控制器示例5、小结前言 Springboot国际化可以帮助使用者在不同语言环境中构建应用程序,这样应用程序...
    99+
    2023-02-22
    SpringBoot实现国际化 SpringBoot国际化
  • redis限流的实际应用
    为什么要做限流 首先让我们先看一看系统架构设计中,为什么要做“限流”。 旅游景点通常都会有最大的接待量,不可能无限制的放游客进入,比如故宫每天只卖八万张票,超过八万的游客,无法买票...
    99+
    2024-04-02
  • Java泛型的实际应用
    本篇内容介绍了“Java泛型的实际应用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java有很多的高级特...
    99+
    2024-04-02
  • SpringBoot详解自定义Stater的应用
    目录1、SpringBoot starter机制2、为什么要自定义starter3、自定义starter的命名规则4、使用自定义starter1、SpringBoot starter...
    99+
    2024-04-02
  • Redis的安装和实际应用
    本篇内容介绍了“Redis的安装和实际应用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、Redis的安装下载安装包,redis-3.2....
    99+
    2023-06-03
  • gawk gsub函数的实际应用
    本篇内容主要讲解“gawk gsub函数的实际应用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“gawk gsub函数的实际应用”吧!在做一个数据清洗需求的时候,需要查询两张表里几个字段相同的重...
    99+
    2023-06-06
  • c语言指针用法及实际应用详解,通俗易懂超详细
    C语言的指针是一种非常重要的概念,它可以实现很多高级的编程技巧。本文将详细介绍C语言指针的用法及实际应用,并尽可能用通俗易懂的语言进...
    99+
    2023-09-09
    C语言
  • C++ 函数库详解:系统功能外延的实际应用案例
    c++++ 函数库通过预定义函数集合扩展了程序功能,提供了系统功能支持,包括容器、算法、流和诊断。开发人员可创建自定义函数,例如自定义排序函数,以实现特定需求,如按成绩降序排序。该函数库...
    99+
    2024-04-30
    c++ 函数库 标准库
  • Springboot应用gradle Plugin示例详解
    目录Springboot应用gradle Plugin详解新版本老版本Springboot应用gradle Plugin详解 Spring Boot的Gradle插件提供了Sprin...
    99+
    2023-05-18
    Springboot应用gradle Plugin Springboot gradle Plugin
  • SpringBoot响应处理实现流程详解
    目录1、相关依赖2、ReturnValueHandlers—返回值处理器3、HttpMessageConvert—消息转换器4、开启浏览器参数方式内容协商功能...
    99+
    2024-04-02
  • Vue中状态管理器(vuex)详解以及实际应用场景
    目录Vue中 常见的组件通信方式可分为三类Vuex简介1. State2. Getters3. Mutations4. Actions5. 使用 mapState、mapGetter...
    99+
    2022-11-16
    vuex 状态管理 vue 状态管理 vue状态管理器vuex
  • 深入解析Golang函数方法的实际应用
    Golang语言作为一种现代化、高效的编程语言,具有简洁、高效、并发等特点,被越来越多的开发人员广泛应用于各种领域。其中,函数方法是Golang中非常重要的一个特性,它可以帮助程序员有...
    99+
    2024-03-12
    golang函数 深入解析 方法应用
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作