簡體   English   中英

使用bean登錄和注冊-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 它是持久性數據嗎? 絕對不。 LoginFormUser之間有什么關系? 好吧,第一個有助於確定最后一個。 現在,我認為您應該做的是開發具有驗證要求的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM