zoukankan      html  css  js  c++  java
  • 分享知识-快乐自己:Shiro 退出登陆清空缓存实现

    shiro是一个被广泛使用的安全层框架,通过xml配置方式与spring无缝对接,用户的登陆/退出/权限控制/Cookie等管理系统基础功能交给shiro来管理。

    一般,在JavaWEB管理平台系统时,用户退出系统之前没需要清除用户数据和关闭连接,防止垃圾数据堆积,shiro提供了LogoutFilter过滤器,我们可以继承LogoutFilter,重写preHandle方法,实现清除缓存功能。

    1):第一种方式(关键代码)

    spring-shiro.xml:

    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <property name="securityManager" ref="securityManager"/>
        <!--首页加载页-->
        <property name="loginUrl" value="/login.jsp"/>
        <!--登陆成功页面-->
        <property name="successUrl" value="/index.jsp"/>
        <!--没有权限的页面-->
        <property name="unauthorizedUrl" value="/unauthorized.jsp"/>
        <property name="filters">
            <map>
                <!--退出过滤器-->
                <entry key="logout" value-ref="systemLogoutFilter" />
            </map>
        </property>
        <!--
                配置哪些页面需要受保护.
                以及访问这些页面需要的权限.
                1). anon 可以被匿名访问
                2). authc 必须认证(即登录)后才可能访问的页面.
                3). logout 登出.(登出(缓存很严重【例如:成功登陆一次,再去登陆页面输入错误密码同样可以登录,不会再走相关 Realm 认证:所以需要先登出】)
                4). roles 角色过滤器'
                5):/** = authc 除了/login.jsp(即自定义的权限页面) 的页面都需要认证
                注意:第一次匹配优先 写在/**=authc 下载的节点配置将失效无法访问
        -->
        <!--
            01.XML:手动配置权限
        -->
        <property name="filterChainDefinitions">
            <value>
                /login.jsp = anon
                /shiro/login = anon
                /shiro/logout = logout
                /admin.jsp = roles[admin]
                /user.jsp = roles[user]
                # everything else requires authentication:
                /** = authc
            </value>
        </property>
    </bean>
    <!--
        登出过滤器
     -->
    <bean id="systemLogoutFilter" class="com.gdbd.realms.SystemLogoutFilter"/>
    package com.gdbd.realms;
    
    import org.apache.shiro.session.SessionException;
    import org.apache.shiro.subject.Subject;
    import org.apache.shiro.web.filter.authc.LogoutFilter;
    
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    
    /**
     * 登出
     * @author asus
     */
    public class SystemLogoutFilter extends LogoutFilter {
        @Override
        protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {
            //在这里执行退出系统前需要清空的数据
    
            Subject subject = getSubject(request, response);
            String redirectUrl = getRedirectUrl(request, response, subject);
            try {
                subject.logout();
            } catch (SessionException ise) {
                ise.printStackTrace();
            }
            issueRedirect(request, response, redirectUrl);
    
            return false;
        }
    }

    2):第二种方式

    //登出清除缓存
    Subject currentUser = SecurityUtils.getSubject();
    currentUser.logout();

      

  • 相关阅读:
    BEGIN
    bdflush
    BASH BUILTIN COMMANDS 内建命令
    程序 算法与数据结构
    ThinkPHP 3.2.2 在 volist 多重循环嵌套中使用 if 判断标签
    Java实现 蓝桥杯 算法提高 矩形靶
    Java实现 蓝桥杯 算法提高 矩形靶
    Java实现 蓝桥杯 算法提高 矩形靶
    Java实现 蓝桥杯 算法提高 歌唱比赛
    Java实现 蓝桥杯 算法提高 歌唱比赛
  • 原文地址:https://www.cnblogs.com/mlq2017/p/10123651.html
Copyright © 2011-2022 走看看