shiro 和@Scheduled 报错

一小只123 2021-05-14 09:10:53
 @Scheduled(cron = "0 */1 * * * ?")//每隔1分钟执行一次
public void work() {
if (null!=ShiroUtils.getLoginName()){
redisUtil.set(ShiroUtils.getLoginName(), ShiroUtils.getSessionId(),60);
}

}



报的错是
org.apache.shiro.UnavailableSecurityManagerException: No SecurityManager accessible to the calling code, either bound to the org.apache.shiro.util.ThreadContext or as a vm static singleton. This is an invalid application configuration.
at org.apache.shiro.SecurityUtils.getSecurityManager(SecurityUtils.java:123)
at org.apache.shiro.subject.Subject$Builder.<init>(Subject.java:626)
at org.apache.shiro.SecurityUtils.getSubject(SecurityUtils.java:56)
at com.loroi.framework.util.ShiroUtils.getSubject(ShiroUtils.java:25)
at com.loroi.framework.util.ShiroUtils.getSysUser(ShiroUtils.java:41)
at com.loroi.framework.util.ShiroUtils.getLoginName(ShiroUtils.java:74)
at com.loroi.web.controller.system.SysLoginController.work(SysLoginController.java:107)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
请问怎么解决 为什么不可以获取用户人
...全文
218 点赞 收藏 7
写回复
7 条回复
一小只123 05月17日
哦哦哦 好的谢谢
回复 点赞
一小只123 05月14日
在别的地方可以获取得到userId 只有这个定时的获取不到
回复 点赞
=PNZ=BeijingL 05月14日
你查查你的shiro配置吧,是不是丢失了
回复 点赞
=PNZ=BeijingL 05月14日
从你给的异常看,SecurityUtils 没有找到核心组件SecurityManager,

SecurityManager 它负责对所有的subject进行安全管理。本质上是一个单例应用程序,一般情况定义shiro配置的时候会定义实现该接口的Bean. 可以是shiro提供的或者是自定义的

@Configuration
public class ShiroAutoConfiguration {
@Bean
AuthRealm authRealm() {
return new AuthRealm();
}

@Bean
DefaultWebSecurityManager securityManager() {
DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
manager.setRealm(authRealm());
return manager;
}
.......
}
回复 点赞
一小只123 05月14日
唔 好像有点道理 可是还是不知道怎么解决
回复 点赞
RockeyCui 05月14日
没用过 shiro ,不过我猜测 shiro 获取用户信息前提是用户请求执行的代码才会有 session 或者其他信息。你这段代码是系统自动运行的,并不是用户请求,所以估计通过 shiro 是拿不到的
回复 点赞
=PNZ=BeijingL 05月14日
我查了下源码:

SecurityUtils#getSecurityManager 方法是通过ThreadContext.getSecurityManager() 获取,
ThreadContext 是通过线程变量 new InheritableThreadLocalMap<Map<Object, Object>>() 来保存 每个线程的 SecurityManager , 即登录操作的时候put进线程变量,同线程访问的时候直接取到自己线程的SecurityManager 。 所以你通过Spring调度来处理的时候是新创建线程,该线程是没有SecurityManager ,所以报错



//一些源码:
public static SecurityManager getSecurityManager() {
return (SecurityManager) get(SECURITY_MANAGER_KEY);
}


private static Object getValue(Object key) {
Map<Object, Object> perThreadResources = resources.get();
return perThreadResources != null ? perThreadResources.get(key) : null;
}


private static final ThreadLocal<Map<Object, Object>> resources = new InheritableThreadLocalMap<Map<Object, Object>>();
回复 点赞
发动态
发帖子
Java EE
创建于2007-09-28

3.7w+

社区成员

22.5w+

社区内容

J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区公告
暂无公告