我正在使用spring security。我想知道是否在我设置的过滤器中
php
对于那个在该实例中假设100个api调用的特定用户,每个调用securitycontextholder的身份验证是否都为空?
答案 0 :(得分:2)
默认情况下,SecurityContextHolder是线程安全的。因此,使用此语句SecurityContextHolder.getcontext().setAuthentication(null)
实际上将基于每个线程取消设置身份验证。
答案 1 :(得分:1)
如果您看到SecurityContextHolder.getcontext()
的实现,您会发现getContext()
实际上正在返回一个线程安全对象:
final class ThreadLocalSecurityContextHolderStrategy implements
SecurityContextHolderStrategy {
// ~ Static fields/initializers
// =====================================================================================
//.....
private static final ThreadLocal<SecurityContext> contextHolder = new ThreadLocal<SecurityContext>();
public SecurityContext getContext() {
SecurityContext ctx = contextHolder.get();
if (ctx == null) {
ctx = createEmptyContext();
contextHolder.set(ctx);
}
return ctx;
}
}
正如您在上面的代码中看到的,contextHolder
实际上是ThreadLocal
对象,它们是默认的线程安全变量。
因此,使用SecurityContextHolder.getcontext().setAuthentication(null)
更改值不会影响其他线程的身份验证对象(注意:每个和每个Web请求都由不同的线程处理)。