Vaadin UI - 不能为每个客户端使用静态字段

Vaadin UI - cannot use static fields for every client

我正在创建一个网络应用程序。

我有一个扩展 UI.

MyUI
    public class MyUI extends UI {

        public static Authentication AUTH;

        @Override
        protected void init(VaadinRequest vaadinRequest) {

            AUTH = new Authentication();

            updateContent();

        }

//other methods

    }

Authentication() 我有用户登录。当我注销时,该用户设置为 null.

我注意到当我从两个设备访问服务器时,所以当我应该有两个连接到服务器时,当有人注销时,另一个也被注销了。

在身份验证class中有这个方法:

public void doLogout() {
    System.out.println("User: " + this.user.getMail() + " has logged out.");
    this.user = null;
}

我在 user.getMail() 中遇到错误,因为当我尝试从其他帐户注销时,用户已设置为 null

com.vaadin.ui.UI是独一无二的吗?如何在 Vaadin 中处理不同的连接?

Java,一般

这里是基础Java,与Vaadin无关……

关键字static表示one value per class,也称为“class变量”,通常称为“全局变量”。不是面向对象的。一般来说,您应该尽量减少静态的使用。

省略那个关键字意味着“这个class的每个实例一个值”,一个实例变量也称为成员变量。这是面向对象的。

我建议您在开始 Vaadin 项目之前学习更多 Java 的基础知识。并学习 Java Servlet 技术如何工作的基础知识,也许阅读 O'Reilly 出版的关于 Servlet 的 Head First 书(现在已经过时,但基础知识是相同的)。您还需要了解线程和并发问题等高级主题,因为 Vaadin 等 Servlet 环境本质上是多线程的。最后,阅读 Goetz 的 Java Concurrency In Practice 一书。

特别是 Vaadin

要存储 Vaadin 应用程序的每个用户的值,请使用会话属性。这是一个键值存储,您可以在其中通过指定键("attribute" 的名称)插入和检索值。作为 Java Servlet 技术的一部分,会话会在用户首次连接时自动为您实例化。

或者,您可以将 UI class 上每个用户的值存储为实例变量。每个 Vaadin 用户在第一次连接时都以一个 UI 实例开始。但请注意:您可以在 Vaadin 8 应用程序中打开多个网络浏览器 tabs/windows,每个浏览器都有自己的 UI 实例。因此,要在这些多个 UI 对象之间共享数据,请使用会话属性。

请注意,虽然每个 Vaadin 应用至少定义了一个 UI subclass,但您也可以定义额外的 UI subclass,对于那些额外的上面提到的浏览器 tabs/windows 显示不同的内容。

也许你应该在这里使用会话属性而不是静态变量(更新为更通用):

    UI.getCurrent().getSession().setAttribute("AUTH", AUTH);
    Authentication auth2 = UI.getCurrent().getSession().getAttribute("AUTH");

所以使用 VaadinSession 来存储会话特定数据。