shiro中部分SpringCache失效问题
原文:https://www.cnblogs.com/liruiloveparents/p/9392159.html
shiro中部分SpringCache失效问题
1、问题抛出
今天在做Springboot和shiro集成时,发现一个严重的问题。部分service的缓存和事务失效,debug代码时,发现这些有问题的service实例都不是代理生成的,所以事务和缓存就失效了(事务和缓存依赖代理类实现)。继续查问题,发现这些有问题的service全部被shiro的realm所依赖,所以怀疑是shiro影响了
所以做一下测试:
shiro中用到的ResourceService
public class LocalRealmService extends RealmService {
@Autowired
private ResourceService resourceService;
...
}
controller也调用ResourceService
@RestController
@RequestMapping(value = "/test")
public class CacheController {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private ResourceService resourceService;
}
结果发现resourceService的实例如图:
发现问题:resourceService的实例不是代理即缓存注解和事务全部生效(缓存和事务都是代理完成的)
当我把resourceService从realm依赖中删除时,在controller引用时resourceService的实例就是“代理”即缓存和事务生效
结论:只要被shiro的realm所依赖的service,代理会全部失效(暂时没撸源码,还不知原理,知道的童鞋可以说下,谢了)
2、解决的方案
常用的解决方式有三种:
第一种:这是网上比较多的
就是realm中不要依赖service,依赖dao
第二种:在依赖的service上添加@Lazy注解
延迟加载,就是在实例化shiro的realm时,不去实例化service的bean,等到用的时候再从spring容器中去取对应的Bean
public class LocalRealmService extends RealmService {
@Lazy
@Autowired
private ResourceService resourceService;
...
}
这种解决方案让我感觉到:这里是不是存在多个上下文,或者不是spring?这里有待后续考证。。。
第三种:shiro在实例化securityManager时,先不设置realm,等到容器加载完再设置
这种方式与第二种类似,只不过无需在每个service属性上增加@Lazy注解
SecurityMangaerd的实例化
/**
* 注释掉realm
*/
@Bean("securityManager")
public DefaultWebSecurityManager securityManager(/*@Qualifier("realm") BootRealm BootRealm,*/
SessionManager sessionManager,
CacheManager shiroCacheManager) {
DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
//注释掉
//manager.setRealm(hyBootRealm);
}
容器加载完设置realm:这里有多重方案,主要列举两种
I、利用spring监听
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
@Component
public class ShiroRealmListener implements ApplicationListener {
@Autowired
private DefaultWebSecurityManager securityManager;
@Autowired
private HyBootRealm realm;
@Override
public void onApplicationEvent(ApplicationEvent event) {
securityManager.setRealm(realm);
}
}
II、利用springboot的ApplicationRunner
import com.chyjr.hyboot.security.shiro.realm.HyBootRealm;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
public class ShiroRealmRunner implements ApplicationRunner {
@Autowired
private DefaultWebSecurityManager securityManager;
@Autowired
private HyBootRealm realm;
@Override
public void run(ApplicationArguments args) throws Exception {
securityManager.setRealm(realm);
}
}
注意:ShiroRealmRunner必须是spring的Bean,所以在配置管理类中要添加:
@Bean
public ShiroRealmRunner shiroRealmRunner(){
return new ShiroRealmRunner();
}
shiro中部分SpringCache失效问题的更多相关文章
- 从零到实现Shiro中Authorization和Authentication的缓存
本文大纲 一.简介 二.缓存的概念 三.自定义实现缓存机制 四.什么是Ehcache 五.Ehcache怎么用 六.Spring对缓存的支持 七.Spring+Ehcache实现 八.Spring+S ...
- jquery中Live方法不可用,Jquery中Live方法失效
jquery中Live方法不可用,Jquery中Live方法失效 >>>>>>>>>>>>>>>>> ...
- shiro中 UnknownAccountException
一 shiro的session.request和response与服务端容器自身的这三个对象的关系 在web.xml中配置了一个Filter,拦截/*,所有的uri.在拦截器中还会调用ShiroFil ...
- shiro中CacheManager相关的类结构介绍,提供redis Cache实现
cacheManager主要用于对shiro中的session.realm中的认证信息.授权信息进行缓存. 1.类结构 2.接口及类介绍 CacheManager 提供根据名字获取cache的作用. ...
- j2ee5.0开发中jstl标签失效
尝试了下,对于Weblogic中的出现的错误,也是有效的! j2ee5.0开发中jstl标签失效 原因不详, 解决办法, 一:将.web.xml中 <web-app version=&quo ...
- Shiro中的授权问题(二)
上篇博客(Shiro中的授权问题 )我们介绍了Shiro中最最基本的授权问题,以及常见的权限字符的匹配问题.但是这里边还有许多细节需要我们继续介绍,本节我们就来看看Shiro中授权的一些细节问题. 验 ...
- Shiro中的授权问题
在初识Shiro一文中,我们对Shiro的基本使用已经做了简单的介绍,不懂的小伙伴们可以先阅读上文,今天我们就来看看Shiro中的授权问题. Shiro中的授权,大体上可以分为两大类,一类是隐式角色, ...
- Spring,SpringMvc配置常见的坑,注解的使用注意事项,applicationContext.xml和spring.mvc.xml配置注意事项,spring中的事务失效,事务不回滚原因
1.Spring中的applicationContext.xml配置错误导致的异常 异常信息: org.apache.ibatis.binding.BindingException: Invalid ...
- Shiro中的Rememberme后出现浏览器500错误
问题详述:在Shiro中添加Remember me功能后,只要勾选Remember me选项为true的时候,浏览器就会跳转到一个不可达页面,并且在Chrome中显示HTTP 500错误. 问题追踪: ...
随机推荐
- python-unittest学习
在说unittest之前,先说几个概念: TestCase 也就是测试用例 TestSuite 多个测试用例集合在一起,就是TestSuite TestLoader是用来加载TestCase到Test ...
- entos 7 mailx配置163邮箱发送邮件
配置: .com .com set smtp-auth-user=wcczcl set smtp-auth=login set smtp-use-starttls set ssl-verify=ign ...
- IOS-优质应用推荐
壁纸应用 cuto 免费 点击下载 shots 收费 点击下载 Cutisan 锁屏壁纸制作下载地址 待办事项 TodayMind - 提醒事项触手可及 点击下载 滴答清单 点击下载 Microsof ...
- 转载:C++ typename的起源与用法
转载:http://feihu.me/blog/2014/the-origin-and-usage-of-typename/#typename 侯捷在Effective C++的中文版译序中提到: C ...
- 关于ZIP自动打包的进一步进化思路
http://blog.163.com/long200259@126/blog/static/11288755920093120529157/
- bzoj 4518
4518 思路: 斜率优化: 代码: #include <cstdio> #include <cstring> #include <iostream> #inclu ...
- c++ primer 9 顺序容器
定义: #include <vector> #include <list> #include <deque> vector<int> svec; lis ...
- [实战]MVC5+EF6+MySql企业网盘实战(8)——文件下载、删除
写在前面 上篇文章通过iframe实现了文件的无刷新上传.这篇我们将实现文件的下载与删除. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6+MySq ...
- vue配置二级目录&vue-axios跨域办法&谷歌浏览器设置跨域
一.根据官方建议,dist打包的项目文件放在服务器根目录下,但是很多时候,我们并不能这样做,当涉及到二级目录设置多层深埋的时候,就需要在webpack配置文件里去设置一下了. 在webpack.con ...
- Windows下配置Apache服务器
第一步:下载最新Apache. 下载网址:http://www.apachehaus.com/cgi-bin/download.plx 第二步:把下载文件解压缩到一个工作目录.D:\Apache 第三 ...