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

时间:2014-04-19 10:58:15

标签: java mysql spring hibernate jsp

我有一个用户表和一个 UserInfo 表,用于保存用户的个人信息。我想要做的是在登录后添加个人信息。表与 userId 列之间存在OneToOne关系,所以我这样定义:

UserInfo 类:

public class UserInfo {

//...

@OneToOne
@JoinColumn(name="user_id")
private User user;
// ...
}

用户类:

 public class User implements UserDetails {
// ...

 @OneToOne(mappedBy="user", cascade = CascadeType.ALL, fetch=FetchType.LAZY,optional=true)
 private UserInfo userInfo;

 ...
}

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

(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;

}

4 个答案:

答案 0 :(得分:1)

您可以使用Principal参数检索用户:

public ModelAndView newUser(ModelMap model, Principal principal) {

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

}

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

Spring Security Documentation

答案 1 :(得分:1)

而不是保存当前对象更新当前对象。首先在设置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;

    }

答案 2 :(得分:0)

您可以使用会话保存会话属性。在春天,您可以使用

访问会话
ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
           HttpSession session = attr.getRequest().getSession();

答案 3 :(得分:0)

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

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也可以。