【Redis__验证】手机验证和限制登录功能

redisweb.rar

TestController

package k.controller;

import k.utils.AjaxResult;
import k.utils.RedisService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import java.util.concurrent.TimeUnit;

@Controller
@RequestMapping("/test")
public class TestController {

    @Autowired
    private RedisService redisService;

    @RequestMapping("/verify")
    public String verifyMobile() {
        return "test/verify";
    }

    @RequestMapping("/doVerify")
    @ResponseBody
    public AjaxResult doVerify(HttpServletRequest request) {
        AjaxResult ajaxResult = AjaxResult.success();
        String mobile = request.getParameter("mobile");
        String yzm = request.getParameter("yzm");

        String gqKey = mobile;
        if (redisService.existsKey(gqKey)) {
            String keyVal = redisService.getKeyVal(gqKey);
            Integer old = Integer.parseInt(keyVal);
            if (old >= 3) {
                ajaxResult.setCode(0);
                ajaxResult.setMsg("20s验证3次");
                return ajaxResult;
            }
            redisService.setKeyVal(gqKey, (++old).toString());
        } else {
            redisService.setKeyVal(gqKey, "1");
            redisService.expireKey(gqKey, 20, TimeUnit.SECONDS);
        }

        String yzm_key = "yzm" + mobile;
        if (redisService.existsKey(yzm_key)) {
            String keyVal = redisService.getKeyVal(yzm_key);
            System.out.println("keyVal==" + keyVal + " yzm==" + yzm);
            if (keyVal.equals(yzm)) {
                ajaxResult.setMsg("验证成功");
            } else {
                ajaxResult.setMsg("验证失败");
            }
        } else {
            redisService.setKeyVal(yzm_key, "1234");
            redisService.expireKey(yzm_key, 20, TimeUnit.SECONDS);
        }

        return ajaxResult;
    }

    @RequestMapping("/doLogin")
    @ResponseBody
    public AjaxResult doLogin(HttpServletRequest request) {
        AjaxResult ajaxResult = AjaxResult.success();
        String mobile = request.getParameter("mobile");
        String pwd = request.getParameter("pwd");

        String xianzhiKey = "xz" + mobile;
        if (redisService.existsKey(xianzhiKey)) {
            ajaxResult.setCode(0);
            ajaxResult.setMsg("登录错误次数太多,请稍后尝试");
            return ajaxResult;
        }

        String timeKey = "time" + mobile;
        if ("123456".equals(pwd)) {
            ajaxResult.setCode(1);
            ajaxResult.setMsg("登录成功");
            redisService.setKeyVal(timeKey, "0");
            redisService.expireKey(timeKey, 10, TimeUnit.SECONDS);
            return ajaxResult;
        } else {
            ajaxResult.setCode(0);
            ajaxResult.setMsg("登录失败");
            if (redisService.existsKey(timeKey)) {
                String keyVal = redisService.getKeyVal(timeKey);
                Integer old = Integer.parseInt(keyVal);
                if (old >= 5) {
                    ajaxResult.setMsg("登录错误5次");
                    redisService.setKeyVal(xianzhiKey, "1");
                    redisService.expireKey(xianzhiKey, 20, TimeUnit.SECONDS);
                    return ajaxResult;
                }
                redisService.setKeyVal(timeKey, (++old).toString());
            } else {
                redisService.setKeyVal(timeKey, "1");
                redisService.expireKey(timeKey, 10, TimeUnit.SECONDS);
            }
            return ajaxResult;
        }
    }
}

RedisService

package k.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.Collection;
import java.util.Date;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.Stream;

@Component
public class RedisService {
    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    /**
     * 默认过期时长,单位:秒
     */
    public static final long DEFAULT_EXPIRE = 60 * 60 * 24;

    /**
     * 不设置过期时长
     */
    public static final long NOT_EXPIRE = -1;


    public boolean existsKey(String key) {
        return redisTemplate.hasKey(key);
    }

    /**
     * 重名名key,如果newKey已经存在,则newKey的原值被覆盖
     *
     * @param oldKey
     * @param newKey
     */
    public void renameKey(String oldKey, String newKey) {
        redisTemplate.rename(oldKey, newKey);
    }

    /**
     * newKey不存在时才重命名
     *
     * @param oldKey
     * @param newKey
     * @return 修改成功返回true
     */
    public boolean renameKeyNotExist(String oldKey, String newKey) {
        return redisTemplate.renameIfAbsent(oldKey, newKey);
    }

    /**
     * 删除key
     *
     * @param key
     */
    public void deleteKey(String key) {
        redisTemplate.delete(key);
    }

    /**
     * 删除多个key
     *
     * @param keys
     */
    public void deleteKey(String... keys) {
        Set<String> kSet = Stream.of(keys).map(k -> k).collect(Collectors.toSet());
        redisTemplate.delete(kSet);
    }

    /**
     * 删除Key的集合
     *
     * @param keys
     */
    public void deleteKey(Collection<String> keys) {
        Set<String> kSet = keys.stream().map(k -> k).collect(Collectors.toSet());
        redisTemplate.delete(kSet);
    }

    /**
     * 设置key的生命周期
     *
     * @param key
     * @param time
     * @param timeUnit
     */
    public void expireKey(String key, long time, TimeUnit timeUnit) {
        redisTemplate.expire(key, time, timeUnit);
    }

    /**
     * 指定key在指定的日期过期
     *
     * @param key
     * @param date
     */
    public void expireKeyAt(String key, Date date) {
        redisTemplate.expireAt(key, date);
    }

    /**
     * 查询key的生命周期
     *
     * @param key
     * @param timeUnit
     * @return
     */
    public long getKeyExpire(String key, TimeUnit timeUnit) {
        return redisTemplate.getExpire(key, timeUnit);
    }

    /**
     * 将key设置为永久有效
     *
     * @param key
     */
    public void persistKey(String key) {
        redisTemplate.persist(key);
    }

    public String getKeyVal(String key) {
        return redisTemplate.opsForValue().get(key);
    }

    public void setKeyVal(String key, String val) {
        redisTemplate.opsForValue().set(key, val);
    }
}
原文地址:https://www.cnblogs.com/kikyoqiang/p/13160002.html