【问题标题】:More than one user in the same Controller Spring MVC同一个控制器 Spring MVC 中的多个用户
【发布时间】:2013-04-05 14:11:06
【问题描述】:

我开始为 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 会为每个用户创建一个控制器吗?这样我就没有问题了,我想。但如果不是,我必须重新考虑这个实现,不是吗?

【问题讨论】:

    标签: java tomcat spring-mvc web controller


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 谢谢!这是最完整的答案!
      【解决方案3】:

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

      【讨论】:

      • 我不同意:Spring 控制器可能有实例变量。例如,如果您想使用另一个 Spring bean,您希望 Spring 容器为您注入该 bean。如果 bean 作为实例变量存在于控制器中,这是最容易实现的。唯一的问题是,您的控制器上不应该有实例变量表示状态
      • @mthmulders 谢谢你,我的意思是……我会更新我的答案以更清楚地说明这一点!
      猜你喜欢
      • 1970-01-01
      • 2011-04-23
      • 2016-07-04
      • 2011-08-26
      • 1970-01-01
      • 1970-01-01
      • 2011-10-20
      • 1970-01-01
      • 2021-07-26
      相关资源
      最近更新 更多