Java 使用bean登录和注册-springmvc+;冬眠
我正在使用SpringMVC和Hibernate开发一个web应用程序,让用户登录到系统以访问内部页面。这是使用检查会话变量的拦截器完成的 我可以正确注册以查找有效值。 但在登录的情况下,我只需要用户名和密码,我在如何使用bean验证登录上遇到了麻烦,因为它指责没有电子邮件等等 这是用户类:Java 使用bean登录和注册-springmvc+;冬眠,java,spring,hibernate,spring-mvc,login,Java,Spring,Hibernate,Spring Mvc,Login,我正在使用SpringMVC和Hibernate开发一个web应用程序,让用户登录到系统以访问内部页面。这是使用检查会话变量的拦截器完成的 我可以正确注册以查找有效值。 但在登录的情况下,我只需要用户名和密码,我在如何使用bean验证登录上遇到了麻烦,因为它指责没有电子邮件等等 这是用户类: @Entity public class User{ @Id @GeneratedValue private int id; @NotNull @Column(n
@Entity
public class User{
@Id
@GeneratedValue
private int id;
@NotNull
@Column(name="username",unique=true)
@Size(min=5)
private String username;
@NotNull
@Email
private String email;
@NotNull
@Size(min=5)
private String password;
private String salt;
private int status;
private String name;
private String company;
private int countryid;
@DateTimeFormat(pattern="dd/MM/yyyy")
@Temporal(TemporalType.DATE)
private Calendar subscriptionDate;
//Getters and Setters
}
控制员:
@Transactional
@Controller
public class LoginController {
@Autowired
UserDao dao;
// Other Mappings
@RequestMapping(value = "addUser", method = RequestMethod.POST)
public String makeRegistration(@ModelAttribute("user") @Valid User user, BindingResult result,
RedirectAttributes redirectAttributes) {
if (result.hasErrors()) {
return "redirect:register";
}
if (dao.add(user)) {
redirectAttributes.addFlashAttribute("user", user);
return "redirect:login";
} else {
return "redirect:register";
}
}
@RequestMapping(value = "enter", method = RequestMethod.POST)
public String doLogin(@ModelAttribute("user") @Valid User user, BindingResult result, HttpSession session) {
if (result.hasErrors()) {
return "redirect:login";
} else {
if (dao.authenticate(user)) {
session.setAttribute("userLoggedIn", user.getUsername());
return "forward:index";
} else {
return "redirect:login";
}
}
}
\\ Other mappings.
如何使用“User”类进行登录和注册?
我必须使用继承吗?当然不是继承!
考虑一下数据结构的作用。您需要什么来支持您的登录表单。那么,只需一个LoginForm
。它是持久数据吗?绝对不是。LoginForm
和用户之间的关系是什么?第一个有助于识别最后一个。现在我认为您应该做的是开发一个带有验证需求的LoginForm
对象。此对象不会是持久的,但将是一个方法的参数,您将使用该方法检索具有自身验证的持久用户
更确切地说,我将介绍一个新类:
public class LoginForm implements Serializable {
@NotNull
@Column(name="username", unique=true)
@Size(min=5)
private String username;
@NotNull
@Size(min=5)
private String password;
//Getters and Setters
}
。。。并修改身份验证方法的签名:
@RequestMapping(value = "enter", method = RequestMethod.POST)
public String doLogin(@ModelAttribute("user") @Valid LoginForm loginForm, BindingResult result, HttpSession session) {
// ...
}
顺便说一句,我不确定保留密码是否是个好主意。您可以保存散列或确定身份验证是外部目录的域。我想您应该创建注册和登录控制器,以保持代码干净和简单。让代码看起来很愚蠢,它将很容易维护,并将开放供进一步实现。你能给出一个具体的例子,让我理解这个想法吗?您的意思是类似“Loginform实现验证器”;“public void Validate(User,Error Error){//validation logic}”是的,现在我可以理解了。作为一个附带问题,我可以在表单中加载:来自验证的错误吗?另外,我正在对所有passwod进行散列,因此是salt字段。这是BindingResult
的角色,请在此处查看入门: