SSM项目的登录功能controller层的实现
1.需求分析
用户在登录页面,输入用户名和密码,点击"登录"按钮或者回车,完成用户登录的功能.
*用户名和密码不能为空
*用户名或者密码错误 , 用户已过期 , 用户状态被锁定, ip受限 都不能登录成功
*登录成功之后,所有业务页面显示当前用户的名称
*实现10天记住密码
*登录成功之后,跳转到业务主页面
*登录失败,页面不跳转,提示信息
主要代码如下:
@RequestMapping("/settings/qx/user/login.do")
@ResponseBody
public Object login(String loginAct, String loginPwd, String isRemPwd, HttpServletRequest request) {
Map<String, Object> map = new HashMap<>();
map.put("loginAct", loginAct);
map.put("loginPwd", loginPwd);
User user = userService.queryUserByLoginActAndPwd(map);
ReturnObject returnObject = new ReturnObject();
if (user == null) {
// * 说明登录失败用户名或者密码错误
returnObject.setCode("0");
returnObject.setMessage("用户名或者密码错误");
} else {
// 说明用户名密码正确,在进一步判断账号是否合法
// 将当前时间转换为字符串
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String nowTime = dateFormat.format(new Date());
// 这里说明当前时间大,也就是说用户的登录时间已经过期,登录失败,账号已经过期
if (nowTime.compareTo(user.getExpireTime()) > 0) {
returnObject.setCode("0");
returnObject.setMessage("该账号已过期");
// 判断是否过期,从user中拿
} else if ("0".equals(user.getLockState())) {
returnObject.setCode("0");
returnObject.setMessage("账号状态被锁定");
// 判断状态是否被锁定
// 从请求中获取用户的ip地址,并和地址数据库中的数据进行比较
// 如果数据库中的地址不包含该地址,当前地址也是不可以登录
} else if (!user.getAllowIps().contains(request.getRemoteAddr())) {
returnObject.setCode("0");
returnObject.setMessage("该账号ip受限");
} else {
returnObject.setCode("1");
}
}
return returnObject;
}
这里总结三个技术点,也是以后常用的必须会的:
1. 日期的比较
在这个处理login的方法中,出现了判断日期的需求,数据库的日期存储设计如下:

所以这里也就需要比较日期的大小,即比较当前时间和账号允许的登录时间;两种方案:一是通过转换时间来比较,而是通过String类中提供的compareTo()方法直接进行时间的比较,如下:
// 定义和数据库中一样的时间格式
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 获得当前时间的字符串
String nowTime = dateFormat.format(new Date());
// 通过String的compareTo方法进行比较,并向前台返回封装的
if (nowTime.compareTo(user.getExpireTime()) > 0) {
returnObject.setCode("0");
returnObject.setMessage("该账号已过期");
}
2.包含关系的体现
这里就是注意一下String类中一个函数 contains()函数
在代码中的体现如下:
else if (!user.getAllowIps().contains(request.getRemoteAddr())) {
通过request对象获得到请求的ip,然后和数据库中查到的允许ip进行比较
3.对于公共类的使用
这里封装了一个ReturnObject类用于方便返回前台需要的信息。
成员变量如下:

这里一般会选择多加一个属性,方便以后的使用
~ 加油 ~ 知其然,知其所以然

浙公网安备 33010602011771号