喂
我找到了一些代码,允许通过覆盖代码spring events
以async
方式使用ApplicationEventMulticaster
,因此每个listener
将在自己的线程中运行。 example code here
我的问题是:
安全上下文是否与publisher thread
相同?或者我必须将user logged id
传递给每个publisher
谢谢,
橡树
浏览文档:
某些应用程序并不完全适合使用ThreadLocal,因为它们使用线程的特定方式。例如,Swing客户端可能希望Java虚拟机中的所有线程都使用相同的安全上下文。 SecurityContextHolder可以在启动时配置策略,以指定您希望如何存储上下文。对于独立应用程序,您将使用SecurityContextHolder.MODE_GLOBAL策略。其他应用程序可能希望安全线程生成的线程也采用相同的安全标识。这是通过使用SecurityContextHolder.MODE_INHERITABLETHREADLOCAL实现的。您可以通过两种方式从默认的SecurityContextHolder.MODE_THREADLOCAL更改模式。第一个是设置系统属性,第二个是在SecurityContextHolder上调用静态方法。大多数应用程序不需要更改默认值,但如果这样做,请查看JavaDocs for SecurityContextHolder以了解更多信息。
所以看来如果设置好了
SecurityContextHolder.MODE_INHERITABLETHREADLOCAL
应该有效
我的问题是:有没有人有这种配置的经验?
答案 0 :(得分:0)
在https://stackoverflow.com/a/3468965/1211174
组合doc
和 @viator 备注中的question
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" p:targetClass="org.springframework.security.core.context.SecurityContextHolder"
p:targetMethod="setStrategyName" p:arguments="MODE_INHERITABLETHREADLOCAL" />
<bean id="applicationEventMulticaster"
class="org.springframework.context.event.SimpleApplicationEventMulticaster">
<property name="taskExecutor">
<bean class="org.springframework.core.task.SimpleAsyncTaskExecutor">
</bean>
</property>
</bean>