120、项目中订单如何保证幂等性的?登录流程?MD5盐值?

本文讲述了项目中如何通过防重令牌、RedisLua脚本保证接口幂等性,使用订单编号和微信登录流程实现数据唯一性,以及使用BCryptPasswordEncoder进行安全密码存储。
摘要由CSDN通过智能技术生成

①我们在项目中保证了创建订单接口的幂等性,接口幂等性指的是在短时间内,用户对一个接口发起多次请求和一次请求的结果是一致的,不会因为多次点击而产生副作用。

在我们的项目中,用户点击课程的购买按钮后,后端会创建一个防重令牌token返回给前端并存入到Redis中,key是order:token前缀加上用户id,value是token,然后前端跳转到交易页面点击支付按钮后,后端会根据用户id去查询Redis中是否存在对应的token,存在的话就先对比Redis中的token和前端带来的token是否相同,相同的话就删除Redis中的token,这个步骤就相当于获取锁,成功删除token的线程才允许去创建订单。删除token的过程是使用lua脚本实现的,lua脚本能保证查询、对比、删除是一个原子操作,从而保证了线程安全。

if redis.call('get', KEYS[1]) == ARGV[1]
then return redis.call('del', KEYS[1])
else return 0 end

redisTemplate.execute(new DefaultRedisScript<>(script, Long.class),
                Arrays.asList(key),
                token);

其他保证幂等性的方案:给订单编号添加唯一索引,前端生成订单编号后传给后端,然后后端向数据库中插入数据时,如果此订单编号已经存在,就不能插入这条数据,保证了订单数据的唯一性。

②用户点击微信登录图标后,浏览器会跳转到微信的授权页面,然后用户扫码授权成功后,浏览器将会重定向到我们指定的redirect_uri并携带上一个code,然后前端将code返回给后端,后端拿着code、appid和app secret去访问一个微信自己的接口,用于获取access_token和openid,access_token是微信接口的调用凭证,比如如果我们想要获取用户的微信头像和昵称,就要带着access_token才能去请求微信相关接口,而openid是用户的唯一标识,我们会把它存入到数据库中,以便用户下次使用微信登录时系统能判断出是哪个用户登录的。

微信登录成功后会查询用户信息并存入到session中,我们整合了spring-session-data-redis用于解决分布式系统下session不共享问题,在Redis中key是sessionID,value是hash类型的,有4个filed,其中一个filed保存了用户信息,而在cookie中key是我们自定义的,value是sessionID。前端请求后端时会带着cookie,后端拿到cookie中的sessionID后就能去Redis中查询到对应的用户信息。

③使用BCryptPasswordEncoder工具类对密码进行MD5盐值加密,每次加密得到的结果是不一样的,但这几个结果都能正确匹配到原先的密码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值