• Api接口幂等设计


    1,Api接口幂等设计,也就是要保证数据的唯一性,不允许有重复。

         例如:rpc 远程调用,因为网络延迟,出现了调用了2次的情况。

                    表单连续点击,出现了重复提交。

                    接口暴露之后,会被模拟请求工具(Jemter等)进行攻击。

    2,怎么样保证接口幂等设计呢?

          可以使用Token方式,每次调用Api 接口(提交表单)之前,会调用api生成token,并将token给客户端保存,redis里面也保存token,redis 可以设置有效时长,约15-60 分钟

          当提交表单的时候,请求头里面要携带token,将请求头里面的token 拿出来和redis 里面的token进行比较,redis 里面有token,则表单提交,同时,删除token,redis 里面没有,则表单不提交。

    3,调用index 方法的时候,生成token,客户端保存,点击提交,调用postIndex 接口前,token 验证

    4,安装redis

    5, 基于redis 写个redis 缓存token

    package com.aiyuesheng.util;
    
    import java.util.concurrent.TimeUnit;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.stereotype.Component;
    
    @Component
    public class BaseRedisService {
    
        @Autowired
        private StringRedisTemplate stringRedisTemplate;
    
        public void setString(String key, Object data, Long timeout) {
            if (data instanceof String) {
                String value = (String) data;
                stringRedisTemplate.opsForValue().set(key, value);
            }
            if (timeout != null) {
                stringRedisTemplate.expire(key, timeout, TimeUnit.SECONDS);
            }
        }
    
        public Object getString(String key) {
            return stringRedisTemplate.opsForValue().get(key);
        }
    
        public void delKey(String key) {
            stringRedisTemplate.delete(key);
        }
    
    }
    package com.aiyuesheng.util;
    
    import java.util.UUID;
    
    import org.apache.commons.lang.StringUtils;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    @Component
    public class RedisToken {
        @Autowired
        private BaseRedisService baseRedisService;
    
        private static final long TIMEOUT = (60 * 60 * 60);
    
        public String setToken() {
            String token = System.currentTimeMillis() + "" + UUID.randomUUID();
            baseRedisService.setString(token, token, TIMEOUT);
            return token;
        }
    
        public String getToken(String tokenKey) {
            if(!StringUtils.isEmpty((String) baseRedisService.getString(tokenKey))){
                return (String) baseRedisService.getString(tokenKey);
            }
            return "";
        }
    }

    6,每次进行对比下。。。验证

  • 相关阅读:
    stm32时钟分析
    STM32中断优先级彻底讲解
    STM32 外部中断简介
    sencha touch 选择器
    sench touch 页面跳转
    sencha touch 学习汇总(转)
    ES6项目构建(babel+gulp+webpack)
    sencha touch
    sencha touch 目录结构
    angular学习笔记(6)- 指令
  • 原文地址:https://www.cnblogs.com/pickKnow/p/11266654.html
Copyright © 2020-2023  润新知