@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)
請問怎么解決 為什么不可以獲取用戶人
uj5u.com熱心網友回復:
沒用過 shiro ,不過我猜測 shiro 獲取用戶資訊前提是用戶請求執行的代碼才會有 session 或者其他資訊。你這段代碼是系統自動運行的,并不是用戶請求,所以估計通過 shiro 是拿不到的uj5u.com熱心網友回復:
唔 好像有點道理 可是還是不知道怎么解決
uj5u.com熱心網友回復:
從你給的例外看,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;
}
.......
}
uj5u.com熱心網友回復:
你查查你的shiro配置吧,是不是丟失了uj5u.com熱心網友回復:
在別的地方可以獲取得到userId 只有這個定時的獲取不到uj5u.com熱心網友回復:
我查了下原始碼: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>>();
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/284027.html
標籤:Java EE
上一篇:swagger2