• java.lang.IllegalArgumentException: SessionContext must be an HTTP compatible implementation.:模块化本地测试shiro的一些总结


    项目由于是多模块的,所以,测试的时候我想现将shiro框架进行本地测试,然后再放入框架里面,但是这个困扰我了两天了都,其实我应该想到的,只是想多试试,最后还不如多想想

    先说一下系统的基本情况,项目是多模块协同开发的,我负责的用户管理模块和权限认证模块,权限认证使用的是shiro框架,然后我就在网上学习了这个框架以及这个框架和ssm的整合,问题就出现在这里:学习的是和ssm框架进行整合,而这个整合用到了web的内容,而我只是本地化单元测试,所以我在写test cases的时候就出现了很多异常,让我百思不得其解,我先用shiro.ini文件读取本地文件获得的结果是正确的,然后我整合进spring容器的时候,相同的方法,总是抛出异常

    java.lang.IllegalArgumentException: SessionContext must be an HTTP compatible implementation.

    然后开始网上找这类异常,梳理了一下,基本都是shirofilter顺序之类的,但是这个不符合我的要求啊,我要的是本地测试啊,并且,本地测试和这个sessionContext有毛关系啊?难不成是这个shiro的securityManager还需要web?前天这个念头在我头脑中一闪而过,然后我就否定了,因为是按照教程上来的啊。。。就是这个否定,让我白忙活了两天来解决这个问题。。。

    今天,我梳理了一下认证流程,然后再找问题,然后就又想起先前的念头,真的是两个SecurityManager是不一样的么?好吧,那我就打个log看看,一看,确实不一样,读取ini文件生成SecurityManage Factory,然后生成SecurityManage,类型是:

     org.apache.shiro.mgt.DefaultSecurityManager

    但是呢,我托管给spring容器的类型是

    org.apache.shiro.web.mgt.DefaultWebSecurityManager

    很明显,两个不是一个类型。那是不是这个引起的sessionContext呢?那就试一试,果然是这个影响的。。。。

    呵呵,这样就给我提了一个醒,以后读取本地配置文件没问题的,注入spring容器有问题的,一定要注意这两个类型是不是一致。

    首先先看看类的继承结构

    下面是认证流程

    1.先由用户名和密码生成一个UsernamePasswordToken

    2,由Subject主体通过Login提交token,然后交给DelegatingSubject交给securityManager来执行login这个操作

    3,securityManager有自己的realm,就是在配置文件制定的那个customerealm,所以,这个时候就有securityManager将这个操作交给customerealm来执行

    4,一切都认证通过后,会生成一个subject,如果没有认证成功,值直接抛出异常,我们根据异常来判断是异常类别,一般都设置为用户名或者密码错误

    比较详细的认证流程

  • 相关阅读:
    Java8 Stream源码精讲(三):中间操作原理详解
    【高并发】高并发环境下如何优化Tomcat性能?看完我懂了!
    九种跨域方式实现原理(完整版)
    Nginx一网打尽:动静分离、压缩、缓存、黑白名单、跨域、高可用、性能优化...想要的这都有!
    Java8 Stream源码精讲(四):一文说透四种终止操作
    Java8 Stream源码精讲(二):Stream创建原理深度解析
    【Java】几种典型的内存溢出案例,都在这儿了!
    面渣逆袭:MySQL六十六问,两万字+五十图详解!
    【如何亮剑】用例子讲解Stream
    一文带你搞懂 JWT 常见概念 & 优缺点
  • 原文地址:https://www.cnblogs.com/ningheshutong/p/6478080.html
Copyright © 2020-2023  润新知