Shiro并发登录人数控制遇到的问题和解决

shiro并发登录人数控制遇到的问题和解决

    • 问题1:KickoutSessionControlFilter不起作用
    • 问题2:KickoutSessionControlFilter中cache为null空指针异常
    • 问题3:服务器重启后首页访问:subject.getPrincipal()报ClassCastException异常
    • 系统环境
    • 参考资料

问题1:KickoutSessionControlFilter不起作用

public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {}中设置:
{

filters.put(“kickout”, new KickoutSessionControlFilter());

filterMap.put("/**", “kickout”);
}
结果:KickoutSessionControlFilter不起作用。
进一步查看代码:

public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {ShiroPermsFilterFactoryBean shiroFilter = new ShiroPermsFilterFactoryBean();...Map<String, Filter> filters = new HashMap<>(3);filters.put("kickout", new KickoutSessionControlFilter());shiroFilter.setFilters(filters);Map<String, String> filterMap = new LinkedHashMap<>(16);...filterMap.put("/**", "kickout");shiroFilter.setFilterChainDefinitionMap(filterMap);return shiroFilter;}

查看代码行:shiroFilter.setFilterChainDefinitionMap(filterMap);

setFilterChainDefinitionMap点进去:

public void setFilterChainDefinitionMap(Map<String, String> filterChainDefinitionMap) {...filterChainDefinitionMap.put("/**", "user");super.setFilterChainDefinitionMap(filterChainDefinitionMap);...
}

分析:

filterMap.put("/**", "kickout");

filterChainDefinitionMap.put("/**", "user");

操作的是同一个对象,
filterChainDefinitionMap是一个Map,
key一样,put会覆盖掉前面的值。

解决:

filterChainDefinitionMap.put("/**", "kickout,user");

问题2:KickoutSessionControlFilter中cache为null空指针异常

public class KickoutSessionControlFilter extends AccessControlFilter {private Cache<String, Deque<Serializable>> cache;...@Overrideprotected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {...Deque<Serializable> deque = cache.get(username);...deque = new LinkedList<Serializable>();cache.put(username, deque);...}
}

查看:ShiroConfig.java中session管理器SessionManager

