spring线程池中 SecurityUtils.getSubject().getSession() 会创建新的session

奥神Well 发布于 2017/12/12 11:36
阅读 3K+
收藏 0

功能:用户登录成功后,通过

SecurityUtils.getSubject().getSession().setAttribute("user",userTo);

设置shiro的session,开启一个线程加载列表,在列表中获取session

SecurityUtils.getSubject().getSession().getAttribute("user");

获取到的就是一个新的session,不是之前的session

加载中
0
依然菜刀
依然菜刀

静态方法获取session是通过ThreadLocal实现的,所以,你需要改一种实现思路。

比如,在往线程池提交任务之前,就先获取当前的session,然后将其set为Task类的一个属性,然后当Task被线程池执行的时候,直接通过get方法得到对应的session,然后setAttribute就没有问题啦。

奥神Well
奥神Well
嗯,通过构造函数传参。
0
红薯官方
红薯官方

都是基于线程上下文的用户Session,需要用Shiro的API来启动新的线程,这样才能传递Session绑定。

http://shiro.apache.org/static/1.2.3/apidocs/

红薯官方
红薯官方
好蛋疼吧,嘿嘿。
0
奥神Well
奥神Well

@蓝水晶飞机 那为什么我使用java的线程池就没有问题,用spring的线程池就有问题

java线程池,在代码里面直接使用:

Executors.newCachedThreadPool()

spring线程池,在xml文件中的配置,通过@Autowired使用:

<!-- 配置spring线程池 -->
	<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor" scope="singleton">
        <!-- 线程池维护线程的最少数量 -->
        <property name="corePoolSize" value="5" />
        <!-- 允许的空闲时间 -->
        <property name="keepAliveSeconds" value="200" />
        <!-- 线程池维护线程的最大数量 -->
        <property name="maxPoolSize" value="10" />
        <!-- 缓存队列 -->
        <property name="queueCapacity" value="20" />
        <!-- 对拒绝task的处理策略 -->
        <property name="rejectedExecutionHandler">
            <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />
        </property>
    </bean>

 

奥神Well
奥神Well
回复 @蓝水晶飞机 : 嗯,通过构造函数传参
红薯官方
红薯官方
这个我不懂为什么了,我没用过这东西。不过能不能改一下设计,提交异步作业时,将用户信息传递到Job里面。
0
Guest_Main
Guest_Main
session信息存储到threadlocal里了,你另起线程当然取不到
奥神Well
奥神Well
我用java的连接池就没有问题,用spring的连接池就有问题
奥神Well
奥神Well
应该如何解决?
返回顶部
顶部