【最简单】springboot自定义配置404错误页面

作者: ʘᴗʘ发布时间:2021-11-05 16:55 浏览量:952 点赞:791 售价:0

简介

springboot的大部分错误,都可以抛出异常,然后全局用@ControllerAdvice注解的类捕获,然后自定义错误页面。但是404页面通常是不抛异常的,如果要自定义404错误页面,通常只有两种方法:

  1. 通过spring.mvc.throw-exception-if-no-handler-found=truespring.web.resources.add-mappings=false配置,让springboot遇到404的时候,抛出异常,这样就可以全局捕获了。优点是方便,代码简单。缺点就是一旦你启用了spring.web.resources.add-mappings=false,你resources/static/等目录下的静态文件就访问不了了。所以这个方法适合只做API接口的springboot项目。
  2. 自己实现/error。优点是自由度高,缺点是略微入侵了一点springboot,部分代码理解起来比较累。

下面演示这两种方法的代码:

方法一

  1. spring.mvc.throw-exception-if-no-handler-found=truespring.web.resources.add-mappings=false加到你的application.properties配置文件中。
  2. 全局捕获404异常,然后根据请求类型是HTML还是JSON来返回不同的错误页面。代码如下:
@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(NoHandlerFoundException.class)
    public String noFindErr(HttpServletRequest request, HttpServletResponse response, Exception exception, Model model) {
        if(model==null){
            //api请求,返回JSON等错误信息
            String res = "json错误信息";
            try {
                response.setHeader("Content-Type", "application/json;charset=UTF-8");
                OutputStream outputStream = response.getOutputStream();
                outputStream.write(res.getBytes());
                outputStream.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }else{
            //模板引擎页面,返回一个404网页
            model.addAttribute("errorMsg","页面不存在");
            return "404";
        }
    }

}

方法二

继承springboot的ErrorController,然后覆盖原有/error页面的逻辑。代码如下:

@Controller
@RequestMapping({"${server.error.path:${error.path:/error}}"})
public class ErrorPageController implements ErrorController {


    @RequestMapping(
            produces = {"text/html"}
    )
    public String errorHtmlPage(HttpServletRequest request, HttpServletResponse response, Model model) {

        Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
  
        if (statusCode == 404) {
            //请求类型是HTML,返回thymeleaf 404页面模板
            return "404";
        }

        //其他错误,返回自定义的其他错误模板
        return "error";
    }

    @RequestMapping
    @ResponseBody
    public void errorJsonPage(HttpServletRequest request, HttpServletResponse response, Model model) {

        if (response.getStatus() == 404) {
            //是404错误,返回404 JSON
            return "this is 404 err json"
        } else {
            //其他错误,返回自定义的JSON
            return "this is other err json"
        }
    }
}

上面的代码中,第一个method是处理HTML请求(需要返回一个HTML网页)的,第二个method是处理HTML之外的请求的,最常见的就是各种JSON API(返回结果是一个JSON字符串)。

总结

如果你的springboot项目使用了类似thymeleaf之类的模板引擎,并且有返回HTML网页的场景,那么强烈推荐使用第二种办法。如果你的springboot项目只是单纯的作为API Server来使用,那么方法一扩展性更好。

版权声明:《【最简单】springboot自定义配置404错误页面》为CoderBBB作者「ʘᴗʘ」的原创文章,转载请附上原文出处链接及本声明。

原文链接:https://www.coderbbb.com/articles/35

其它推荐:

  • 浏览器Web、小程序前端等直接上传图片文件到阿里云OSS(springboot版完整代码)

    本文详细介绍了如何通过HTML网页,直接上传图片等文件到阿里云OSS,不需要业务服务器中转文件,速度更快,更节省服务器带宽和流量。类似微信小程序、Vue、Element-UI等常见前端都可以使用本文介绍的WEB直传阿里云OSS技术快速完成文件上传。服务端代码使用Springboot演示。

  • Vditor粘贴、上传图片到阿里云OSS(WEB直传方式)

    当我们在Vditor中粘贴站外图片或直接上传本地图片的时候,我们希望图片直接上传到阿里云OSS上,不经过我们的业务服务器转发,这样可以有效降低业务服务器的带宽占用,同时还能提高图片的上传速度。本文介绍了如何配置Vditor,让其可以完美直传图片到阿里云OSS中。

  • Netty使用阿里云SSL证书配置SSL

    本文介绍了如何使用阿里云购买的SSL证书来配置Netty,使Netty支持SSL加密的TCP连接。由于直接从阿里云下载的证书文件无法使用,还需要通过OpenSSL做一些格式转换。转换好的pem和key文件,加载到netty的handler中即可完成netty的ssl升级

  • HTML中javascript的<script>标签使用方法详解

    详细介绍了HTML网页中引入JavaScript的<script></script>标签的用法,逐一解释了其中async、charset、defer、language、src、type等属性的意义和用法。

  • Intellij IDE代码行数统计插件Statistic推荐

    本文介绍了一种能够快速统计IntelliJ项目代码行数的插件:Statistic,通过该插件可以快速查看各个项目、目录的代码行数,还能具体查看项目中不同代码语言的具体行数,十分方便。

  • 【最简单】java string字符串数组排序(正逆序)、去重

    本文介绍了java String Array数组如何正序排序、逆序排序、去重的方法,使用java stream完成以上功能,代码简洁高效。

  • Google无法访问CDN资源导致google search console移动设备易用性错误

    google search console提示移动设备易用性错误,排查发现是因为google无法访问cdn上的css文件导致的。经过深入了解,发现google请求cdn上的资源时,会先请求该cdn域名下的robots.txt。如果请求失败,就不再请求cdn上的其他文件了。

  • 【thymeleaf文档精华版】springboot thymeleaf常用语法中文教程

    现在虽然Vue、React等前端框架盛行,但是部分需要SEO的页面,还是得用thymeleaf之类的模板引擎来渲染。thymeleaf的官方文档,写的太过详细,显得比较啰嗦。本文主要是把thymeleaf官方的英文文档,结合作者自己的使用经验,整理成了一篇可以用来速查的中文教程,方便大家。

  • chatGPT为你介绍Java通信框架Netty

    本文通过让chatGPT介绍java常用的通信框架netty,带你逐渐深入的了解chatGPT。

  • java实现62进制和10进制转换算法

    本文介绍如何使用java来实现62进制和10进制之间的转换,代码经过大量场景验证,可以直接复制使用。

user

ʘᴗʘ

77
文章数
68864
浏览量
54568
获赞数
67.80
总收入