Spring请求范围内的bean中的静态变量值可以保存会话

时间:2017-03-28 16:16:58

标签: java spring

下面你可以看到Something类,它是一个request范围内的bean,我一直面临着一个问题。 一旦我设置static boolVariable字段,其值就会在会话中存活。

方案: 应用程序中的用户执行将变量设置为true的操作,然后注销,清除每个数据(cookie,缓存...)。当它再次登录到应用程序时,boolVariable仍然是true(他没有再次设置他的值),而我认为它是假的。

引自concretepage

  

在HTTP请求中,请求范围bean中所做的更改不会   影响其他HTTP请求。一旦HTTP请求完成,就可以了   请求scoped bean的实例也被破坏。

以下是Something类:

@Service(value = "Something")
@Scope(value = "request")
public class Something {

    private static boolean boolVariable = false;

    public Something() {
    }

    public static void setBoolVariable(boolean toBeSaved) {
        boolVariable = toBeSaved;
    }

    private boolean isBoolVariable() {
        return boolVariable;
    }

}

您能解释为什么上述行为会发生吗? (当我重新启动服务器时,boolVariable值将恢复为false

1 个答案:

答案 0 :(得分:2)

当类加载到JVM中时,会初始化静态变量。状态是全局的,并且在JVM进程的生命周期内由所有实例共享。这解释了为什么在重新启动JVM时重新初始化静态变量

您的bean是请求作用域。它是根据请求重新创建的bean实例,而不是全局状态(静态变量)。为什么你甚至必须使变量保持静态。这似乎是会话状态(特定于客户端的状态)。当它静止时你也要担心线程安全。

更改为实例变量,以便每个请求的作用域bean都是自己的状态。否则,如果它的共享状态,那么你的bean是单例范围的候选者而不是请求范围

Spring不会以特殊方式处理静态变量。它使用标准Java语义

相关问题