Java 用于用户管理的Vaadin ThreadLocal
我目前正在用Java开发一个web应用程序,它将被多个用户同时访问,因此需要存储用户数据,以便根据他们的个人需求(例如他们所属的公司等)定制应用程序 我使用两个类来管理它。用户,主系统详情如下: 用户Java 用于用户管理的Vaadin ThreadLocal,java,vaadin,thread-local,Java,Vaadin,Thread Local,我目前正在用Java开发一个web应用程序,它将被多个用户同时访问,因此需要存储用户数据,以便根据他们的个人需求(例如他们所属的公司等)定制应用程序 我使用两个类来管理它。用户,主系统详情如下: 用户 @Entity public class User implements Serializable{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private S
@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();
}
然而,我发现它给我提供了一个“null”值?我担心我可能误解了ThreadLocal的工作原理。但本质上,我试图实现的是在main系统中存储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会话中。如果您没有任何自定义servlet之类的,您可以在自己的自定义UI
类中创建一个包含用户对象的字段。Vaadin负责使UI.getCurrent()
始终在通过Vaadin运行的所有代码中返回正确的值
如果还与其他servlet功能集成,则可以将用户存储在
HttpSession
中。通用servlet代码可以通过servlet请求和响应中的getSession()
方法找到会话。在Vaadin运行的代码中,您可以使用VaadinSession().getCurrent().getSession()
来获取一个基于相同HttpSession
数据的WrappedSession
实例。问题是不能保证MainSystem.Login()
和EditProfileView.enter()
将发生在同一线程上。每个用户操作都作为一个单独的HTTP请求处理,servlet容器将在任何可用线程上运行
对于这种功能,我建议将用户信息存储在HTTP会话中。如果您没有任何自定义servlet之类的,您可以在自己的自定义UI
类中创建一个包含用户对象的字段。Vaadin负责使UI.getCurrent()
始终在通过Vaadin运行的所有代码中返回正确的值
如果还与其他servlet功能集成,则可以将用户存储在
HttpSession
中。通用servlet代码可以通过servlet请求和响应中的getSession()
方法找到会话。在Vaadin运行的代码中,您可以使用VaadinSession().getCurrent().getSession()
获取基于相同HttpSession
数据的WrappedSession
实例。还有另一种方法。相反,可以创建@SessionScoped用户服务,或者@Inject或@Autowire,这取决于您使用的是CDI还是Spring。这样做时,bean管理器负责将正确的实体与视图绑定。还有另一种方法。相反,可以创建@SessionScoped用户服务,或者@Inject或@Autowire,这取决于您使用的是CDI还是Spring。这样做时,bean管理器将负责将正确的实体与视图绑定。因此,如果我存储了类似于普通变量的内容,即loggedInUser=setLoggedInUser(userController.getUser(username)),则在UI类中;然后我就可以使用VaadinSession().getCurrent().getLoggedInUser()?实现是什么样子的?如果您向UI
类添加一个实例字段,并为该字段添加一个getter,那么您可以执行类似User loggedInUser=((MyUI)UI.getCurrent()).getLoggedInUser()的操作代码>我要将您的答案标记为正确,它不是我使用的答案,但它确实让我走上了正确的轨道,并且事实上符合标准。因此,在UI类中,如果我存储了类似于普通变量的内容,即loggedInUser=setLoggedInUser(userController.getUser(username));然后我就可以使用VaadinSession().getCurrent().getLoggedInUser()?实现是什么样子的?如果您向UI
类添加一个实例字段,并为该字段添加一个getter,那么您可以执行类似User loggedInUser=((MyUI)UI.getCurrent()).getLoggedInUser()的操作代码>我将把你的答案标记为正确的,它不是我使用的答案,但它确实让我走上了正确的轨道,并且事实上符合标准。
@Override
public void enter(ViewChangeListener.ViewChangeEvent event) {
try {
aUser = (User)VaadinSession.getCurrent().getAttribute("user");
}
catch (Exception e){
System.out.println(e.getMessage());
}
}