需求
之前的文章有介绍如何在SpringBoot下MVC整合(包含JSP页面以及JSTL),详见:https://blog.terrynow.com/2021/07/07/springboot-mvc-jsp-and-jstl-implment/
我们还需要为它设计统一的错误页面
实现
- 首先,修改application.properties
# SpringBoot自带一个简易的错误页面,我们将它禁用 server.error.whitelabel.enabled=false spring.mvc.throw-exception-if-no-handler-found=true spring.resources.add-mappings=false
- 新建GlobalExceptionHandler.java,全局错误处理逻辑
@RestControllerAdvice public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { private static final Log log = LogFactory.getLog(GlobalExceptionHandler.class); // @Override // protected ResponseEntity<Object> handleNoHandlerFoundException(NoHandlerFoundException ex, HttpHeaders headers, // HttpStatus status, WebRequest request) { //// response.setStatus(httpStatus.value()); // log.warn("request no handler found for: " + request.getDescription(true)); // Map<String, Object> responseBody = new HashMap<>(); // responseBody.put("result", false); // responseBody.put("path", request.getDescription(true)); // responseBody.put("time", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); // responseBody.put("message", "The URL you have reached is not in service at this time (404)."); // return new ResponseEntity<>(responseBody, HttpStatus.NOT_FOUND); // } @ExceptionHandler(Throwable.class) public ModelAndView exceptionHandler(HttpServletRequest request, HttpServletResponse response, Exception ex) { //If exception has a ResponseStatus annotation then use its response code ResponseStatus responseStatusAnnotation = AnnotationUtils.findAnnotation(ex.getClass(), ResponseStatus.class); return buildModelAndViewErrorPage(request, response, ex, responseStatusAnnotation != null ? responseStatusAnnotation.value() : HttpStatus.INTERNAL_SERVER_ERROR); } @RequestMapping("*") public ModelAndView fallbackHandler(HttpServletRequest request, HttpServletResponse response) throws Exception { return buildModelAndViewErrorPage(request, response, null, HttpStatus.NOT_FOUND); } private ModelAndView buildModelAndViewErrorPage(HttpServletRequest request, HttpServletResponse response, Exception ex, HttpStatus httpStatus) { log.error("request handle error for: " + request.getRequestURI() + ", ip: " + Utils.getIpAddr(request) + ", status: " + httpStatus.value(), ex); String exMessage = ex.getMessage(); if (ex != null && exMessage.startsWith("410 ")) { try { response.sendError(410, ex.getMessage()); } catch (IOException ignored) { } }else{ try { response.sendError(500, ex.getMessage()); } catch (IOException ignored) { } } ModelAndView mav = new ModelAndView("error"); mav.addObject("exception", ex); mav.addObject("content", request.getRequestURL()); return mav; } }
- 设计自己需要的错误页面error.jsp
以下是示例,可以根据自己的需求修改
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>错误</title> <link rel="stylesheet" type="text/css" href="assets/css/iview.css"> <link rel="stylesheet" type="text/css" href="assets/css/index.css"> <script type="text/javascript" src="assets/js/vue.min.js"></script> <script type="text/javascript" src="/assets/js/iview.min.js"></script> <style type="text/css"> </style> </head> <body> <div id="app"> <layout class="m-layout"> <jsp:include page="header.jsp" /> <layout class="m-content"> <jsp:include page="menu.jsp" /> <layout class="right-content"> <row class="top-bc"> <i-col span="12"> <h2> 错误 </h2> </i-col> <i-col span="12" style="text-align: right;"> <breadcrumb> <breadcrumb-item><a href="${base}"><icon type="md-home" :size="18"></icon> 首页</a></breadcrumb-item> <breadcrumb-item>错误</breadcrumb-item> </breadcrumb> </i-col> </row> <i-content class="main-content"> <alert type="error" show-icon> 错误 <c:out value="${requestScope['javax.servlet.error.status_code']}" /> <span slot="desc"> <c:if test="${content !=null}"> <p>${content}</p> </c:if> <c:if test="${exception.message !=null}"> ${exception.message} </c:if> <c:if test="${exception.message ==null}"> 错误了! </c:if> <a href="" class="">返回首页</a> </span> </alert> <!-- Failed URL: ${url} Exception: ${exception.message} <c:forEach items="${exception.stackTrace}" var="ste"> ${ste} </c:forEach> --> </i-content> <jsp:include page="footer.jsp" /> </layout> </layout> </layout> </div> <script> new Vue({ el: '#app', data: {}, created: function () { }, methods: {} }) </script> </body> </html>
文章评论