在servlet中使用全局变量?

时间:2013-06-06 07:56:05

标签: java jsp java-ee servlets web-applications

我在global variable中有一个名为loginAttempt的{​​{1}}。如果两个servlet class在同一时间点击,global variable将会发生什么?将会发生什么事情是不可预见的事件。

让servlet中的全局变量成为邪恶的吗?

如果我每次都将requestsloginAttempt初始化。

8 个答案:

答案 0 :(得分:4)

  1. 您的变量可由任何其他类读取/写入。你没有控制权来确保他们都能用它做出明智的事情。其中一个可能会覆盖它/错误地增加它等等

  2. 每个JVM是servlet的一个实例。因此,线程可能会尝试同时访问它。因为它是全局的,并且您没有提供任何同步/访问控制,所以它不是线程安全的。此外,如果您在某种具有不同JVM的集群中运行servlet,那么它们之间不会共享该变量,并且您将拥有多个loginAttempt变量。

  3. 如果 将它包含在servlet中,请将其设置为静态但不要公开。提供getter / setter来访问和更新它。了解线程安全编程,以便多线程可以更新它并安全地读取它。

    好多了,将它存储在servlet-context中。这应该是存储这样的servlet范围数据的地方。

答案 1 :(得分:2)

只要您了解通常只创建一个servlet实例并且该servlet的所有客户端将共享全局变量(即每个请求,同时在不同的线程上),它们就不是邪恶的并且由多个用户同时进行。

我猜你的全局变量loginAttempt正在计算登录尝试的次数,只要这是以线程安全的方式完成的,这将是计算对此进行的登录尝试次数的合理方式。 servlet的。这将适用于所有用户。如果您希望每个用户登录尝试,那么您可能需要创建会话并使用会话上下文来存储此类信息。

答案 2 :(得分:1)

在大量的并发访问中,你可能要注意Servlet的线程安全问题......你可以尝试以下方法来避免这个问题......

1,

public class loginAttempt extends HttpServlet implements SingleThreadModel {
...
}

2, 第二种方法: 使用synchronized关键字

3, 避免使用全局变量

答案 3 :(得分:1)

将其存储为会话属性。否则全局变量概念将完全搞砸你。 使用会话是一个好主意,因为它是  1)如果重新启动Web服务,会话数据不会丢失

2)在负载平衡环境中,会话数据存储在一个中心位置,这意味着任何服务器都可以提供请求并可以访问会话数据。

所以它是可以访问的,但它是隐藏的。

答案 4 :(得分:0)

YES。
全局变量与每个人共享

答案 5 :(得分:0)

这取决于,如果你的变量是只读的,它应该没问题。但在大多数情况下,全局变量都是邪恶的。我不能给你一个解决方案,因为我没有你的代码,但我相信还有另一种方法。

答案 6 :(得分:0)

在你的用例中,它超越了邪恶。 loginAttempt将由访问servlet的所有线程共享

答案 7 :(得分:0)

首先,Java中没有名为global variable的术语。它们被称为类变量或实例变量。

其次,如果您要分配请求或会话范围数据,那么在Servlet中拥有实例变量是不好的做法,因为它将由所有线程共享。

您可以将它用于应用程序范围的值,通常从上下文参数中获取。或者如果数据永远不会像常量那样改变(不可变)。