关于Shiro登陆退出遇到的一些问题
写在开始
最近项目中出现一些问题,以前可能不大关注,但是问题是实实在在存在的。
问题一
系统重启用户登陆或者退出报错:Disk Write of 407a1347-c2c6-434e-89e3-365aa277497c failed
这个问题,并不是经常出现,看详细错误信息,应该是数据 list或者map序列化的问题。看了一下实体类都实现了序列化。
解决方案
突然想起,以前是没有这个问题的,自从升级了Ehcache的jar包,这个问题时常出现。目前使用的是ehcache2.10.0,随后版本降级为ehcache2.6.9,重启以后再没出现过这个问题。
问题二
用户退出无法请求到logout.action,导致尽管session已经清理,但是用户缓存信息还是实实在在存在的。
如果把logout 改为user或者anon,会报以下错误:
java.lang.IllegalStateException: org.apache.shiro.session.UnknownSessionException: There is no session with id [1370262d-eeac-4ee7-a86e-1a2b14c86d83]
字面意思是,找不到session,的确F12 sid已经不见了,shiro在做跳转的时候就报这个错误(目前不清楚原因,但是后面有解决方案)
部分代码:
<!-- Shiro权限过滤过滤器定义 -->
<property name="filterChainDefinitions">
<value>
/common/** = anon
/template/** = anon
/LoginAction_login.action = anon
/LoginAction_logout.action = logout
/** =user
</value>
</property>
仔细膜拜一下源代码,退出操作是走LogoutFilter过滤的。 部分代码:
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) {
log.debug(
"Encountered session exception during logout. This can generally safely be ignored.",
ise);
}
issueRedirect(request, response, redirectUrl);
return false;
}
注意:最后的return false,返回false表示不执行后续的过滤器,直接返回跳转到登录页面。所以也就不可能再请求到LoginAction_logout.action,也就不会清空用户缓存信息了。
解决方案
重写LogoutFilter:
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.apache.shiro.session.SessionException;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authc.LogoutFilter;
import com.acts.web.sys.utils.UserUtils;
/**
* 重写退出过滤器
* 创建者 张志朋
* 创建时间 2017年4月24日
*/
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 {
//清空缓存
UserUtils.clearCache();
subject.logout();
} catch (SessionException e) {
e.printStackTrace();
}
issueRedirect(request, response, redirectUrl);
return false;
}
}
配置文件定义:
<bean id="logout" class="com.acts.web.filter.SystemLogoutFilter"/>
<!-- 加入filters -->
<property name="filters">
<map>
<entry key="logout" value-ref="kickoutSessionControlFilter"/>
</map>
</property>
如果存在多realm,可能会返回不同的登陆页,这里可以把return false 改为 return true 执行后续的过滤器,自定义Action重定向不同的页面。
好,到这两个问题都解决了。第二个问题,基本就是由于未理解shiro的原理导致的,所以大家使用开源框架的时候一定要弄清楚其原理,这样才可以精确的定位问题。
- 设计模式六大原则(4):接口隔离原则
- 设计模式六大原则(3):依赖倒置原则
- 闲的无聊时候就手动写第一个漏洞扫描工具吧!
- 模拟退火算法从原理到实战【基础篇】
- python接口自动化3-自动发帖(session)
- 平面上给定n条线段,找出一个点,使这个点到这n条线段的距离和最小。
- python接口自动化4-绕过验证码登录(cookie)
- 洛谷P1313 计算系数【快速幂+dp】
- python接口自动化5-Json数据处理
- Numpy教程第1部分 - 阵列简介(常用基础操作总结)
- Session和Cookies的基本原理
- 浅析Numpy.genfromtxt及File I/O讲解
- 损失函数详解
- 排查Java的内存问题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 多文件目录Makefile的写法
- 一个有趣的例子带你入门canvas
- GitLab 12 跨版本 13 升级
- 【Rust日报】2020-07-28 SO:在命令行下浏览StackOverflow
- 【翻译】200行代码讲透RUST FUTURES (6)
- MPU6050姿态解算方式1-DMP
- 打卡群刷题总结0729——分隔链表
- 单细胞tSNE细胞降维图还可以这样做?!
- 从IIC实测波形入手,搞懂IIC通信
- FreeRTOS例程4-串口DMA收发不定长数据
- FreeRTOS例程3-串口中断接收不定长的数据与二值信号量的使用
- 前端如何将json数据导出为excel文件
- 使用Postman访问腾讯云API3.0
- C语言将float拆分为4个hex传输与重组
- C语言字符串相关函数使用示例 strtok_r strstr strtok atoi