0

我开始为 Web 开发,我使用 Spring MVC 作为我的服务器框架。现在我想知道在 Controller 类中创建变量。我必须这样做来管理服务器中的一些数据,但现在我担心以下情况:如果我有多个用户同时向同一个页面发送信息,一个用户是否会干扰另一个用户变量?

这是一些代码示例:

@Controller
public Class myController {

    int number;


    @RequestMapping("/userInformation")
    public String getInformation(int info) {
       number = info;
    }

    public void doSomethingWithIt() {
       number = number + 1;
   }

}

在这种情况下,如果我有多个用户同时向 /userInformation 发送数据,Spring MVC 会为每个用户创建一个控制器吗?这样我就没有问题了,我想。但如果不是,我必须重新考虑这个实现,不是吗?

4

3 回答 3

3

你说的对。控制器是单例的,必须是无状态的。服务器端状态属于会话或数据存储。您还可以使用请求范围对象(查看 spring 中的 bean 范围)。

于 2013-04-05T14:14:01.987 回答
1

Spring 容器将创建一个 Controller 实例。所以所有用户都将共享该实例。

如果您有用户私有的数据,您有多种选择:

  1. 将其存储在 HTTP 会话中(如果数据量很大,则不推荐,因为您的内存使用量可能会爆炸)
  2. 将其存储在数据库中,并根据标识用户的某些属性在每次请求时检索它
  3. 将其存储在内存缓存中,并根据标识用户的某些属性在每次请求时检索它

选项 3 是其中最简单的一个,如果您愿意,您甚至可以将其作为Map<User, UserData>实例变量实现Controller。它不是最干净、最漂亮或最安全的选择,只是最简单的。

于 2013-04-05T14:15:59.570 回答
0

您不应在 Spring Controller 中使用任何表示控制器类状态的实例变量。它不应该有状态,因为它的单一实例。相反,您可以引用注入的托管 bean。

于 2013-04-05T14:15:13.490 回答