@Beanpublic SessionManager sessionManager(GlobalProperties globalProperties){DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();sessionManager.setSessionValidationSchedulerEnabled(true);sessionManager.setSessionIdUrlRewritingEnabled(false);sessionManager.setDeleteInvalidSessions(true);if (globalProperties.isRedisSessionDao()) {// 开启redis会话管理器sessionManager.setSessionFactory(new UserSessionFactory());sessionManager.setSessionDAO(new UserSessionDAO());List<SessionListener> sessionListeners = new ArrayList<>();sessionListeners.add(new UserSessionListener());sessionManager.setSessionListeners(sessionListeners);}return sessionManager;}

发现:框架没有配置CacheManager,有配置redis会话管理,改用RedisCacheManager。
解决:

public class KickoutSessionControlFilter extends AccessControlFilter {private Cache<String, Deque<Serializable>> cache;...@Overrideprotected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {...RedisCacheManager redisCacheManager = (RedisCacheManager) SpringContextUtils.getBean("redisCacheManager");...LinkedList<Serializable> linkedList = new LinkedList<Serializable>();...linkedList = (LinkedList<Serializable>) redisCacheManager.get(username);...redisCacheManager.set(username,linkedList);...}
}

问题3:服务器重启后首页访问:subject.getPrincipal()报ClassCastException异常

@Overrideprotected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {Subject subject = getSubject(request, response);if(!subject.isAuthenticated() && !subject.isRemembered()) {//如果没有登录,直接进行之后的流程return true;}Session session = subject.getSession();SysUserEntity user = (SysUserEntity) subject.getPrincipal();username= user.getUsername();...
}

一番打端点分析:
用户登陆状态下,服务器重启后:

subject.isAuthenticated()仍然为true。“//如果没有登录,直接进行之后的流程”该步骤不能进入,未return true,继续后续执行。

且session仍然在,未失效。

(SysUserEntity) subject.getPrincipal();
强转报异常,原因不明。

暂时解决方法:try捕获ClassCastException时调用subject.logout();登出。定向到首页。

try {SysUserEntity user = (SysUserEntity) subject.getPrincipal();username= user.getUsername();} catch (ClassCastException cce) {//服务器重启后,session仍然在,但subject.getPrincipal会有强转异常try {subject.logout();} catch (Exception e) { //ignore}saveRequest(request);httpServletRequest.setAttribute("errorMsg", "登录超时,请重新登录");httpServletRequest.getRequestDispatcher("/login").forward(request, response);return false;}

系统环境

springboot

参考资料

https://blog.csdn.net/qq_33556185/article/details/51744004
https://www.w3cschool.cn/shiro/epht1ifg.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/549177.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新的网站上线 linux视野

开通了新的网站www.linuxsight.com会一直专注着Linux文章的写作转载于:https://blog.51cto.com/87243/354662

js中toFixed方法的两个坑

js中toFixed方法的两个坑toFixed返回结果是string&#xff0c;后续使用它计算会错误toFixed返回结果可能出现负零-0.00toFixed返回结果是string&#xff0c;后续使用它计算会错误 代码演示&#xff1a; 类型判断代码示例&#xff1a; var stringNum (100.101).toFixed(2); v…

Redhat linux 5.3 基于bond的heartbeat

一、设置bond 1.修改网卡cd /etc/sysconfig/network-scripts/cp ifcfg-eth0 ifcfg-bond0vi ifcfg-bond0DEVICEbond0 ONBOOTyes BOOTPROTOnone IPADDR192.168.1.200 NETMASK255.255.255.0 GATEWAY192.168.1.1 USERCTLno TYPEEthernetvi ifcfg-eth0DEVICEeth0 ONBOOTyes BOOTPROT…

外挂:一个很杯具的关键字

在网页挂马泛滥的时代&#xff0c;盗号***不缺少传播到用户电脑的通道&#xff0c;因为只需要找一些与游戏有关的网站&#xff0c;或者在流量大的网站把网马一挂&#xff0c;就不愁钓不着鱼。如今&#xff0c;时代在变迁&#xff0c;安全软件已经成功的解决了网页挂马这个难题&…

java.lang.ClassNotFoundException: retrofit2.Retrofit$Builder解决思路

ClassNotFoundException报错具体问题报错详情推测可能是jar包问题问题总结自定义依赖缺少依赖jar具体问题 Caused by: java.lang.NoClassDefFoundError: retrofit2/converter/simplexml/SimpleXmlConverterFactory报错详情 org.springframework.web.util.NestedServletExcept…

varnish排错

●Troubleshooting varnish&#xff08;varnish排错&#xff09;<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />有时候varnish会出错&#xff0c;为了使您知道该检查哪里&#xff0c;您可以检查varnishlog&#xff0c;/var/log…

图像质量评估方法——结构相似性指数(SSIM)

结构相似性指数&#xff08;SSIM&#xff09;是一种全参考图像质量评估方法&#xff0c;用于比较两幅图像的相似性。 SSIM的计算涉及到亮度&#xff08;Luminance&#xff09;、对比度&#xff08;Contrast&#xff09;和结构&#xff08;Structure&#xff09;三个方面的相似性…

OpenSSL加密与证书

加密 身份的验证 &#xff08;非对称加密&#xff09;数据的加密 &#xff08;对称加密&#xff09;数据的完整性 &#xff08;单向加密&#xff09;三者的联合使用会保证数据的安全机制 A&#xff1a;发送者 B&#xff1a;接收方 A的操作&#xff1a; A使用…

asp 正则表达式

这里用的是正则式Set objRegExp New Regexp 建立对象objRegExp.IgnoreCase True 大小写忽略objRegExp.Global True 全局为真objRegExp.Pattern "http://.?" 匹配字段set mmobjRegExp.Execute(str) 执行查找&#xff0c;str为输入参数For Eac…

SQL SERVER重置自动编号列(标识列)

为什么80%的码农都做不了架构师&#xff1f;>>> 两种方法&#xff1a; 一种是用Truncate TRUNCATE TABLE name 可以删除表内所有值并重置标识值 二是用DBCC CHECKIDENT DBCC CHECKIDENT (table_name, RESEED, new_reseed_value) 如dbcc checkident ("bc_pos&q…

VBScript:登录脚本

今日与一些朋友调侃起各自的部门名称&#xff0c;有的IT部已经被用户公认为“挨踢”部&#xff0c;甚至有的IT部的分机号码都已被设置为119, 不知有多少ITPro被沦落为“救火员”&#xff0c;成就了传说中的“挨踢”&#xff0c; 业务与IT部门之间的哪些微秒之外到底在哪里&…

WebService生成客户端代理的工具WSDL参数介绍

wsdl.exe使用 ASP.NET&#xff0c;根据 WSDL 协定文件、XSD 架构和 .disc 发现文档&#xff0c;为 Xml Web Services 客户端和 Xml Web Ser 代码的实用工具。此工具可以与 disco.exe 一起使用。wsdl.exe <选项> <URL 或路径> <URL 或路径>选项 <URL 或路径…

“街坊”×××数字平台,昔日的思想,曾经的努力

“街坊”数字平台“街坊”数字平台由“街坊”网站(http://www.jefun.cn/)、街坊售楼系统软件(http://real.jefun.cn/soft/)、街坊二手房交易系统软件(http://zu8.bj.jefun.cn/soft/)三大部分组成&#xff0c;集成了互联网、电话、短信、软件、GIS等诸位一体的技术与服务手段为用…

postfixadmin 导入数据库出错 ERROR 1062 (23000) at line 29

ERROR 1062 (23000) at line 29: Duplicate entry localhost-postfix-postfix for key 1 解决方法 [rootnagios-server postfixadmin]# mysql -uroot -p111111 <DATABASE_MYSQL.TXT ERROR 1062 (23000) at line 29: Duplicate entry localhost-postfix-postfix for key 1 删…

攻略:三大秘籍让你笑傲IT职场!

IT行业作为处于就业金字塔的顶端行业&#xff0c;一直是众多年轻人的职业梦想。那么&#xff0c;对于怀抱高薪理想的年轻人来说&#xff0c;如何实现他们的IT梦想呢&#xff1f;   秘诀一&#xff1a;认清IT的职业价值   通常人们一提到IT人才&#xff0c;马上就会联想…

SharePoint最简母版页

代码 <%Master language"C#"%><% Register Tagprefix"SharePoint"Namespace"Microsoft.SharePoint.WebControls"Assembly"Microsoft.SharePoint, Version12.0.0.0, Cultureneutral, PublicKeyToken71e9bce111e9429c"%><…

flink实时流遇到的问题排查——部分数据未落库redis问题

flink实时流遇到的问题排查1、技术和环境2、问题表述3、简化的代码4、问题排查思路5、结论6、后续补充1、技术和环境 技术&#xff1a;kafka、zookeeper、DataStream、redis 环境表述&#xff1a;kafka生产者KafkaProducerTest类mock 3条日志后&#xff0c;FlinkDataRealTimeF…

CA0503:无法显示额外的代码分析警告或错误

项目团队正在使用VSS进行协同开发&#xff0c;由于人数较多&#xff0c;一开始为了保证开发工作正常进行&#xff0c;打开了代码分析&#xff0c;强制了签入策略&#xff0c;进行代码分析。当项目进行了一段时间后&#xff0c;每次编译都会产生一个错误“CA0503:无法显示额外的…

VS2008中对.Net 3.5 sp1程序打安装包的前提系统环境的配置

众所周知&#xff0c;.net 程序必须要有frame work才能进行运行&#xff0c;这就需要发布程序时一起进行发布&#xff0c;于是我们需要配置本地机器的环境&#xff0c;而不是让用户去网站上下载这些框架。这里只介绍了操作系统的环境设置&#xff0c;对于打包的过程这里不再说明…

封装自定义的redis切库工具类ByteArrayRedisTemplate,读取byte数组反序列化成List<Object>

封装自定义的redis切库工具类ByteArrayRedisTemplate&#xff0c;读取byte数组反序列化成List&#xff1c;Object&#xff1e;&#xff08;使用lettuce连接池&#xff09;代码环境框架&#xff1a;springboot依赖&#xff1a;spring-boot-starter-data-redis步骤1&#xff1a;注…