shiro中setUnauthorizedUrl("/403")不起作用
2024-09-05 02:18:49
最近学习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();
}
}
最新文章
- [APUE]文件和目录(中)
- 详解MVC设计模式
- Android之Inflate()方法用途
- POJ2299 Ultra-QuickSort
- POJ2823 Sliding Window(单调队列)
- 关于远程连接MySQL数据库的问题解决
- mac打开.caj格式文件
- 10分钟学会AngularJS的数据绑定
- AjaxPro框架
- 使用 asp.net mv4开发企业级办公OA
- Cocos2d-x学习笔记(六) 定时器Schedule的简单应用
- 让普通 Java 类自动感知 Activity Lifecycle
- Java集合框架(四)—— Queue、LinkedList、PriorityQueue
- 通过nginx访问linux目录
- 学以致用三十一-----IPAddressField has been removed
- c# 封装Dapper操作类
- Delphi 10.3终于来了
- mac里安装Mycrypt扩展
- Thinkphp 缓存和静态缓存局部缓存设置
- TextBox限制输入字母、数字、退格键