本文使用的方式是拦截器,本人也使用过以下方式:
//使用这种方式,在打包为war后不起作用 //@Configuration public class ErrorPageConfig implements EmbeddedServletContainerCustomizer { @Override public void customize(ConfigurableEmbeddedServletContainer container) { container.addErrorPages( new ErrorPage(HttpStatus.BAD_REQUEST, "/4O0.html"), new ErrorPage(HttpStatus.UNAUTHORIZED, "/4O1.html"), new ErrorPage(HttpStatus.NOT_FOUND, "/404.html"), new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/500.html") ); } }
注:这种方式,使用Springboot内置的Tomcat是没问题,可当你打成war包,发布到自己的Tomcat的时候就会失效,不知道为啥
以下是使用拦截器的方式,根据http状态码拦截对应的错误页面
第一步:创建我们自己的拦截器类并实现 HandlerInterceptor 接口。
/** 创建一个拦截器,拦截Controller 需要实现 HandlerInterceptor 接口 / public class MyHandleInterceptor implements HandlerInterceptor { / 在Controller调用之前运行 return false 将不会执行任何控制 / @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { System.out.println("==preHandle:在Controller调用之前运行==" + o.getClass()); return true; } / 在Controller调用之后 且 页面渲染之前运行 / @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { System.out.println("==postHandle:在Controller调用之后 且 页面渲染之前运行==" + o.getClass()+"-----"+httpServletResponse.getStatus()); if(httpServletResponse.getStatus()==500){ modelAndView.setViewName("pages/500"); }else if(httpServletResponse.getStatus()==400){ modelAndView.setViewName("pages/400"); }else if(httpServletResponse.getStatus()==401){ modelAndView.setViewName("pages/401"); }else if(httpServletResponse.getStatus()==404){ modelAndView.setViewName("pages/404"); } } / 在Controller调用之后 且 页面渲染之后运行,一般进行清理资源操作 / @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { System.out.println("==afterCompletion:在Controller调用之后 且 页面渲染之后运行==" + o.getClass()); } }
第二步:添加并触发拦截器的类
/** 添加并触发拦截器的类 / @SpringBootConfiguration public class Webconfiguration extends WebMvcConfigurerAdapter{ / 覆盖父类addInterceptors方法,来添加拦截器类 / @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyHandleInterceptor()); } }
到这里拦截器就基本实现了,当然那些html页面你肯定得自己搞定
不过需要注意的是,这种拦截有时候也会出现特别大问题。例如一个网页中如果需要加载很多的图片或者js文件资源,可是正好没有这个资源,也就是找不到这么多个资源报一堆的404错误。这个时候如果还是单纯的使用这种拦截就会出现null指针异常的情况。
针对这种情况,我研究了一种方法可以解决这样类似的问题。
解决方案就是:创建一个类并实现ErrorController接口,这样就可以利用这个类来处理上面发生的问题了。
下面给出代码:
package example.controller; import org.springframework.boot.autoconfigure.web.ErrorController; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class MainsiteErrorController implements ErrorController { private static final String ERROR_PATH = "/error"; @RequestMapping(value=ERROR_PATH) public String handleError(){ return "errorpage/error"; } @Override public String getErrorPath() { return ERROR_PATH; } }
参考链接:http://blog.csdn.net/linzhiqiang0316/article/details/52600839