我有一个用户表和一个 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;
}
答案 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
)
答案 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也可以。