spring线程池中 SecurityUtils.getSubject().getSession() 会创建新的session? 400 报错
功能:用户登录成功后,通过
SecurityUtils.getSubject().getSession().setAttribute("user",userTo);
设置shiro的session,开启一个线程加载列表,在列表中获取session
SecurityUtils.getSubject().getSession().getAttribute("user");
获取到的就是一个新的session,不是之前的session
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
静态方法获取session是通过ThreadLocal实现的,所以,你需要改一种实现思路。
比如,在往线程池提交任务之前,就先获取当前的session,然后将其set为Task类的一个属性,然后当Task被线程池执行的时候,直接通过get方法得到对应的session,然后setAttribute就没有问题啦。
######嗯,通过构造函数传参。######都是基于线程上下文的用户Session,需要用Shiro的API来启动新的线程,这样才能传递Session绑定。
http://shiro.apache.org/static/1.2.3/apidocs/
######好蛋疼吧,嘿嘿。######@蓝水晶飞机 那为什么我使用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>
######回复 @蓝水晶飞机 : 嗯,通过构造函数传参######这个我不懂为什么了,我没用过这东西。不过能不能改一下设计,提交异步作业时,将用户信息传递到Job里面。######session信息存储到threadlocal里了,你另起线程当然取不到######我用java的连接池就没有问题,用spring的连接池就有问题######应该如何解决?
评论
全部评论 (0)