Redis小案例 通过hash和String实现登录业务逻辑

Redis小案例 通过hash和String实现登录小案例

输入手机号即调用 ajax,检索账号状态,是否被禁用,是否存在
密码错误五次会被禁用一小时

@Controller
public class AccountController {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Resource(name = "redisTemplate")
    private HashOperations<String, String, Object> hash;

    /**
     * 验证手机号是否存在
     * @param phone
     * @return  -2 存在,-1 不存在,返回剩余时间 已被禁用
     */
    @ResponseBody
    @RequestMapping("checkPhone")
    public String checkPhone(String phone) {
        // 验证是否存在
        if (hash.hasKey("account", phone)) {
            // 如果禁用列表里存在phone,且为true,设置button禁用
            if (redisTemplate.hasKey("disabled" + phone) && redisTemplate.opsForValue().get("disabled" + phone).equals(phone)) {
                Long time = redisTemplate.getExpire("disabled" + phone);
                return "" + time;
            }
            return "-2";
        }
        return "-1";
    }

    /**
     * 验证密码是否正确
     * @param phone
     * @param password
     * @return 10 成功, 错误返回剩余可用次数, -2 错误五次 锁定账号
     */
    @ResponseBody
    @RequestMapping("checkInfo")
    public String checkInfo(String phone, String password) {
        if (password == null || phone == null) {
            return "-5";
        }
        String pass = (String) hash.get("account", phone);
        int less = 0;
        if (password.equals(pass)) {
            // 密码正确,判断是否存在checkNum,若存在,将其移除
            if (redisTemplate.hasKey("checkNum")) {
                redisTemplate.delete("checkNum");
            }
            return "10";
        } else {
            // 密码错误开始计数,最多输错五次
            if (!redisTemplate.hasKey("checkNum")) {
                redisTemplate.opsForValue().set("checkNum", 5, 120, TimeUnit.SECONDS);
            }
            redisTemplate.opsForValue().decrement("checkNum");
            less = (int) redisTemplate.opsForValue().get("checkNum");

            // 连续输错五次密码,将checkNum移除,禁用此账户一小时
            if (0 == (Integer) redisTemplate.opsForValue().get("checkNum")) {
                Boolean flag = redisTemplate.delete("checkNum");
                redisTemplate.opsForValue().set("disabled" + phone, phone, 3600, TimeUnit.SECONDS);
                return "-2";
            }
        }
        return "" + less;
    }

}

页面代码

<div class="modal_content">
    <h2>登录</h2>
    <div>
        <label for="phone">账号:</label>
        <div id="msg"></div>
        <br/>
        <input id="phone" type="text" autocomplete="off" placeholder="请输入手机号" onchange="checkPhone()"/>
    </div>
    <div>
        <label for="password">密码:</label>
        <div id="msg1"></div>
        <br/>
        <input id="password" type="text" autocomplete="off" placeholder="请输入密码"/>
    </div>
    <div class="next">
        <input id="input1" type="button" class="btn btn-default" onclick="binding()" value="登录"/>
    </div>
</div>

验证手机号状态

function checkPhone() {
        phone = $("#phone").val();
        console.log("手机号", phone)
        $.ajax({
            url: "checkPhone",
            data: {"phone": phone},
            success: function (d) {
                console.log("账号状态", d)
                if (d == -2) {
                    $("#msg").html('');
                    $("#msg").html("正确");
                    curCount = 0;
                    $("#input1").attr("disabled", "false");
                    $("#input1").val(+curCount + "登录");
                    InterValObj = window.setInterval(SetRemainTime1, 1000); //启动计时器,1秒执行一次
                }
                if (d == -1) {
                    $("#msg").html('');
                    $("#msg").html("错误");
                    curCount = 0;
                    $("#input1").attr("disabled", "false");
                    $("#input1").val(+curCount + "登录");
                    InterValObj = window.setInterval(SetRemainTime2, 1000); //启动计时器,1秒执行一次
                }
                if (d >= 0) {
                    curCount = d;
                    $("#msg").html('');
                    $("#msg").html("账号已被禁用");
                    $("#input1").attr("disabled", "true");
                    $("#input1").val(+curCount + "秒后再登录");
                    InterValObj = window.setInterval(SetRemainTime3, 1000); //启动计时器,1秒执行一次
                }

            }
        })
    }

禁用按钮 添加 计时器效果

 function SetRemainTime() {
     if (curCount == 0) {
         window.clearInterval(InterValObj);//停止计时器
         $("#input1").removeAttr("disabled");//启用按钮
     } else {
         curCount--;
         $("#input1").val(+curCount + "秒后再登录");
     }
 }

验证密码是否正确,错误做出相应处理

 function binding() {
        var password = $("#password").val();

        $.ajax({
            url: "checkInfo",
            type: "POST",
            data: {"phone": phone, "password": password},
            success: function (data) {
                console.log(data)
                if (data == -5) {
                    $("#msg1").html('');
                    $("#msg1").html("不能为空");
                }
                if (data == 10) {
                    $("#msg1").html('');
                    $("#msg1").html("登陆成功");
                }
                if (data >= 0 && data <= 5) {
                    $("#msg1").html('');
                    $("#msg1").html("密码错误,还有" + data + "次机会");
                }
                if (data == -2) {
                    curCount = 3600;
                    $("#msg1").html('');
                    $("#input1").attr("disabled", "true");
                    $("#input1").val(+curCount + "秒后再登录");
                    InterValObj = window.setInterval(SetRemainTime, 1000); //启动计时器,1秒执行一次
                }

            }
        })

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值