一 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. Java编程学习技巧和方法总结

    干货:必须要有反馈,不断调整,多读书,多些笔记. 解释:不练习你以为你能掌握?笑话,只有自己根据一个个小目标不断的敲,运行,给予你反馈,这样才会真的进步. 纸上谈Java,是永远停止在口.   关于笔 ...

  2. .9-浅析webpack源码之NodeEnvironmentPlugin模块总览

    介绍Compiler的构造比较无趣,不如先过后面的,在用到compiler的时候再做讲解. 这一节主要讲这行代码: // 不管这里 compiler = new Compiler(); compile ...

  3. js作用域与执行环境(前端基础系列)

    一.作用域(what?) 官方解释是:"一段程序代码中所用到的名字并不总是有效/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域." 单从文字理解比较难懂,举个栗子: ...

  4. Selenium中如何使用xpath更快定位

    在学习Selenium路上,踩了也不少坑,这是我最近才发现的一个新写法,好吧,"才发现"又说明我做其他事了.对的,我现在还在加班! 开车~~~ 例子:知乎网 标签:Python3. ...

  5. Python--Pycharm backup_ver1.py 控制台一直Backup FAILED

    1.windows不自带zip,需自行安装,http://gnuwin32.sourceforge.net/packages/zip.htm 2.安装后,要配置环境变量:PATH 3.简明Python ...

  6. Docker 运行Tensorboard 和 jupyter的正确方法

    Docker 运行Tensorboard 和 jupyter的正确方法 网上找了很多方法都是jupyter 运行正常但不知道如何打开Tensorboard.折腾了很久,实验很多中方法最终找到了一个正确 ...

  7. Oracle442个应用场景-----------角色管理

    --------------------------------角色管理------------------------------------ 一.角色的概念和特性 1.什么是角色? 角色就是相关权 ...

  8. Android长按事件和点击事件问题处理,OnItemLongClickListener和OnItemClickListener冲突问题

    今天在做demo时,须要设置ListView的item的长按和点击事件.OnItemLongClickListener和OnItemClickListener,然而点击事件能够实现,可是在长按操作时会 ...

  9. vue-router实例

    最近刚刚用vue写了个公司项目,使用vue-cli构建的,算是中大型项目吧,然后这里想记录并且分享一下其中的知识点,希望对大家有帮助,后期会逐渐分享:话不多说,直接上代码!! main.js // T ...

  10. Fiddler使用总结一(使用Fiddler捕获手机所有http/https通信)

    与后端数据通信是前端日常开发的重要一环,在与后端接口联调的时候往往需要通过查看后端返回的数据进行调试.如果在PC端,Chrome自带的DevTools就已经足够用了,Network面板可以记录所有网络 ...