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秒执行一次
}
}
})
}