当前位置:硬件测评 > java.lang.IllegalArgumentException:SessionContext必须是HTTP兼容的实现,:模块化本地测试shiro的一些总结

java.lang.IllegalArgumentException:SessionContext必须是HTTP兼容的实现,:模块化本地测试shiro的一些总结

  • 发布:2023-10-07 11:50

-->

由于项目是多模块,所以测试时想在本地测试shiro框架,然后放入框架中。然而,这件事却困扰了我两天。其实我早该想到的,但我只是想多尝试一下,最后还是多想一些比较好

先说一下系统的基本情况。该项目由多个模块协同开发。我负责用户管理模块和权限认证模块。权限认证使用shiro框架。然后我就在网上了解了这个框架以及这个框架。与ssm集成,问题就出现在这里:我正在学习的是与ssm框架集成,而这个集成使用的是web内容,而我只是本地化单元测试,所以当我写te​​st cases时,出现了很多异常,这让我困惑。我首先使用shiro.ini文件读取本地文件,结果是正确的。然后当我把它集成到spring容器中时,同样的方法总是抛出异常

java.lang.IllegalArgumentException:SessionContext 必须是 HTTP 兼容的实现。

然后我就开始在网上寻找这种异常情况。整理了一下,发现基本都是shirofilter order之类的,但这并不能满足我的要求。我想要的是本地测试,本地测试和这个sessionContext有问题。关系?难道Shiro的securityManager也需要web吗?前天我脑子里闪过这个想法,然后我就拒绝了,因为我是按照教程做的。 。 。正是这个否定,让我花了两天的时间去解决这个问题。 。 。

今天整理了一下认证流程,然后查找问题。然后我就想起了我之前的想法。这两个 SecurityManager 真的不同吗?好的,那我先写个日志看看。乍一看,确实不一样。读取ini文件生成SecurityManage Factory,然后生成SecurityManage。类型是:

org.apache.shiro.mgt.DefaultSecurityManager

但是,Spring 容器的类型 I 主机是

org.apache.shiro.web.mgt.DefaultWebSecurityManager

显然,两者不是同一类型。难道是sessionContext造成的?那就试试吧,确实有这个效果。 。 。 。

哈哈,这让我想起以后读取本地配置文件是没有问题的,但是注入到spring容器中就会出现问题。一定要注意两种类型是否一致。

首先我们看一下类的继承结构

以下是认证流程

1。首先根据用户名和密码生成 UsernamePasswordToken

2。 subject通过Login提交token,然后将其交给delegatingSubject交给securityManager来执行登录操作

3。 SecurityManager 有自己的领域,即配置文件中指定的 customerrealm。所以,这个时候securityManager会把这个操作交给customerrealm来执行

4。一切都经过验证后,将生成一个主题。如果认证不成功,该值会直接抛出异常。我们根据异常来判断异常类别。一般是设置了错误的用户名或密码

更详细的认证流程

-->

相关文章