一、为什么要区分Ajax请求?
在前台使用EasyUI的系统中,所有的请求可以分为两大类:
1)跳转到页面
2)返回Json数据
这时当请求来了时要区分处理,如果是”跳转到页面”的请求,需要跳到没有权限的页面,否则“返回Json数据”的请求,需要返回一个Json数据{“success”:false,”message”:”权限不足!”}
二、实现原理分析
2.1 原有实现分析
原来权限执行分析:
1)当用户访问需要有权限才能访问资源;
2)会交给PermissionsAuthorizationFilter判断是否有权限;
3)如果没有权限会调用onAccessDenied这个方法完成跳转没有权限界面;
问题:由于PermissionsAuthorizationFilter onAccessDenied没有区分是否Ajax来单独处理。怎么区分?区分出来怎么处理?
2.2 新实现分析2.3.1 如何区分ajax
Ajax请求请求头如下:
非Ajax请求头如下:
只要咱们从请求头中能够获取X-Request-with的请求头说明就是Ajax请求。
2.3.2 如何处理
原生的权限处理过滤器中并没有区分AJax,所有我们要继承它,并且实现它的没有权限的方法,在里面实现Ajax的区分处理。而这些操作都需要定义新的过滤器。
对于过滤器需要经历下面的步骤:
1)定义一个过滤器的类
2)在shiro中声明过滤器的类,让它可以用来处理权限
3)配置使用新的过滤器
具体实现参考区分Ajax实现
三、区分Ajax实现3.1 定义一个过滤器的类
该类继承PermissionsAuthorizationFilter,具体实现如下:
3.2 申明为shiro的过滤器
在shiro中声明过滤器的类,让它可以用来处理权限上。
3.3 配置使用新的过滤器
四、总结
Shiro对权限的处理,并没有区分是否是Ajax请求,需要我们自己写过滤器来实现。在实现时通过获取请求头X-Request-with是否有值来区分,区分开来以后,对于普通请求直接跳转到没有权限的页面,对于AJax请求返回一个没有权限的JSon数据。
感谢源码时代Java学科讲师提供此文章!
本文为原创文章,转载请注明出处!