用户登录流程:用户输入-->页面校验数据后提交表单-->判断是否已经登录-->判断输入是否合法-->查询数据库是否有对应用户-->返回登录结果
先对页面表单提交地址和方式进行调整,输入项添加required必填项属性。
<form id="loginForm" action="${pageContext.request.contextPath }/UserAction_login.action" method="post">
<h5>User Name:</h5>
<input name="user.username" type="text" required='true' >
<h5>Password:</h5>
<input name="user.password" type="password" required='true' >
<input type="submit" value="Login">
</form>
页面引入struts标签库,添加actionerror标签接收服务器返回的信息,作为给用户的登录失败提示:
<!-- 登陆失败提示信息 -->
<div style="color:red"> <s:actionerror/> </div>
因为要使用actionError,在UserAction继承ActionSupport类添加login方法,添加login方法:
/**
* 用户登录
*/
public String login(){
//System.out.println(user.getUsername()+","+user.getPassword());
//判断用户是否已经登陆
HttpSession session = ServletActionContext.getRequest().getSession();
if(session.getAttribute("loginUser") != null){
//已经登陆,回到主页
return "success";
}
//判断用户输入的用户名是不是空白字符串
if(StringUtils.isNotBlank(user.getUsername())){
//非空白用户名,调用service校验
User db_user = userService.login(user);
if(db_user != null){
//登陆成功,设置登录信息
session.setAttribute("loginUser", db_user);
//返回主页
return "success";
}else{
//用户名或密码不正确,设置错误信息
this.addActionError("用户名或密码错误");
//返回登陆页面
return "login";
}
}else{
//输入的是空白用户名,设置错误信息
this.addActionError("用户名或密码错误");
//返回登陆页面
return "login";
}
UserService的login方法实现,将用户输入明文密码用MD5加密,然后调用dao方法查询用户
/*
* 用户登录
*/
public User login(User user) {
//MD5加密密码
String md5_password = MD5Utils.getMd5(user.getPassword());
user.setPassword(md5_password);
//返回dao查询到的结果
return userDao.login(user);
}
在dao中将用户名和用户密码作为组合查询条件进行查询,这里用的hql查询:
/**
* 用户登录
* 根据用户名+密码查询用户
*/
public User login(User user) {
//hql查询语句
String hql = "FROM User u WHERE u.username =? AND u.password =?";
//调用模板方法查找
List<User> list = (List<User>) this.getHibernateTemplate().find(hql, user.getUsername(), user.getPassword());
//判断查询结果
if(list.isEmpty()){
//空集,没找到用户
return null;
}
//非空,返回User对象
return list.get(0);
}
为了直观地看到是否登录,在前端页面加个标签显示当前用户,顺便加个退出标签:
<li><a href="" >${loginUser.username }</a></li>
<li><a href="${pageContext.request.contextPath }/UserAction_logout.action" >logout</a></li>
退出登录直接销毁session然后返回登录页面:
/**
* 退出登录
*/
public String logout(){
//销毁session
ServletActionContext.getRequest().getSession().invalidate();
//返回登陆页面
return "login";
}
登录+退出登录:
登陆失败: