java鬼混笔记:shiro 11、唯一登录和登录退出Bug

来源:互联网 发布:淘宝口罩属于什么类目 编辑:程序博客网 时间:2024/06/10 15:20

完整的项目下载路径(项目下载网上的hui框架来着,什么鬼文件都在里面,暂清除,所以很多):
http://download.csdn.net/download/u013845177/9992748
相关的lib包路径:
http://download.csdn.net/download/u013845177/9992728


这次的笔记是在运行程序时,发现一个问题,今天才有空处理。问题举例来讲吧:比如用户A第1次登录后,由于设置了唯一登录,用了Deque保存用户的sessionId,当用户A退出时, session是清空了,但是Deque中没有清空。第二次A再次登录,这时Deque又把sessionid放进去,这时Deque中sessionid 有两个,由于设置了唯一登录,这时要清空第1次登录的sessionid对应的session,但是第1次sessionid清空了,找不到了,所以报了session找不到,控制台红红的。。。

解决方案:自定义一个退出类,手动清空Deque。上代码...

package cn.common;import java.io.Serializable;import java.util.Deque;import java.util.LinkedList;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import org.apache.shiro.cache.Cache;import org.apache.shiro.cache.CacheManager;import org.apache.shiro.session.SessionException;import org.apache.shiro.subject.Subject;import org.apache.shiro.web.filter.authc.LogoutFilter;import cn.entity.User;public class LSLogoutFilter extends LogoutFilter {private Cache<String, Deque<Serializable>> cache;private CacheManager cacheManager;public CacheManager getCacheManager() {return cacheManager;}public void setCacheManager(CacheManager cacheManager) { this.cache = cacheManager.getCache("shiro-kickout-session");}@Overrideprotected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {Subject subject = getSubject(request, response);String redirectUrl = getRedirectUrl(request, response, subject);try {// 获取退出用户的信息User user = (User) subject.getPrincipal();LinkedList ll = (LinkedList) cache.get(user.getUserName());// 找到这个用户在缓存中的Dequeif(ll != null) {ll.removeLast();// 根据LinkedList机制,清空最后一个sessionid}cache.put(user.getUserName(), ll);// 放回去subject.logout();} catch (SessionException ise) {ise.printStackTrace();}issueRedirect(request, response, redirectUrl);return false;}}

接着在applicationContext-shiro.xml加入这个bean

<!-- 自定义退出功能 --><bean id="lSLogoutFilter" class="cn.common.LSLogoutFilter"> <property name="cacheManager" ref="cacheManager"/>    </bean>

同时在<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">中加入红色的代码:

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"><property name="securityManager" ref="securityManager" /><property name="filters"><map><entry key="authc" value-ref="LSFormAuthenticationFilter" /><!-- 配置自定义的form过滤器 --><entry key="kickout" value-ref="kickoutSessionControlFilter"/><!-- 踢人 --><entry key="logout" value-ref="lSLogoutFilter"/><!-- 退出 --></map></property><!-- 没有登录就跳到这 --><property name="loginUrl" value="/login.do" /><!-- successUrl认证成功后跳转的url,去掉,因为实际中,比如successUrl对应的是A页,我在访问C页面时,有一个功能是要登录才可以操作的,如果我配置了successUrl,那么我登录成功之后会跳转A页面,然后我再各种点点点才回到C页面,这就很蛋疼了,如果我没配置 successUrl,那么在登录之后,shiro会自动跳转到上一个url,也是登录页面前一个url,那就是C页面的url,也就是C页面跳转到登录页面后,成功登录后直接返回到C页面,我就可以继续在C页面做事了--><!-- <property name="successUrl" value="index.do"/> --><property name="filterChainDefinitions"><value>/ssiupload/** = anon/up.jsp = anon<!-- logout.do shiro自己清空session -->/logout.do = logout<!-- 注意这里引用退出-->


OK。。。

阅读全文
0 0