用户退出登录后使jwt失效

  1. 使用redis的set类型 在用户退出时将用户的jwt存入至redis
String header = request.getHeader(JwtConstants.TOKEN_HEADER);
JedisUtil.addSet(JwtConstants.REDIS_KEY,60*60*24, header);

  //addSet方法
 /**
     * 向set中 添加记录,如果已经存在,返回0 否则返回1
     * sadd 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 value 元素将被忽略。
     *
     * @param key
     * @param value
     * @return
     */
    public static long addSet(String key,int timeOut, String... value) {
        Jedis jedis = null;
        long status;
        try {
            jedis = jedisPool.getResource();//获取一个jedis实例
            status = jedis.sadd(key, value);
            jedis.expire(key,timeOut);
        } finally {
            jedis.close();
        }
        return status;
    }
  1. 用户调用接口时候判断携带的jwt是否存在redis,如果存在则拦截请求
        boolean b = JedisUtil.sifExist(JwtConstants.REDIS_KEY, request.getHeader(JwtConstants.TOKEN_HEADER));
 //sifExist方法
/**
     * 判断元素是否存在
     *
     * @param key
     * @param value
     * @return
     */
    public static boolean sifExist(String key, String value) {
        Jedis jedis = null;
        boolean result = false;
        try {
            jedis = jedisPool.getResource();//获取一个jedis实例
            result = jedis.sismember(key, value);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            jedis.close();
        }

        return result;
    }

预防用户使用卡密恶意重复充值

  1. 防止多线程同时使用同一个支付卡密进行充值 使用redis的单线程机制 setnx 一段时间内只能操作一条
//一定要存卡密
Long verifyCarmi = JedisUtil.setnxWithTimeOut(cards.getCardInfo(),cards.getCardInfo(), 10);
            if(verifyCarmi == 2){
                map.put("msg","请勿重复充值");
                map.put("bool",false);
                return map;
            }

   //setnxWithTimeOut方法
  /**
     * 添加一个键值对,如果键存在不在添加,如果不存在,添加完成以后设置键的有效期
     * @param key
     * @param value
     * @param timeOut
     */
    public static Long setnxWithTimeOut(String key,String value,int timeOut) {
        Jedis jedis = null;//获取一个jedis实例
        long expire = 2;
        try {
            jedis = jedisPool.getResource();//获取一个jedis实例
            if(0!=jedis.setnx(key, value)){
                expire = jedis.expire(key, timeOut);
            }
        } catch (Exception e) {
            LogUtils.error("错误日志:"+e.getMessage());
        } finally {
            jedis.close();
        }
        return expire;
    }

设置短期数据

  1. 首页展示假数据的时候有些数据需要一两个小时变一次 将数据存数据库有点浪费数据库资源 所以用redis直接set一个String键值对并设置有效期
//这个数据过期 redis不存在这个Key的时候就重新生成
proxyDataVO.setPing(String.valueOf(RandomDataUtils.getRandomData(200,300)));
            String redisPing = JedisUtil.get("ping");
            if(ObjectUtil.isNull(redisPing)){
                int ping = RandomDataUtils.getRandomData(200,300);
                JedisUtil.set("ping",String.valueOf(ping),60*60);
                proxyDataVO.setPing(String.valueOf(ping));
            }

//get方法
public static String get(String key) {
        Jedis jedis = null;
        String value = null;

        try {
            jedis = jedisPool.getResource();//获取一个jedis实例
            value = jedis.get(key);
        } catch (Exception e) {
            LogUtils.error("错误日志:"+e.getMessage());
        } finally {
            jedis.close();
        }
        return value;
    }
   //set方法
  /**
     * 添加一个键值对,如果键存在不在添加,如果不存在,添加完成以后设置键的有效期
     * @param key
     * @param value
     * @param timeOut
     */
    public static void set(String key,String value,int timeOut) {
        Jedis jedis = null;//获取一个jedis实例
        try {
            jedis = jedisPool.getResource();//获取一个jedis实例
            jedis.setex(key,timeOut,value);
        } catch (Exception e) {
            LogUtils.error("错误日志:"+e.getMessage());
        } finally {
            jedis.close();
        }
    }

