安全上下文持有者线程是否安全

时间:2018-04-23 09:51:52

标签: spring spring-security

我正在使用spring security。我想知道是否在我设置的过滤器中

php

对于那个在该实例中假设100个api调用的特定用户,每个调用securitycontextholder的身份验证是否都为空?

2 个答案:

答案 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请求都由不同的线程处理)。