SpringBoot配置404跳转页面的两种方式(配置错误页) 20259553编辑
Heaven helps those who help themselves
资深码农+深耕理财=财富自由
欢迎关注
资深码农+深耕理财=财富自由
欢迎关注

SpringBoot配置404跳转页面的两种方式(配置错误页)
Created by Marydon on 2020-09-02 09:56
1.情景展示
当请求不存在时,服务器会报404异常,这对于产品用户来说不够友好。
2.原因分析
可以配置404请求错误页来进行友好的错误提示。
3.解决方案
方式一:
1 2 3 4 5 | @GetMapping ( "*" ) public String notFound() { // 跳转到404页面所在路径 return "404" ; } |
这种方式,同样适用于springmvc,所有不存在的请求都会映射到该方法上。
但是,问题在于如果项目配置了knife4j项目接口文档,对应的请求是:/doc.html,只有在请求该地址时,项目才会运行生成doc.html,不请求就不存在,因为是临时生成的html文件,原本并不存在于项目当中,所以,在生成页面之前,该方法检测到服务器并不存在doc.html,因此跳转到了404.jsp,就这样,永远也访问不到doc.html,我们也就无法使用knife4j了。
方式二:
为了解决这个问题,我们就不能再使用方式一了。
第一步:添加配置类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /** * 错误页 * @description: ErrorPage(status,path)说明 * 关于path,既可以重定向具体的html也可以重定向请求地址 * 如果配置的是404.html一定要建在template/static下面,否则无效。 * 如果配置的是/404,那就需要在Controller中添加/404请求对应的方法 * @author: Marydon * @date: 2020年08月11日 0011 11:25 */ @Configuration public class ErrorConfig implements ErrorPageRegistrar { @Override public void registerErrorPages(ErrorPageRegistry registry) { ErrorPage[] errorPages = new ErrorPage[ 1 ]; errorPages[ 0 ] = new ErrorPage(HttpStatus.NOT_FOUND, "/404.do" ); registry.addErrorPages(errorPages); } } |
第二步:在控制器中添加/404.do请求
1 2 3 4 5 6 7 8 9 10 11 12 | /** * 不存在的请求,跳转到404页面 * @description: ErrorConfig已经拦截了404请求,然后映射到这个请求上 * @date: 2020年07月10日 0010 17:10 * @param: * @return: java.lang.String */ @GetMapping ( "/404.do" ) public String notFound() { // 跳转到404页面:/jsp/404.jsp return "404" ; } |
需要提醒的是:即将跳转的页面,必须是相对于项目来说的绝对路径。
上面是因为我配置了响应路径的前缀和后缀,实际是:/jsp/404.jsp。
#配置视图解析器 #路径前缀 spring.mvc.view.prefix=/jsp/ #路径后缀 spring.mvc.view.suffix=.jsp
2020-12-27
这里,说一个在idea中的小技巧,要想知道自己配置的文件路径对不对,可以这样:
按住Ctrl键不松手,鼠标悬浮到要跳转的路径上。
再次点击鼠标,能打开对应页面就说明没有问题。
4.扩展延伸
2022年2月24日09:19:55
第一个问题:如何判断404配置有没有生效?
正常情况下,当我们上面配置完成后,直接就可以通过页面来判断:咱们的404请求配置有没有生效;
但是,既然来到了这里,就说明是:非正常情况,也就是说:我们无法通过上面请求一个不存在的地址来通过页面的反馈,进而判断为什么不生效?
下面说一下:排查404配置是否生效的正确流程。
错误方式:
上面配置错误页的配置类,也就是:ErrorConfig.java;
它的问题在于:我们在这个类打上断点,在debug模式下,在触发404的时候,是无法进入这个类进行断点调试的。
有且只有一次:在springboot类启动的时候,也就是将该配置类加载到spring当中时,才会进入。
所以说,当我们企图通过这个配置类来判断404导致有没有生效,是行不通的(虽然,在springboot启动的时候,已经将其加载进去)。
正确方式:
既然,我们无法通过配置类来判断,那我们只能通过配置404的Controller入手;
要想404请求能够顺利地跳转到错误提示页,需要保证以下几点:
第一:上图当中的1是404;2是404请求控制层接收路径;也就是说:1和2保持功能性一致。
第二:2和3保持路径一致;这样,spring才能将请求完成转发,控制层才能匹配上这个请求,并且进入到notFund()方法中。
第三:4是跳转页面的路径,这个路径需要确保:真实存在;否则,响应到客户端的结果,将还是404。
在以上工作,确保准确无误后,我们在这个notFound()当中打个断点,然后,从浏览器访问一个不存在的地址,看看请求能不能进到这里:
如果不能进到这里,排查上图当中的1,2,3这三个步骤。
能进到这里,就说明上图当中的1,2,3是没有问题的,ErrorConfig.java也是没有问题的。
剩下,就是要么是上图当中的4,路径没有配对,或者跳转的页面存在问题。
如果问题是由:从controller到页面造成的404,即下图所示:
解决方案,见文末推荐。
2023年5月25日16:48:15
错误页配置
import org.springframework.boot.web.servlet.ErrorPage; import org.springframework.boot.web.servlet.ErrorPageRegistrar; import org.springframework.boot.web.servlet.ErrorPageRegistry; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; /** * <p> * 全局错误跳转注入 * </p> */ @Configuration public class ErrorPageConfig implements ErrorPageRegistrar { @Override public void registerErrorPages(ErrorPageRegistry registry) { ErrorPage error400Page = new ErrorPage(HttpStatus.BAD_REQUEST, "/error400Page"); ErrorPage error401Page = new ErrorPage(HttpStatus.UNAUTHORIZED, "/error401Page"); ErrorPage error404Page = new ErrorPage(HttpStatus.NOT_FOUND, "/error404Page"); ErrorPage error500Page = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/error500Page"); registry.addErrorPages(error400Page, error401Page, error404Page, error500Page); } }
写在最后
哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!
相关推荐:
与君共勉:最实用的自律是攒钱,最养眼的自律是健身,最健康的自律是早睡,最改变气质的自律是看书,最好的自律是经济独立 。
您的一个点赞,一句留言,一次打赏,就是博主创作的动力源泉!
↓↓↓↓↓↓写的不错,对你有帮助?赏博主一口饭吧↓↓↓↓↓↓
本文来自博客园,作者:Marydon,转载请注明原文链接:https://www.cnblogs.com/Marydon20170307/p/13596710.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2019-09-02 java 调用腾讯身份OCR接口文档实例(绝对可用)
2019-09-02 base64和Blob互相转换