Java 如何在Spring&;中为当前用户保存信息;冬眠?

Java 如何在Spring&;中为当前用户保存信息;冬眠?,java,mysql,spring,hibernate,jsp,Java,Mysql,Spring,Hibernate,Jsp,我有一个User表和一个UserInfo表,用于保存用户的个人信息。我想做的是在登录后添加个人信息。在具有userId列的表之间存在OneToOne关系,因此我将其定义为: 用户信息类: 用户类别: 登录后,我想为当前用户向数据库添加一些用户信息。但我不知道如何在控制器中保存用户信息?我应该像下面这样保存用户对象吗?我已经搜索过了,有一种方法可以获取当前用户的信息: (User)SecurityContextHolder.getContext().getAuthentication().getP

我有一个User表和一个UserInfo表,用于保存用户的个人信息。我想做的是在登录后添加个人信息。在具有userId列的表之间存在OneToOne关系,因此我将其定义为:

用户信息类:

用户类别:

登录后,我想为当前用户向数据库添加一些用户信息。但我不知道如何在控制器中保存用户信息?我应该像下面这样保存用户对象吗?我已经搜索过了,有一种方法可以获取当前用户的信息:

(User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
但当我尝试在控制器中使用它时,它只返回null。如何为登录用户执行此类操作(添加pers.info)

@RequestMapping(value = "/show", method = RequestMethod.POST)
public ModelAndView newUser(ModelMap model, Principal principal) {


    ModelAndView result = new ModelAndView("home");

    User user = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();


    UserInfo userinfo = new UserInfo();

    userinfo.setPlacesVisit(userinfo.getPlacesVisit());
    user.setUserInfo(userinfo);

    userService.save(user);

    String message = "Userinfo was successfully added.";
    result.addObject("message", message);

    return result;

}

您可以使用会话保存会话属性。在spring中,您可以使用

ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
           HttpSession session = attr.getRequest().getSession();

您可以在会话中保存登录的用户:

FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
HttpServletRequest request = (HttpServletRequest) externalContext.getRequest();
request.getSession().setAttribute("key", user);
如果您想获得当前登录的用户,只需:

(User) user = ((HttpServletRequest) request).getSession().getAttribute("key")

这个例子是在JSF中,但我确信在没有JSF的情况下也可以这样做,您可以使用
Principal
参数向用户检索:

public ModelAndView newUser(ModelMap model, Principal principal) {

  User activeUser = (User) ((Authentication) principal).getPrincipal();
}

SecurityContextHolder是Spring Security的一部分。如果要使用此组件,必须为应用程序的登录设置Spring安全性,以便能够在REST控制器中检索当前用户(
javax.Security.Principal


更新当前对象,而不是保存当前对象。首先在控制器中获取当前用户对象,然后设置UserInfo,然后更新数据库中的用户对象

 @RequestMapping(value = "/show", method = RequestMethod.POST)
    public ModelAndView newUser(ModelMap model, Principal principal) {
        String userName=principal.getName(); // username or email using user login
        User user=userService.getUserByName(userName); // retrieve current user information
        UserInfo userinfo = new UserInfo();  // create userinfor object
        userinfo.setPlacesVisit(userinfo.getPlacesVisit());
            user.setUserInfo(userinfo);   // set userinfo to user
        userService.update(user);  // update user
         String message = "Userinfo was successfully added.";
             result.addObject("message", message);
        return result;

    }

您使用的是Spring安全性吗?是的,我使用的是Spring安全性。在JSF中,最好创建带有用户实例的SessionScoped bean。它将自动存储在session中,我实际上在使用JSP。我正在尝试使用Principal参数。但它给出了这一行的错误:java.lang.ClassCastException:java.lang.String不能强制转换为org.temp.model.User,出现了一种文件下载弹出窗口,我不知道它是什么。你检查过我的控制器了吗其余的都是真的吗?我指的是减退之类的。你的rest控制器设置为POST。这正常吗?也许你可以试试这个,我解决了这个问题,但现在的问题是,每当我更新配置文件时,它都会向userinfo表插入一个新列。例如,如果每次我更新我的个人资料信息5次,当它保存这些信息时,它会删除一个新行。如何仅为相关用户保留一行?在hibernate中,使用sessionFactory.getCurrentSession().update(对象)来更新对象。
public ModelAndView newUser(ModelMap model, Principal principal) {

  User activeUser = (User) ((Authentication) principal).getPrincipal();
 @RequestMapping(value = "/show", method = RequestMethod.POST)
    public ModelAndView newUser(ModelMap model, Principal principal) {
        String userName=principal.getName(); // username or email using user login
        User user=userService.getUserByName(userName); // retrieve current user information
        UserInfo userinfo = new UserInfo();  // create userinfor object
        userinfo.setPlacesVisit(userinfo.getPlacesVisit());
            user.setUserInfo(userinfo);   // set userinfo to user
        userService.update(user);  // update user
         String message = "Userinfo was successfully added.";
             result.addObject("message", message);
        return result;

    }