![](/img/trans.png)
[英]Purposes of using Bean instead of model in Spring MVC & Hibernate
[英]Using bean for Logging in and Registering - Spring MVC + Hibernate
我正在使用Spring MVC和Hibernate開發一個Web應用程序,讓用戶登錄到系統以訪問內部頁面。 這是使用檢查會話變量的攔截器完成的。
我可以正確注冊以尋找有效值。 但是在登錄的情況下,我只需要用戶名和密碼,我在使用bean驗證登錄時遇到了麻煩,因為它指控沒有電子郵件等。
這是User類:
@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.
如何將“用戶”類用於登錄和注冊? 我必須使用繼承嗎?
當然不是繼承! 考慮一下數據結構的作用。 您需要什么來支持登錄表單。 好吧,只是一個LoginForm
。 它是持久性數據嗎? 絕對不。 LoginForm
和User
之間有什么關系? 好吧,第一個有助於確定最后一個。 現在,我認為您應該做的是開發具有驗證要求的LoginForm
對象。 該對象將不是持久性的,而是將成為您用於檢索具有自己的驗證的持久性User
的方法的參數。
為了更精確一點,我將介紹一個新類:
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) {
// ...
}
順便說一句,我不確定保留密碼是否是一個好主意。 您可以保存哈希值,也可以確定身份驗證是外部目錄的域。
我想您應該創建注冊和登錄控制器,以保持代碼簡潔明了。 讓代碼看起來很愚蠢,它將易於維護並且將為進一步實現開放。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.