gpt4 book ai didi

java - Vaadin ThreadLocal 用于用户管理

转载 作者:行者123 更新时间:2023-12-02 02:07:03 25 4
gpt4 key购买 nike

我目前正在用 Java 开发一个 Web 应用程序,该应用程序将由多个用户同时访问,因此需要存储用户数据,以便根据他们的个人需求(例如他们属于哪家公司)定制应用程序ETC)。

我用两个类来管理这个。用户,主系统详细信息如下:

用户

@Entity
public class User implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String firstName;
private String lastName;
private String username;
private String password;
private String type;
private String company;
private String DOB;
private String email;
private int PayrollId;

public User(String firstName, String lastName, String username, String password, String type, String company, String DOB, String email) {
this.firstName = firstName;
this. lastName = lastName;
this.username = username;
this.password = password;
this.type = type;
this.company = company;
this.DOB = DOB;
this.email = email;
}

主系统:

public class MainSystem   {

public UserController userController;
private UserRepository userRepository;
private static ThreadLocal<User> loggedInUser = new ThreadLocal<>();
public DbController dbController;


public MainSystem(){
userController = new UserController(userRepository);
loggedInUser.set(new User());
}

public Boolean Login(String username, String password) {
if(userController.checkUser(username,password)){
User aUser = userController.getUser(username);
setLoggedInUser(userController.getUser(username));
VaadinSession.getCurrent().setAttribute("username",loggedInUser.get().getUsername());
System.out.println("Logged in User: "+loggedInUser.get().getUsername());
return true;
}
else {
return false;
}
}

public static void setLoggedInUser(User user){
loggedInUser.set(user);
}

public static User getLoggedInUser() {
return loggedInUser.get();
}

理想情况下,我想做的是从另一个类访问 ThreadLocal 变量,例如 ViewProfile.View:

public class EditProfileView extends VerticalLayout implements View {

MainSystem main = new MainSystem();
NavigatorUI aUI = new NavigatorUI();
User aUser = main.getLoggedInUser();
TextField username = new TextField("Username");
TextField Id = new TextField("Id");
TextField email = new TextField("Email");
TextField firstName = new TextField("First name");
TextField lastName = new TextField("Last name");
TextField type = new TextField("Type");
PasswordField oldPassword = new PasswordField("Current Password");
PasswordField changePassword1 = new PasswordField("New Password");
PasswordField changePassword2 = new PasswordField("Confirm Password");
private UserController userController;
private UserRepository userRepository;

public EditProfileView() {
setDefaultComponentAlignment(Alignment.MIDDLE_CENTER);
userController = new UserController(userRepository);
setStyleName("backgroundImage");
setMargin(true);
setSizeFull();
addComponent(aUI.getHeader());
FormLayout content = new FormLayout(generateInfo());
Panel aPanel = new Panel("Edit User",content);
aPanel.setWidthUndefined();
content.setMargin(true);
aPanel.setStyleName(ValoTheme.PANEL_WELL);
addComponent(aPanel);
}
@Override
public void enter(ViewChangeListener.ViewChangeEvent event) {
try {
aUser = main.getLoggedInUser();
System.out.println( aUser.getUsername());
Id.setValue(aUser.getId().toString());
username.setValue(aUser.getUsername());
firstName.setValue(aUser.getFirstName());
lastName.setValue(aUser.getLastName());
type.setValue(aUser.getType());
email.setValue(aUser.getEmail());
aUI.setUserMenu();
aUI.refreshPayroll();}
catch (Exception e){
System.out.println(e.getMessage());
}
}}

但是,我发现它向我提供了“null”值?我担心我可能误解了 ThreadLocal 的工作原理。但本质上我想要实现的是在 MainSystem 中存储 User.Class 的实例相关变量以供其他类使用?

如有任何帮助,我们将不胜感激。

我的解决方案:

我的解决方案是将 User.class 存储在 VaadinSession 属性中,如下所示:

public Boolean Login(String username, String password) {
if(userController.checkUser(username,password)){
User aUser = userController.getUser(username);
VaadinSession.getCurrent().setAttribute("user",aUser);
VaadinSession.getCurrent().setAttribute("username",loggedInUser.get().getUsername());
System.out.println("Logged in User: "+loggedInUser.get().getUsername());
return true;
}
else {
return false;
}
}

然后在其他类中,如果我想使用该属性,我会像这样检索它:

@Override
public void enter(ViewChangeListener.ViewChangeEvent event) {
try {
aUser = (User)VaadinSession.getCurrent().getAttribute("user");
}
catch (Exception e){
System.out.println(e.getMessage());
}
}

最佳答案

问题在于,无法保证 MainSystem.Login()EditProfileView.enter() 会发生在同一线程上。每个用户操作都作为单独的 HTTP 请求进行处理,servlet 容器将在任何可用线程上运行。

对于这种功能,我建议将用户信息存储在 HTTP session 中。如果您没有任何自定义 servlet 等,则可以在您自己的自定义 UI 类中使用一个包含用户对象的字段。 Vaadin 负责使 UI.getCurrent() 在通过 Vaadin 运行的所有代码中始终返回正确的值。

如果您还与其他 servlet 功能集成,则可以将用户存储在 HttpSession 中。通用 servlet 代码可以通过 getSession() 方法找到 session ,例如servlet 请求和响应。在 Vaadin 运行的代码中,您可以使用 VaadinSession().getCurrent().getSession() 获取基于相同 HttpSession 的 WrappedSession 实例 数据。

关于java - Vaadin ThreadLocal 用于用户管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50623323/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com