最近学习shiro框架,在用户没有权限的情况下想让其跳转到403页面,结果非自己预想的效果。后来找到一个解决办法如下:

转载来源

SpringBoot中集成Shiro的时候, 配置setUnauthorizedUrl("/403")了,但是不起作用,只会在控制台打印UnauthorizedException异常信息:

原因:
Shiro源码中是这样做的:

  private void applyUnauthorizedUrlIfNecessary(Filter filter) {
String unauthorizedUrl = this.getUnauthorizedUrl();
if(StringUtils.hasText(unauthorizedUrl) && filter instanceof AuthorizationFilter) {
AuthorizationFilter authzFilter = (AuthorizationFilter)filter;
String existingUnauthorizedUrl = authzFilter.getUnauthorizedUrl();
if(existingUnauthorizedUrl == null) {
authzFilter.setUnauthorizedUrl(unauthorizedUrl);
}
}
}

只有perms,roles,ssl,rest,port才是属于AuthorizationFilter,而anon,authcBasic,authc,user是AuthenticationFilter,所以unauthorizedUrl设置后不起作用,只会在控制台打印异常信息。

接下来,我们需要做一些配置,自己来处理UnauthorizedException异常:

1.第一种方式

@Configuration
public class ExceptionConf { @Bean
public SimpleMappingExceptionResolver resolver() {
SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();
Properties properties = new Properties();
properties.setProperty("org.apache.shiro.authz.UnauthorizedException", "/403");
resolver.setExceptionMappings(properties);
return resolver;
}
}

当然,还有其他的方法可以自己处理。
比如:

2.用spring mvc的统一异常处理类HandlerExceptionResolver

定义一个类继承HandlerExceptionResolver,然后判断UnauthorizedException异常即可。

public class MyExceptionResolver implements HandlerExceptionResolver {

    @Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
if (e instanceof UnauthorizedException) {
ModelAndView mv = new ModelAndView("/403");
return mv;
}
return null;
}
}

然后,在启动类中注册该bean

@SpringBootApplication
public class DemoApplication { public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
} // 注册统一异常处理bean
@Bean
public MyExceptionResolver myExceptionResolver() {
return new MyExceptionResolver();
}
}

最新文章

  1. [APUE]文件和目录(中)
  2. 详解MVC设计模式
  3. Android之Inflate()方法用途
  4. POJ2299 Ultra-QuickSort
  5. POJ2823 Sliding Window(单调队列)
  6. 关于远程连接MySQL数据库的问题解决
  7. mac打开.caj格式文件
  8. 10分钟学会AngularJS的数据绑定
  9. AjaxPro框架
  10. 使用 asp.net mv4开发企业级办公OA
  11. Cocos2d-x学习笔记(六) 定时器Schedule的简单应用
  12. 让普通 Java 类自动感知 Activity Lifecycle
  13. Java集合框架(四)—— Queue、LinkedList、PriorityQueue
  14. 通过nginx访问linux目录
  15. 学以致用三十一-----IPAddressField has been removed
  16. c# 封装Dapper操作类
  17. Delphi 10.3终于来了
  18. mac里安装Mycrypt扩展
  19. Thinkphp 缓存和静态缓存局部缓存设置
  20. TextBox限制输入字母、数字、退格键

热门文章

  1. CLion快捷键设置
  2. Uva12716 素数筛思想的应用
  3. Java中WEAK_PASSWORD_HASH的修改策略
  4. numpy包学习笔记
  5. gulp常用插件之gulp-notify使用
  6. sql注入文件写入和读取
  7. jvm编译器的优化
  8. python计算文件大小
  9. 将字符串日期格式化为yyyy-mm-dd
  10. 134.cookie、session的工作机制