• shiro之AccessControlFilter()


    AccessControlFilter
    AccessControlFilter提供了访问控制的基础功能;比如是否允许访问/当访问拒绝时如何处理等:

    abstract boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception;  
    boolean onAccessDenied(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception;  
    abstract boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception; 
    
    • 1
    • 2
    • 3

    isAccessAllowed:表示是否允许访问;mappedValue就是[urls]配置中拦截器参数部分,如果允许访问返回true,否则false;

    onAccessDenied:表示当访问拒绝时是否已经处理了;如果返回true表示需要继续处理;如果返回false表示该拦截器实例已经处理了,将直接返回即可。

    onPreHandle会自动调用这两个方法决定是否继续处理:

    boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {  
        return isAccessAllowed(request, response, mappedValue) || onAccessDenied(request, response, mappedValue);  
    }  
    
    • 1
    • 2
    • 3

    isAccessAllowed和onAccessDenied是AccessControlFilter的方法

    另外AccessControlFilter还提供了如下方法用于处理如登录成功后/重定向到上一个请求:

    void setLoginUrl(String loginUrl) //身份验证时使用,默认/login.jsp  
    String getLoginUrl()  
    Subject getSubject(ServletRequest request, ServletResponse response) //获取Subject实例  
    boolean isLoginRequest(ServletRequest request, ServletResponse response)//当前请求是否是登录请求  
    void saveRequestAndRedirectToLogin(ServletRequest request, ServletResponse response) throws IOException //将当前请求保存起来并重定向到登录页面  
    void saveRequest(ServletRequest request) //将请求保存起来,如登录成功后再重定向回该请求  
    void redirectToLogin(ServletRequest request, ServletResponse response) //重定向到登录页面 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    比如基于表单的身份验证就需要使用这些功能。
    到此基本的拦截器就完事了,如果我们想进行访问的控制就可以继承AccessControlFilter;如果我们要添加一些通用数据我们可以直接继承PathMatchingFilter。

    扩展AccessControlFilter
    AccessControlFilter继承了PathMatchingFilter,并扩展了两个方法:

    public boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {  
        return isAccessAllowed(request, response, mappedValue)  
         || onAccessDenied(request, response, mappedValue);  
    }   
    
    • 1
    • 2
    • 3
    • 4

    isAccessAllowed:即是否允许访问,返回true表示允许;

    onAccessDenied:表示访问拒绝时是否自己处理,如果返回true表示自己不处理且继续拦截器链执行,返回false表示自己已经处理了(比如重定向到另一个页面)。

    public class MyAccessControlFilter extends AccessControlFilter {  
        protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {  
            System.out.println("access allowed");  
            return true;  
        }  
        protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {  
            System.out.println("访问拒绝也不自己处理,继续拦截器链的执行");  
            return true;  
        }  
    }   
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    然后在shiro.ini中进行如下配置:

    [filters]  
    myFilter4=com.github.zhangkaitao.shiro.chapter8.web.filter.MyAccessControlFilter  
    [urls]  
    /**=myFilter4
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    什么是分布式定时任务框架?
    公共关系与人际交往能力
    被一位读者赶超,手摸手 Docker 部署 ELK Stack
    J2EE的N层体系结构
    企业选择ai智能电话机器人的好处
    微信小程序通过 movable-area 做一个与vuedraggable相似的上下拖动排序控件
    spring集成web环境-ContextLoaderListener监听分析
    判断一个字符串是否括号匹配
    Flowable-6.7.2:数据库详情
    关于Go语言的底层,Channel
  • 原文地址:https://blog.csdn.net/m0_67390788/article/details/126496232