`

shiro安全框架扩展教程--异常退出没有清除缓存信息处理方案

 
阅读更多
自从之前研究了security3一段时间,发现也不咋滴,后来转行去玩玩shiro,感觉还是挺不错的,小巧灵活;然后遇到个大家都应该遇到过的问题就是当用户退出或者异常关闭浏览器的时候不会自动清除缓存授权信息,当然shiro是有个玩意会自动扫描过期的会话,但是它只会清除会话信息不会清除cache里面的信息,看了网上的答案都是不靠谱的,最好还是自己看源码吧,下面看我的解决方案

<!-- 默认会话管理器 -->  
    <bean id="sessionManager"  
        class="com.shadow.shiro.extend.session.impl.SimpleWebSessionManager">  
        <property name="globalSessionTimeout" value="15000" />  
        <property name="sessionValidationInterval" value="30000" />  
        <property name="sessionValidationSchedulerEnabled" value="true" />  
    </bean>  


全局的会话信息设置成15秒,检测扫描信息间隔30秒,第三个参数就是是否开启扫描
至于我的sessionManager实现类是自己继承,然后重写了其中一个方法

package com.shadow.shiro.extend.session.impl;  
  
import java.util.Collection;  
import java.util.Iterator;  
  
import org.apache.log4j.Logger;  
import org.apache.shiro.cache.CacheManager;  
import org.apache.shiro.session.ExpiredSessionException;  
import org.apache.shiro.session.InvalidSessionException;  
import org.apache.shiro.session.Session;  
import org.apache.shiro.session.mgt.DefaultSessionKey;  
import org.apache.shiro.session.mgt.SessionKey;  
import org.apache.shiro.session.mgt.SimpleSession;  
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;  
  
import com.shadow.shiro.extend.session.WebSessionManager;  
  
/** 
 * 会话管理器 
 *  
 * @author shadow 
 *  
 */  
public class SimpleWebSessionManager extends DefaultWebSessionManager implements  
        WebSessionManager {  
  
    private CacheManager cacheManager;  
  
    private final static Logger logger = Logger  
            .getLogger(SimpleWebSessionManager.class);  
  
    public SimpleWebSessionManager() {  
        super();  
    }  
  
    public void validateSessions() {  
        if (logger.isInfoEnabled())  
            logger.info("Validating all active sessions...");  
        int invalidCount = 0;  
        Collection<?> activeSessions = getActiveSessions();  
        if (activeSessions != null && !activeSessions.isEmpty()) {  
            for (Iterator<?> i$ = activeSessions.iterator(); i$.hasNext();) {  
                Session session = (Session) i$.next();  
                try {  
                    SessionKey key = new DefaultSessionKey(session.getId());  
                    validate(session, key);  
                } catch (InvalidSessionException e) {  
                    if (cacheManager != null) {  
                        SimpleSession s = (SimpleSession) session;  
                        if (s.getAttribute(SESSION_USER_KEY) != null)  
                            cacheManager.getCache(null).remove(  
                                    s.getAttribute(SESSION_USER_KEY));  
                    }  
                    if (logger.isDebugEnabled()) {  
                        boolean expired = e instanceof ExpiredSessionException;  
                        String msg = (new StringBuilder()).append(  
                                "Invalidated session with id [").append(  
                                session.getId()).append("]").append(  
                                expired ? " (expired)" : " (stopped)")  
                                .toString();  
                        logger.debug(msg);  
                    }  
                    invalidCount++;  
                }  
            }  
  
        }  
        if (logger.isInfoEnabled()) {  
            String msg = "Finished session validation.";  
            if (invalidCount > 0)  
                msg = (new StringBuilder()).append(msg).append("  [").append(  
                        invalidCount).append("] sessions were stopped.")  
                        .toString();  
            else  
                msg = (new StringBuilder()).append(msg).append(  
                        "  No sessions were stopped.").toString();  
            logger.info(msg);  
        }  
    }  
  
    public void setCacheManager(CacheManager cacheManager) {  
        this.cacheManager = cacheManager;  
    }  
  
}  


其中这里的方法是校验会话的,我在方法上加入了cachemanager的接口,然后重写set方法,就能获得实例,然后在执行期间调用cache.remove()方法,就能清空缓存上的信息了;

参考:http://blog.csdn.net/shadowsick/article/details/17265625/

     http://blog.csdn.net/shadowsick/article/details/39023315
   
     http://ask.csdn.net/questions/201341
分享到:
评论

相关推荐

    shiro-attack-4.7.0-SNAPSHOT-all.zip

    标题提到的"shiro-attack-4.7.0-SNAPSHOT-all.zip"很可能是针对Apache Shiro的安全测试工具或者漏洞利用工具包,其主要目的是帮助开发者检测和防范Shiro框架相关的安全问题。 描述中的"序列化验证工具"可能是指该...

    shiro-config-core-1.4.0-API文档-中文版.zip

    赠送Maven依赖信息文件:shiro-config-core-1.4.0.pom; 包含翻译后的API文档:shiro-config-core-1.4.0-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.apache.shiro:shiro-config-core:1.4.0; 标签:apache...

    shiro-config-core-1.4.0-API文档-中英对照版.zip

    赠送Maven依赖信息文件:shiro-config-core-1.4.0.pom; 包含翻译后的API文档:shiro-config-core-1.4.0-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:org.apache.shiro:shiro-config-core:1.4.0; ...

    shiro-core-1.3.2-API文档-中文版.zip

    对应Maven信息:groupId:org.apache.shiro,artifactId:shiro-core,version:1.3.2 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持...

    shiro-root-1.2.3-source-release zipa包 和相关jar包

    Apache Shiro是一个强大且易用的Java安全框架,它提供了认证、授权、加密和会话管理功能,可以简化开发人员处理安全的复杂性。在"shiro-root-1.2.3-source-release zipa包"中,包含了Shiro框架的核心源代码,允许...

    shiro(shiro-all-1.8.0.jar)

    shiro(shiro-all-1.8.0.jar)

    shiro-core-1.4.0-API文档-中文版.zip

    赠送Maven依赖信息文件:shiro-core-1.4.0.pom; 包含翻译后的API文档:shiro-core-1.4.0-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.apache.shiro:shiro-core:1.4.0; 标签:apache、shiro、core、中文...

    shiro-event-1.4.0-API文档-中文版.zip

    赠送Maven依赖信息文件:shiro-event-1.4.0.pom; 包含翻译后的API文档:shiro-event-1.4.0-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.apache.shiro:shiro-event:1.4.0; 标签:apache、shiro、event、...

    shiro源码(shiro-root-1.8.0-source-release.zip)

    Apache Shiro 是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能,可以非常轻松地开发出足够安全的应用程序。它既适用于传统的Web应用,也适用于现代的Java EE和Android应用。现在我们来深入...

    shiro-root-1.4.1-source-release.zip

    Apache Shiro 是一款强大且易用的 Java 安全框架,提供身份认证、授权、加密以及会话管理功能,简化了安全实现。标题中的 "shiro-root-1.4.1-source-release.zip" 指的是 Apache Shiro 的 1.4.1 版本源码包,适用于...

    shiro-cas-1.2.3-API文档-中英对照版.zip

    赠送Maven依赖信息文件:shiro-cas-1.2.3.pom; 包含翻译后的API文档:shiro-cas-1.2.3-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:org.apache.shiro:shiro-cas:1.2.3; 标签:apache、shiro、cas、...

    shiro-crypto-cipher-1.4.0-API文档-中文版.zip

    赠送Maven依赖信息文件:shiro-crypto-cipher-1.4.0.pom; 包含翻译后的API文档:shiro-crypto-cipher-1.4.0-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.apache.shiro:shiro-crypto-cipher:1.4.0; 标签:...

    shiro-crypto-core-1.4.0-API文档-中文版.zip

    赠送Maven依赖信息文件:shiro-crypto-core-1.4.0.pom; 包含翻译后的API文档:shiro-crypto-core-1.4.0-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.apache.shiro:shiro-crypto-core:1.4.0; 标签:apache...

    shiro-crypto-core-1.4.0-API文档-中英对照版.zip

    赠送Maven依赖信息文件:shiro-crypto-core-1.4.0.pom; 包含翻译后的API文档:shiro-crypto-core-1.4.0-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:org.apache.shiro:shiro-crypto-core:1.4.0; ...

    shiro-root-1.3.2-source-release

    Apache Shiro 是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能,可以非常容易地开发出足够安全的应用。标题"shiro-root-1.3.2-source-release"表明这是一个Apache Shiro的1.3.2版本源码包,...

    SpringMVC-Mybatis-Shiro-redis-master

    【标题】"SpringMVC-Mybatis-Shiro-redis-master" 涉及的是一个集成框架项目,这个项目集成了四个关键的技术组件:SpringMVC、MyBatis、Shiro和Redis。这些技术在现代Java Web开发中扮演着重要角色。 **SpringMVC**...

    shiro-spring-1.3.2-API文档-中文版.zip

    对应Maven信息:groupId:org.apache.shiro,artifactId:shiro-spring,version:1.3.2 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持...

    shiro-config-ogdl-1.4.0-API文档-中英对照版.zip

    赠送Maven依赖信息文件:shiro-config-ogdl-1.4.0.pom; 包含翻译后的API文档:shiro-config-ogdl-1.4.0-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:org.apache.shiro:shiro-config-ogdl:1.4.0; ...

    shiro-root-1.2.4-source-release.zip

    shiro-root-1.2.4-source-release shiro-root-1.2.3-source-release shiro-all-1.2.4.jar shiro-all-1.2.4.jar shiro-all-1.2.4.jar shiro-all-1.2.4.jar

Global site tag (gtag.js) - Google Analytics