shiro中 UnknownAccountException
一 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的更多相关文章
- Shiro中的授权问题(二)
上篇博客(Shiro中的授权问题 )我们介绍了Shiro中最最基本的授权问题,以及常见的权限字符的匹配问题.但是这里边还有许多细节需要我们继续介绍,本节我们就来看看Shiro中授权的一些细节问题. 验 ...
- Shiro中Realm
6.1 Realm [2.5 Realm]及[3.5 Authorizer]部分都已经详细介绍过Realm了,接下来再来看一下一般真实环境下的Realm如何实现. 1.定义实体及关系 即用户-角色 ...
- 从零到实现Shiro中Authorization和Authentication的缓存
本文大纲 一.简介 二.缓存的概念 三.自定义实现缓存机制 四.什么是Ehcache 五.Ehcache怎么用 六.Spring对缓存的支持 七.Spring+Ehcache实现 八.Spring+S ...
- shiro中CacheManager相关的类结构介绍,提供redis Cache实现
cacheManager主要用于对shiro中的session.realm中的认证信息.授权信息进行缓存. 1.类结构 2.接口及类介绍 CacheManager 提供根据名字获取cache的作用. ...
- Shiro中的授权问题
在初识Shiro一文中,我们对Shiro的基本使用已经做了简单的介绍,不懂的小伙伴们可以先阅读上文,今天我们就来看看Shiro中的授权问题. Shiro中的授权,大体上可以分为两大类,一类是隐式角色, ...
- Shiro中的Rememberme后出现浏览器500错误
问题详述:在Shiro中添加Remember me功能后,只要勾选Remember me选项为true的时候,浏览器就会跳转到一个不可达页面,并且在Chrome中显示HTTP 500错误. 问题追踪: ...
- shiro中自定义realm实现md5散列算法加密的模拟
shiro中自定义realm实现md5散列算法加密的模拟.首先:我这里是做了一下shiro 自定义realm散列模拟,并没有真正链接数据库,因为那样东西就更多了,相信学到shiro的人对连接数据库的一 ...
- 学习Spring Boot:(十九)Shiro 中使用缓存
前言 在 shiro 中每次去拦截请求进行权限认证的时候,都会去数据库查询该用户的所有权限信息, 这个时候就是有一个问题了,因为用户的权限信息在短时间内是不可变的,每次查询出来的数据其实都是重复数据, ...
- shiro中部分SpringCache失效问题
原文:https://www.cnblogs.com/liruiloveparents/p/9392159.html shiro中部分SpringCache失效问题 1.问题抛出 今天在做Spri ...
随机推荐
- 矩阵取数游戏洛谷p1005
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...
- POJ3191-The Moronic Cowmpouter
The Moronic Cowmpouter Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4006 Accepted: ...
- 深入理解java虚拟机_第三章(上)----->垃圾收集器与内存分配策略
1. 前言 这一版块内容比较多,分为两篇文章来做笔记.本文讲述上半部分垃圾收集部分;下一篇文章写内存分配部分. 概述 对象已死吗? 引用技术算法 可达性分析算法 再谈引用 两次标记 回收方法区 2. ...
- UWP 使用OneDrive云存储2.x api(一)【全网首发】
最近开发人脸识别UWP[微识别 / Werecognition]用到了OneDrive开发,下面把来龙去脉讲一下. 下载地址 https://www.microsoft.com/store/produ ...
- 两个实用linux小工具
使用 sshpass 工具来做名密码输入 使用 alias 别名来做成命令语句. Linux命令之非交互SSH密码验证-sshpass ssh登陆不能在命令行中指定密码.sshpass的出现,解决了这 ...
- Python中创建ndarrary的20中方法
本文完整示例:完整示例代码 本文介绍了基础的.常用的创建ndarrary的多种方法,附带示例代码. 一.通过ndarray创建 import numpy as np 1.1 一维数组 a = np.a ...
- springboot+thymeleaf(2)
操作步骤 (1)在pom.xml中引入thymeleaf; (2)如何关闭thymeleaf缓存 (3)编写模板文件.html (4)编写访问模板文件controller 1.在pom.xml中引入t ...
- Spring的Bean内部方法调用无法使用AOP切面(CacheAble注解失效)
Spring的Bean内部方法调用无法使用AOP切面(CacheAble注解失效) 前言 今天在使用Spring cache的Cacheable注解的过程中遇见了一个Cacheable注解失效的问题, ...
- Xcode 7.0 官方免费的真机开发
Xcode 7.0 官方免费的真机开发 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转 ...
- 【SqlServer系列】JSON数据
1 概述 本文将结合MSDN简要概述JSON数据. 2 具体内容 JSON 是一种流行的数据格式,用于在现代 Web 和移动应用程序中交换数据. JSON 还可用于在 Microsoft Az ...