我目前正在开发一个(相对)基本的Web应用程序,它可以作为虚构雇主的时钟。目前,该应用程序实现了HTML,JavaScript,Java,MySQL,Spring Framework和xml。我有一个登录页面,它接受用户输入的用户名和密码并存储信息。问题是,我似乎无法弄清楚如何获取该信息并将其与MYSQL数据库进行比较以成功登录。如有必要,我可以发布代码示例,并提前感谢您的帮助。
这是LoginController的一部分:
@RequestMapping(value = "/jsp/login")
public ModelAndView existUser(HttpServletRequest request) {
return new ModelAndView("UserPrint.jsp", hashmap.makeHashMap());
}
@RequestMapping(value = "userLogin")
public ModelAndView loginUser(HttpServletRequest request,
HttpSession session) {
String strLoginJsp = "login.jsp";
String strSessionErrorAttribute = "errors";
User sessionUser = getUserFromSession(session);
if (request.getHeader("referer") == null
|| request.getHeader("referer").contains("AddNewUser.html")) {
session.setAttribute(SESSION_USER_ATTRIBUTE, new User());
session.setAttribute(strSessionErrorAttribute, "");
return new ModelAndView(strLoginJsp, hashmap.makeHashMap());
}
User requestUser = new User();
String requestedUserName = request.getParameter("userName");
requestUser.setUserName(requestedUserName);
String requestedPassword = request.getParameter("password");
requestUser.setPassword(requestedPassword);
session.setAttribute(strSessionErrorAttribute, "");
// Check if username and password is in DB
User loginUser = userDao.login(requestUser);
if (loginUser == null) {
// Either the username doesn't exist, or the password was bad.
if (userDao.userNameExist(requestedUserName)) {
// user entered bad password
if (sessionUser.getUserName() != null
&& sessionUser.getUserName().equals(
requestUser.getUserName())) {
} else {
sessionUser.setUserName(requestUser.getUserName());
}
}
} else {// username does not exist in db
session.setAttribute(strSessionErrorAttribute,
"Please register account.");
这是UserDao的一部分:
@SuppressWarnings("unchecked")
@Transactional
public List<User> getAllUsers() {
Query query = em.createNamedQuery("fetchAllUsers");
return query.getResultList();
}
public User login(User user) {
Query query = em.createNamedQuery("userLogin");
query.setParameter("userName", user.getUserName());
query.setParameter("password", user.getPassword());
List<User> currentUsers = query.getResultList();
if (currentUsers.size() > 0) {
return (User) currentUsers.get(0);
}
return null;
}
@SuppressWarnings("unchecked")
@Transactional
public Boolean userNameExist(String userName) {
Query query = em.createNamedQuery("getUserWithUsername");
query.setParameter("userName", userName);
List<User> existUser = query.getResultList();
if (existUser.size() > 0) {
return true;
}
return false;
}
答案 0 :(得分:1)
通常您会使用您的登录名和密码并搜索用户
String queryStr = "SELECT * FROM users WHERE login='"+sanitize(userLogin)+"' AND password='"+sanitize(userPass)"'";
这不是真正的代码只是伪代码。我不知道java或spring如何处理卫生设施,但最重要的是,在构建查询字符串时,不要相信用户输入的任何内容。
这个想法是,如果这导致1个用户有效,如果它没有返回,则用户无效!
使用参数化查询可能是最好的方法
答案 1 :(得分:1)
要扩展dm03514的答案 - 是的,您应该通过在Java JDBC中使用预准备语句对象来“清理”用户输入。
答案 2 :(得分:1)
如果您使用的是Spring,那么您应该使用spring-security。他们已经为你做了很多事情,你只需配置它。
答案 3 :(得分:0)
是的,请发布一些代码。 究竟是什么问题?
在最基本的层面上,您应该能够:
上述哪些步骤失败了?