之前我们已经配置了权限,但是当权限不足之后,跳转的是默认的403的页面,这个页面不好看,所以,现在我们要跳转到自定义的权限不足的页面。具体流程如下
1 先写一个权限不足的页面
2 在配置文件里面配置 这个配置处理的只是403的异常,其他的不能处理
以上配置之后,重新启动项目,只要访问权限不足的页面,那么就会跳转到我们自己写的403的页面
之前的配置只是处理403的异常,但是一个项目有很多的异常,比如403 500 等其他的,现在我们想要都有一个自定义的处理,如何写呢?
1 不要写只是403 的配置,也就是将那个方式注释掉
2 写一个通用的方式。、
<!-- 处理403异常-->
<error-page>
<error-code>403</error-code>
<location>/403.jsp</location>
</error-page>
<!-- 处理404异常-->
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
以上配置之后,重新启动项目,就可以实现异常的处理
以上的处理,不能在前后端分离的项目里面使用,在以后的springboot项目里面,找不到web.xml文件咋办,所以我们找一个在后端就可以处理的方法,不需要前端页面的方法。这个就是使用拦截器
过滤器是只是在web.xml里面使用,拦截器就不是了,在springboot项目里面也可以使用。
所以,现在开始说,spring如何解决异常
@Component
public class HandlerControllerException implements HandlerExceptionResolver {
/**
* @param httpServletRequest
* @param httpServletResponse
* @param o 出现异常的对象
* @param e 出现的异常信息
* @return ModelAndView
*/
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
ModelAndView mv = new ModelAndView();
//将异常信息放入request域中,基本不用
mv.addObject("errorMsg", e.getMessage());
//指定不同异常跳转的页面
if(e instanceof AccessDeniedException){
mv.setViewName("redirect:/403.jsp");
}else {
mv.setViewName("redirect:/500.jsp");
}
return mv;
}
}
重新启动项目,就可以实现
但是以上的写法还是麻烦,因为要实现接口,所以spring还提供了另外的方法,我们看看咋实现
用注解的方法
@ControllerAdvice
public class HandlerControllerAdvice{
@ExceptionHandler(AccessDeniedException.class)
public String handlerException(){
return "redirect:/403.jsp";
}
@ExceptionHandler(RuntimeException.class)
public String runtimeHandlerException(){
return "redirect:/500.jsp";
}
}