我的编程空间,编程开发者的网络收藏夹
学习永远不晚

springboot ErrorPageFilter怎么应用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

springboot ErrorPageFilter怎么应用

本篇内容主要讲解“springboot ErrorPageFilter怎么应用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“springboot ErrorPageFilter怎么应用”吧!

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属性内,但是此方法入参从何而来呢?

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

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

@Componentpublic 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;    }}

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

@SpringBootApplicationpublic class App extends SpringBootServletInitializer {public App() {    super();    //下面设置为false    setRegisterErrorPageFilter(false); }@Overrideprotected SpringApplicationBuilder configure(SpringApplicationBuilder application) {    return application.sources(App.class);}public static void main(String[] args) {    SpringApplication.run(App.class, args);}

到此,相信大家对“springboot ErrorPageFilter怎么应用”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

springboot ErrorPageFilter怎么应用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

springboot ErrorPageFilter怎么应用

本篇内容主要讲解“springboot ErrorPageFilter怎么应用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“springboot ErrorPageFilter怎么应用”吧!Er
2023-06-29

基于SpringBoot怎么应用ApplicationEvent

这篇文章主要介绍“基于SpringBoot怎么应用ApplicationEvent”,在日常操作中,相信很多人在基于SpringBoot怎么应用ApplicationEvent问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希
2023-07-05

SpringBoot怎么集成EasyExcel应用

这篇文章主要讲解了“SpringBoot怎么集成EasyExcel应用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot怎么集成EasyExcel应用”吧!1、介绍特点:1、
2023-06-08

springboot怎么设置响应头

在Spring Boot中,可以通过使用`@RestController`注解标注一个类,并且使用`@RequestMapping`注解指定该类中的方法的请求路径,然后使用`@RequestMapping`注解指定具体方法的请求路径,再使用
2023-10-25

springboot响应慢怎么解决

如果Spring Boot的响应时间较慢,可以尝试以下方法来解决:1. 检查数据库连接:确保数据库连接正确并且没有问题。可以通过检查数据库连接池的配置和数据库的性能来确定。2. 优化数据库查询:检查数据库查询语句是否需要优化,可以通过添加索
2023-09-17

SpringBoot应用的启动入口怎么封装

这篇文章主要介绍了SpringBoot应用的启动入口怎么封装的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot应用的启动入口怎么封装文章都会有所收获,下面我们一起来看看吧。Springboot可
2023-06-30

SpringBoot怎么简化Web应用程序的开发

Spring Boot 是一个开箱即用的微服务框架,它简化了 Spring 应用程序的开发过程。以下是 Spring Boot 简化 Web 应用程序开发的几种方法:自动配置:Spring Boot 提供了许多自动配置功能,可以根据项目的需
SpringBoot怎么简化Web应用程序的开发
2024-04-09

SpringBoot应用的打包和发布怎么实现

本篇内容介绍了“SpringBoot应用的打包和发布怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. 创建项目(example-f
2023-07-05

SpringBoot怎么封装统一响应体

这篇文章主要介绍了SpringBoot怎么封装统一响应体,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、前言关于统一响应体的封装,没有一个标准答案,我在各种技术社区看了一遍
2023-06-15

springboot接口响应慢怎么解决

如果Spring Boot接口响应慢,可以考虑以下几个解决方案:1. 检查数据库连接:确保数据库连接正常,并且数据库的性能良好。可以检查数据库连接池配置是否合理,以及数据库的索引是否设置正确。2. 优化查询语句:如果接口需要进行数据库查询操
2023-10-20

怎么创建一个简单的SpringBoot应用程序

要创建一个简单的Spring Boot 应用程序,可以按照以下步骤操作:使用 Spring Initializr 创建一个新的 Spring Boot 项目。可以访问 https://start.spring.io/ 并填写项目的基本信息,
怎么创建一个简单的SpringBoot应用程序
2024-04-09

SpringBoot Admin怎么用

这篇文章给大家分享的是有关SpringBoot Admin怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。介绍Spring Boot Admin是一个Github上的一个开源项目,它在Spring Boot
2023-06-25

springboot响应过长问题怎么解决

在Spring Boot中,当响应的数据量过大时,可能会导致响应时间过长或者内存溢出的问题。以下是一些解决方案:分页查询:将响应数据进行分页,每次只返回部分数据。可以使用Spring Data JPA中的分页查询功能,或者手动实现分页查询逻
2023-10-26

怎么构建springboot web应用镜像并使用容器部署

这篇文章主要介绍“怎么构建springboot web应用镜像并使用容器部署”,在日常操作中,相信很多人在怎么构建springboot web应用镜像并使用容器部署问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答
2023-07-05

springboot中bootcdn怎么用

这篇文章给大家分享的是有关springboot中bootcdn怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。应用:直接使用bootcdn提供的静态资源,不需要本地存储常用静态资源# layui.jshttp
2023-06-20

SpringBoot中Dozer怎么用

这篇文章主要为大家展示了“SpringBoot中Dozer怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SpringBoot中Dozer怎么用”这篇文章吧。什么是Dozer?Dozer是一
2023-06-29

SpringBoot的EnvironmentPostProcessor怎么用

今天小编给大家分享一下SpringBoot的EnvironmentPostProcessor怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我
2023-06-30

springboot beatlsql怎么使用

这篇文章主要介绍“springboot beatlsql怎么使用”,在日常操作中,相信很多人在springboot beatlsql怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”springboot
2023-06-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录