问题描述
ShiroConfig中设置未授权页面统一跳转403页面,但是没有权限的用户访问时,并未跳转指定页面,页面报错信息如下:
控制台报错如下:
问题分析
这是因为shiro源代码中判断了filter是否为AuthorizationFilter,只有perms,roles,ssl,rest,port才是属于AuthorizationFilter,而anon,authcBasic,auchc,user是AuthenticationFilter,所以unauthorizedUrl设置后不起作用。
解决办法
定义一个全局异常捕获类
/**
* @Title GlobalExceptionHandler.java
* @description 用于解决shiroFilterFactoryBean.setUnauthorizedUrl("/403");不生效的问题
* @time 2020年1月8日 上午11:13:30
* @author wuguodong
**/
/**
* @ControllerAdvice注解的作用:是一个Controller增强器,可对controller中被@RequestMapping注解的方法加一些逻辑处理,最常用的就是异常处理;【三种使用场景】全局异常处理。全局数据绑定,全局数据预处理
* @Order 注解@Order或者接口Ordered的作用是定义SpringIOC容器中Bean的执行顺序的优先级,而不是定义Bean的加载顺序,Bean的加载顺序不受@Order或Ordered接口的影响;
* @ExceptionHandler 统一异常处理
*
*/
@ControllerAdvice
@Order(value = Ordered.HIGHEST_PRECEDENCE)
public class GlobalExceptionHandler {
@ExceptionHandler(value = AuthorizationException.class)
public String handleAuthorizationException() {
return "403";
}
}