接收验证码

  1. 用户注册的时候 将id + 验证码存入redis 用户输入验证码校验的时候去redis查key = id的值 如果value和用户输入的验证码一致则允许注册
//发送验证码的时候存入redis
JedisUtil.set("register"+userEmail,code.toString(),120);
//校验验证码的时候查询redis
 String redisCode = JedisUtil.get("register" + email);
            if(ObjectUtil.isNull(redisCode)){
                map.put("msg", "验证码已经失效");
                map.put("bool", false);
                return map;
            }

hash类型取list集合

  1. 上游将用户的流量详情用hash类型存入了redis java端需要展示出来则直接通过存入的格式将数据一一取出来
 public JSONObject getTrafficById(@NotBlank(message = "id不能为空") String userId){
        String fieId = "userFlowCounter";
        Date date = new Date();
        HashMap<String, Object> stringListHashMap = new HashMap<>();
        ArrayList<TrafficStatistical> trafficStatisticals = new ArrayList<>();
        ArrayList<TrafficStatistical> jfTrafficStatisticals = new ArrayList<>();
        ArrayList<TrafficStatistical> gTrafficStatisticals = new ArrayList<>();
        for (int i = 0; i < 7; i++) {
            DateTime dateTime = DateUtil.offsetDay(date, -i);
            String day = dateTime.toString("yyyy-MM-dd");
            String value = userId + ":1:" + day;
            String jfValue = userId + ":2:" + day;
            String gValue = userId + ":3:" + day;
            //动态ip流量
            List<String> key = JedisUtil.getHash(fieId, value);
            TrafficStatistical trafficStatistical = new TrafficStatistical();
            trafficStatistical.setBill(key.get(0));
            if(key.get(0) == null){
                trafficStatistical.setBill("0");
            }
            trafficStatistical.setTime(day);
            trafficStatisticals.add(trafficStatistical);
            //机房ip流量
            List<String> key1 = JedisUtil.getHash(fieId, jfValue);
            TrafficStatistical jfTrafficStatistical = new TrafficStatistical();
            jfTrafficStatistical.setBill(key1.get(0));
            if(key1.get(0) == null){
                jfTrafficStatistical.setBill("0");
            }
            jfTrafficStatistical.setTime(day);
            jfTrafficStatisticals.add(jfTrafficStatistical);
            //4Gip流量
            List<String> key2 = JedisUtil.getHash(fieId, gValue);
            TrafficStatistical gTrafficStatistical = new TrafficStatistical();
            gTrafficStatistical.setBill(key2.get(0));
            if(key2.get(0) == null){
                gTrafficStatistical.setBill("0");
            }
            gTrafficStatistical.setTime(day);
            gTrafficStatisticals.add(gTrafficStatistical);
        }

        Collections.reverse(trafficStatisticals);
        Collections.reverse(jfTrafficStatisticals);
        Collections.reverse(gTrafficStatisticals);
        stringListHashMap.put("dynamicBill",trafficStatisticals);
        stringListHashMap.put("jfBill",jfTrafficStatisticals);
        stringListHashMap.put("gBill",gTrafficStatisticals);
        return success(stringListHashMap);

    }

    //getHash方法
    public static List<String> getHash(String key,String... fieId){
        Jedis jedis = null;
        List<String> value = null;
        try {
            jedis = jedisPool.getResource();//获取一个jedis实例
            value = jedis.hmget(key,fieId);
        } catch (Exception e) {
            LogUtils.error("错误日志:"+e.getMessage());
        } finally {
            jedis.close();
        }
        return value;
    }	
上一篇 下一篇