一 shiro的session、request和response与服务端容器自身的这三个对象的关系

在web.xml中配置了一个Filter,拦截/*,所有的uri。在拦截器中还会调用ShiroFilter这个filter,如下图1,可以看出ShiroFilter继承AbstractShiroFilter,查看AbstractShiroFilter源码的doFilterInternal方法,(可以看上一篇shiro中关于这个方法的作用)。在这个方法中如图2,  protected ServletRequest prepareServletRequest(ServletRequest request, ServletResponse response, FilterChain chain) ,protected ServletResponse wrapServletResponse(HttpServletResponse orig, ShiroHttpServletRequest request) 会调用这两个方法。如图3所示,到这里可以看出AbstractShiroFilter会将容器的这三个内置对象包装成shiro的对应对象,这里实际是用到了装饰者模式。所以在web环境shiro本身并没有新建自己的域对象,而是将原生的对象包装了一下。

图1:

图2:

图3:

二 在项目中踩过的一个坑

需求是这样的:当用户的关联的某个内容在后台cms系统中审核通过后,此后这个用户在第一次登录后要提醒这个用户。开发人员写了一个接口afterLogin,获取是否已经提醒过。前端人员就在项目的header.jsp中直接调用了这个接口,head.jsp是全局共享的页面头,由于afterLogin 是要在登录后才可以访问的。所以在未登录的情况下访问这个接口会重定向调用login接口,如下图4;由于是ajax请求,这将导致浏览器地址不会改变。所以界面没反应。但是login接口的头信息中Set-Cookie sid=deleteMe,这表示在后端清除了session并通知浏览器清除这个cookie,这将导致再次请求服务端时候将不带sid信息,如图6,请求request headers中没有带上sid,后端会新建一个session了。  坑:在找回密码页面,由于引用了header.jsp并且未登录,这个页面要输入图片验证码,由于请求了afterLogin接口,后端与验证码绑定的session被清除了,在输入验证码校验时如图6,没有带上sid,并且此时这个session已经不存在了,所以在Jcapthca中会抛出空指针,是因为新建的session中没有验证码,报错如图7。有的地方请求后后端会报错UnknownAccountException session异常,这个也是由于afterLogin引起的,因为这些请求带上了sid,但是这个sid对应的session已经不存在了,所以报错UnknownAccountException 。总的来说浏览器请求login页面地址,服务端会清除已经存在的session,这是因为要在登录后建立一个新的session。若请求仍然带上上一个已经不存在的session的sid 的话,就会出现UnknownAccountException 异常了。

图4:

图5:

图6:

图7:

三 JESSIONID和sid关系

由于ShiroFilter将容器的request等都包装成shiro的对应对象了,所以在后端代码中获取到的都是shiro中的对象,所以JSESSIONID实际上并没有用到,request.getSession都是通过sid标识来获取的。

shiro中 UnknownAccountException的更多相关文章

  1. Shiro中的授权问题(二)

    上篇博客(Shiro中的授权问题 )我们介绍了Shiro中最最基本的授权问题,以及常见的权限字符的匹配问题.但是这里边还有许多细节需要我们继续介绍,本节我们就来看看Shiro中授权的一些细节问题. 验 ...

  2. Shiro中Realm

    6.1 Realm [2.5 Realm]及[3.5 Authorizer]部分都已经详细介绍过Realm了,接下来再来看一下一般真实环境下的Realm如何实现. 1.定义实体及关系   即用户-角色 ...

  3. 从零到实现Shiro中Authorization和Authentication的缓存

    本文大纲 一.简介 二.缓存的概念 三.自定义实现缓存机制 四.什么是Ehcache 五.Ehcache怎么用 六.Spring对缓存的支持 七.Spring+Ehcache实现 八.Spring+S ...

  4. shiro中CacheManager相关的类结构介绍,提供redis Cache实现

    cacheManager主要用于对shiro中的session.realm中的认证信息.授权信息进行缓存. 1.类结构 2.接口及类介绍 CacheManager 提供根据名字获取cache的作用. ...

  5. Shiro中的授权问题

    在初识Shiro一文中,我们对Shiro的基本使用已经做了简单的介绍,不懂的小伙伴们可以先阅读上文,今天我们就来看看Shiro中的授权问题. Shiro中的授权,大体上可以分为两大类,一类是隐式角色, ...

  6. Shiro中的Rememberme后出现浏览器500错误

    问题详述:在Shiro中添加Remember me功能后,只要勾选Remember me选项为true的时候,浏览器就会跳转到一个不可达页面,并且在Chrome中显示HTTP 500错误. 问题追踪: ...

  7. shiro中自定义realm实现md5散列算法加密的模拟

    shiro中自定义realm实现md5散列算法加密的模拟.首先:我这里是做了一下shiro 自定义realm散列模拟,并没有真正链接数据库,因为那样东西就更多了,相信学到shiro的人对连接数据库的一 ...

  8. 学习Spring Boot:(十九)Shiro 中使用缓存

    前言 在 shiro 中每次去拦截请求进行权限认证的时候,都会去数据库查询该用户的所有权限信息, 这个时候就是有一个问题了,因为用户的权限信息在短时间内是不可变的,每次查询出来的数据其实都是重复数据, ...

  9. shiro中部分SpringCache失效问题

    原文:https://www.cnblogs.com/liruiloveparents/p/9392159.html shiro中部分SpringCache失效问题   1.问题抛出 今天在做Spri ...

随机推荐

  1. GO学习——安装编译(1)

    学习网站列表: Golang官网:https://golang.org/ Golang标准库文档:https://golang.org/pkg Golang中文标准库文档:https://studyg ...

  2. 这是一篇关于:以时间表的形式来介绍Java如何演变至今,以及Java版本的一些特性的分享

    这是一篇关于:以时间表的形式来介绍Java如何演变至今,以及Java版本的一些特性的分享: Java版本,功能和历史 原文[英]:https://javapapers.com/core-java/ja ...

  3. tensorflow入门教程

    人工智能感觉很神秘,作为google公司力推的人工智能框架tensorflow也受到很多人的关注.本文用一个最简单的例子,带领大家看看tensorflow是如何工作的.如果你对人工智能的原理不了解可以 ...

  4. Linux基础学习笔记以及常用命令

    1.windows自带命令进入mysql所在磁盘   2.进入mysql安装目录的bin文件 D:\>cd D:\Program Files (x86)\mysql-5.5.25-winx64\ ...

  5. mongoDB之数据库操作

    mongoDB中的数据库操作 查看数据库名称: db 查看所有数据库: show dbs 切换数据库: use 数据库名称 注意:如果数据库不存在,则指向数据库,但不会创建.直到插入数据或者是创建集合 ...

  6. 函数的作用域与this指向 --- 性能篇

    紧接上一篇博文:js函数的作用域与this指向 先来说说this的作用于链,this后的属性或者方法在使用时是先从本实例中查找,如果找到就先返回,如果没找到就接着向上从原型链中查找,如果有多重继承关系 ...

  7. sphinx+reStructuredText制作文档

    1 spinx简介 Sphinx 是一种文档工具,它可以令人轻松的撰写出清晰且优美的文档, 由 Georg Brandl 在BSD 许可证下开发. 新版的Python文档 就是由Sphinx生成的,并 ...

  8. ES5继承

    原型继承 <script type="text/javascript"> function Father(){}//构造函数 //原型属性 Father.prototy ...

  9. ASP.NET Core 使用 Hangfire 定时任务

    定时任务组件,除了 Hangfire 外,还有一个 Quarz.NET,不过 Hangfire .NET Core 支持的会更好些. ASP.NET Core 使用 Hangfire 很简单,首先,N ...

  10. 【quickhybrid】架构一个Hybrid框架

    前言 虽然说本系列中架构篇是第一章,但实际过程中是在慢慢演化的第二版中才有这个概念, 经过不断的迭代,演化才逐步稳定 明确目标 首先明确需要做成一个什么样的框架? 大致就是: 一套API规范(统一An ...