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的方法中,出现了判断日期的需求,数据库的日期存储设计如下:
image
所以这里也就需要比较日期的大小,即比较当前时间和账号允许的登录时间;两种方案:一是通过转换时间来比较,而是通过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类用于方便返回前台需要的信息。
成员变量如下:
image
这里一般会选择多加一个属性,方便以后的使用


				~ 加油 ~ 知其然,知其所以然
posted @ 2022-08-08 16:30  yfs1024  阅读(665)  评论(0)    收藏  举报