ExpiringMap:解决前后端跨域时拿不到验证码

个人公众号(小程序同名): 遇见0和1
Hexo博客: http://vogos.cn


在这里插入图片描述

一、前言

  在前后端分离的背景下,会存在跨域的问题,导致前端每一次请求的session id都不一样(可以打印request.getSession().getId()来查看每次请求的session id),这使得传统的 session 存储机制不在适用于某些场景,例如:在存储后端生成的校验码短信验证码等,之后的校验请求进来之后会因为session不同,拿不到session中存储的信息。

Tip: 对于存储当前登录的用户身份信息,要用session保存的话,可在拦截器中判断当前请求session中用户信息是否为空,为空则再存储一遍,再去处理本次请求的后续逻辑代码即可!


二、ExpiringMap:一个轻量的Java缓存方式

  对于以上提出跨域时存在的问题,可用一些缓存中间件(如常用的Redis)来解决,但对于小体量的项目,存储的数据量也不是很大(如校验码)的情况下,使用Redis会增加系统的复杂性和维护难度。ExpiringMap就是一个轻量的Java缓存方式,它的功能和Redis类似。

ExpiringMap特点: 可设置存储元素的过期时间,可设置最大的数据元素存储量,可添加监听事件和设置懒加载等。


三、ExpiringMap 使用示例

1、导入ExpiringMap依赖,可到Maven仓库选择需要的依赖版本:https://mvnrepository.com/artifact/net.jodah/expiringmap

<dependency>
    <groupId>net.jodah</groupId>
    <artifactId>expiringmap</artifactId>
    <version>0.5.9</version>
</dependency>

2、初始化一个ExpiringMap(配置过期时间、过期协议等)
Tip: 过期协议分有两种:ExpirationPolicy.CREATEDExpirationPolicy.ACCESSED。前者每次更新元素时,过期时间会同时清零;后者是在每次访问元素时,过期时间同时清零。

import net.jodah.expiringmap.ExpirationPolicy;
import net.jodah.expiringmap.ExpiringMap;

//解决跨域session不一致拿不到保存的验证码问题
private final static ExpiringMap<String,Object> ExMap = ExpiringMap.builder()
         //设置过期时间,60秒
         .expiration(60, TimeUnit.SECONDS)
         //设置过期协议
         .expirationPolicy(ExpirationPolicy.ACCESSED)
         .variableExpiration()
         .build();

3、使用ExpiringMap存和取
Tip: ExpiringMap的存和取,与普通 Map<K,V> 一样put,get

//ExMap存一个字符串对象
ExMap.put(userInfo.getUserId(),smsCodeMap.get("smsCode"));

//取出ExMap中存的smsCode
String smsCode = ExMap.get(userInfo.getUserId()).toString()

四、拓展

  个人开发小习惯,使用 Hutool 生成6个随机数(数字,不包含字母和符号)作为验证码

import cn.hutool.core.util.RandomUtil;

String smsCode = RandomUtil.randomNumbers(6);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值