在前后端分离的背景下,会存在跨域的问题,导致前端每一次请求的session id都不一样(可以打印request.getSession().getId()来查看每次请求的session id),这使得传统的 session 存储机制不在适用于某些场景,例如:在存储后端生成的校验码、短信验证码等,之后的校验请求进来之后会因为session域不同,拿不到session中存储的信息。Tip:对于存储当前登录的用户身份信息,要用session保存的话,可在拦截器中判断当前请求session中用户信息是否为空,为空则再存储一遍,再去处理本次请求的后续逻辑代码即可!二、ExpiringMap:一个轻量级的Java缓存方式
对于以上提出跨域时存在的问题,可用一些缓存中间件(如常用的Redis)来解决,但对于小体量的项目,存储的数据量也不是很大(如校验码)的情况下,使用Redis会增加系统的复杂性和维护难度。ExpiringMap就是一个轻量的Java缓存方式,它的功能和Redis类似。ExpiringMap特点:可设置存储元素的过期时间,可设置最大的数据元素存储量,可添加监听事件和设置懒加载等。1、导入ExpiringMap依赖,可到Maven仓库选择需要的依赖版本:
https://mvnrepository.com/artifact/net.jodah/expiringmap
![](https://oss-emcsprod-public.modb.pro/wechatSpider/modb_20211116_d0a351c4-46c8-11ec-a469-fa163eb4f6be.png)
2、初始化一个ExpiringMap(配置过期时间、过期协议等)![](https://oss-emcsprod-public.modb.pro/wechatSpider/modb_20211116_d0ea39e0-46c8-11ec-a469-fa163eb4f6be.png)
ExpirationPolicy.ACCESSED。前者每次更新元素时,过期时间会同时清零;后者是在每次访问元素时,过期时间同时清零。Tip:ExpiringMap的存和取,与普通 Map<K,V> 一样put,get![](https://oss-emcsprod-public.modb.pro/wechatSpider/modb_20211116_d1218b48-46c8-11ec-a469-fa163eb4f6be.png)
个人开发小习惯,使用 Hutool 生成6个随机数(数字,不包含字母和符号)作为验证码import cn.hutool.core.util.RandomUtil;
String smsCode = RandomUtil.randomNumbers(6);