利用HttpSession记录用户的登陆次数

来源:互联网 发布:sql某个值包含多个条件 编辑:程序博客网 时间:2024/05/03 13:57

场景:目前有两种登录方式,首先是人脸认证登录,如果累计认证失败三次,那么就将页面转发到用户名、密码登录的方式,所以这里就需要对当前用户登录失败的次数做统计,因为利用数据库再去存储这些信息很麻烦,要修改用户表的表结构,并且在达到峰值后需要清零,又要对数据库进行读写操作,这里使用HttpSession实现该功能,具体代码如下:

    //用户登陆界面登陆验证成功将页面重定向到主页即可    @RequestMapping(value="/login", method = RequestMethod.POST)    public String requestLogin(String username, String password, Model model, HttpSession session) {        System.out.println("用户尝试登陆:" + session);        Integer count = (Integer)session.getAttribute(session.toString());        System.out.println("获取的次数:" + count);        User loginUser = userService.getUser(username, password);        if(count == null||count==0) {//首次登录            if(loginUser==null) {                session.setAttribute(session.toString(), 1);                model.addAttribute("error", "您输入的账号或密码有误!已经错误" + session.getAttribute(session.toString()) + "次");                return "login";            } else { //登陆成功                model.addAttribute("loginUser", loginUser);                return "redirect:index";            }        } else if(count>=3){            //使用其他方式登陆            model.addAttribute("error", "你已登录3次失败,将为你转向传统登陆界面");            session.setAttribute(session.toString(), 0);            return "face";        } else {//登录失败的次数属于1次或2次的情况            if(loginUser==null) {                session.setAttribute(session.toString(), ++count);                model.addAttribute("error", "您输入的账号或密码有误!已经错误" + session.getAttribute(session.toString()) + "次");                return "login";            } else { //登陆成功                model.addAttribute("loginUser", loginUser);                return "redirect:index";            }        }

以上记录的主要是后台的记录方式,在目前的项目中主要做的前台的判断,所以在前端的也提供了一共解决方案(两者不能共存!),前端主要针对的是ajax的请求的方式,所以在触发ajax请求外的地方定义一个变量来记录即可,由于ajax是针对局部刷新的动作,所以无法定义所谓的全局变量,只要把它定义到触发ajax请求的事件之外即可,本人项目中的用法如下:

    //对用户认证次数统计    var count = 0;    //进行用户人脸的认证    document.getElementById("rz").addEventListener("click", function () {        //这里得到的就是Base64的编码方式,        var imgData=document.getElementById("canvas").toDataURL("image/png");        //请求图片根据接口要求,去除前22位的文件头,即去除data:image/jpeg;base64,        var data1=imgData.substr(22);        $.post("http://localhost:8080/GasMonitor/verifyUser",                {                 "image":data1                 },            function(data){                 //进行判断,分数大于80得分认为匹配成功                if(data.result[0]>80) {                    alert("认证成功,欢迎您!");                    //ajax只能局部刷新,不能在调用的后台接口中进行页面跳转,只能在回调函数中进行跳转                    window.location.href="${pageContext.request.contextPath}/index";                } else if(data.result[0]<=80&&data.result[0]>0) {                    if(count<3) {                        alert("认证失败,请重新认证!");                        count++;                        console.info("count=" + count);                    } else {                        alert("您已认证失败3次,请使用用户名进行登录!");                        window.location.href="${pageContext.request.contextPath}/login";                        console.info("count=" + count);                    }                } else {                    //这里检测不到人脸返回的json字符串将不带result的属性,这里后台是自己手动拼接了数值为0的result的属性添加进去                    alert("认证失败,请保证面部清晰!");                    count++;                    console.info("count=" + count);                    if(count<3) {                        alert("认证失败,请重新认证!");                        console.info("count=" + count);                    } else {                        alert("您已认证失败3次,请使用用户名进行登录!");                        window.location.href="${pageContext.request.contextPath}/login";                        console.info("count=" + count);                    }                }                         },             "json");    });

缺点:基于HttpSession的方式简单直接,但是在服务器集群部署的情况下session共享的方式是不适用的,因为下次请求不知道会转发到哪个机器上,此时Cookie就发挥作用了

原创粉丝点击