开发者社区 问答 正文

spring线程池中 SecurityUtils.getSubject().ge?400报错

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

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

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

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

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

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

展开
收起
爱吃鱼的程序员 2020-06-01 14:28:12 1261 分享
分享
版权
举报
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    静态方法获取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的连接池就有问题######应该如何解决?
    2020-06-01 14:28:13 举报
    赞同 评论

    评论

    全部评论 (0)

    登录后可评论