赞
踩
目录
6.2.1 在service⼦⼯程添加Spring data redis依赖
6.2.2 在application.yml配置redis数据源
6.3.3 在ProductServiceImpl中修改业务代码
11.2.2 在需要只⽤⽤户信息的位置,直接根据token从redis查询
基于linux环境安装redis
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
yum -y install gcc
tar -zxvf redis-5.0.5.tar.gz
cd redis-5.0.5
make MALLOC=libc
make install
## 当我们完成 redis 安装之后,就可以执⾏ redis 相关的指令redis-server ## 启动 redis 服务redis-server &
redis-cli ## 启动redis操作客户端(命令⾏客户端)
redis-server redis-6380.conf & ## redis 以 redis-6380.conf ⽂件中的配置来启动
redis-server redis-6380.conf &redis-server redis-6381.conf &
## 设置 redis 实例(服务)为守护模式 , 默认值为 no ,可以设置为 yesdaemonize no## 设置当前 redis 实例启动之后保存进程 id 的⽂件路径pidfile /var/run/redis_6379.pid## 设置 redis 实例的启动端⼝(默认 6379 )port 6380## 设置当前 redis 实例是否开启保护模式protected-mode yes## 设置允许访问当前 redis 实例的 ip 地址列表bind 127.0.0.1## 设置连接密码requirepass 123456## 设置 redis 实例中数据库的个数(默认 16 个,编号 0-15 )databases 16## 设置最⼤并发数量maxclients## 设置客户端和 redis 建⽴连接的最⼤空闲时间,设置为 0 表示不限制timeout 0
## 设置值 / 修改值 如果 key 存在则进⾏修改set key value## 取值get key## 批量添加mset k1 v1 [k2 v2 k3 v3 ...]## 批量取值mget k1 [k2 k3...]## ⾃增和⾃减incr key ## 在 key 对应的 value 上⾃增 +1decr key ## 在 key 对应的 value 上⾃减 -1incrby key v ## 在 key 对应的 value 上 +vdecrby key v ## 在 key 对应的 value 上 -v## 添加键值对,并设置过期时间 (TTL)setex key time(seconds) value## 设置值,如果 key 不存在则成功添加,如果 key 存在则添加失败(不做修改操作)setnx key value## 在指定的 key 对应 value 拼接字符串append key value## 获取 key 对应的字符串的⻓度strlen key
## 向 key 对应的 hash 中添加键值对hset key field value## 从 key 对应的 hash 获取 field 对应的值hget key field## 向 key 对应的 hash 结构中批量添加键值对hmset key f1 v1 [f2 v2 ...]## 从 key 对应的 hash 中批量获取值hmget key f1 [f2 f3 ...]## 在 key 对应的 hash 中的 field 对应 value 上加 vhincrby key field v## 获取 key 对应的 hash 中所有的键值对hgetall key## 获取 key 对应的 hash 中所有的 fieldhkeys key## 获取 key 对应的 hash 中所有的 valuehvals key## 检查 key 对应的 hash 中是否有指定的 fieldhexists key field## 获取 key 对应的 hash 中键值对的个数hlen key## 向 key 对应的 hash 结构中添加 f-v, 如果 field 在 hash 中已经存在,则添加失败hsetnx key field value
## 存储数据lpush key value # 在 key 对应的列表的左侧添加数据 valuerpuhs key value # 在 key 对应的列表的右侧添加数据 value## 获取数据lpop key # 从 key 对应的列表的左侧取⼀个值rpop key # 从 key 对应的列表的右侧取⼀个值## 修改数据lset key index value # 修改 key 对应的列表的索引位置的数据(索引从左往右,从 0 开始)## 查看 key 对应的列表中索引从 start 开始到 stop 结束的所有值lrange key start stop## 查看 key 对应的列表中 index 索引对应的值lindex key index## 获取 key 对应的列表中的元素个数llen key## 从 key 对应的列表中截取 key 在 [start,stop] 范围的值,不在此范围的数据⼀律被清除掉ltrim key start stop## 从 k1 右侧取出⼀个数据存放到 k2 的左侧rpoplpush k1 k2
## 存储元素 :在 key 对应的集合中添加元素,可以添加 1 个,也可以同时添加多个元素sadd key v1 [v2 v3 v4...]## 遍历 key 对应的集合中的所有元素smembers key## 随机从 key 对于听的集合中获取⼀个值(出栈)spop key## 交集sinter key1 key2## 并集sunion key1 key2## 差集sdiff key1 key2## 从 key 对应的集合中移出指定的 valuesrem key value## 检查 key 对应的集合中是否有指定的 valuesismember key value
## 存储数据 (score 存储位置必须是数值,可以是 float 类型的任意数字; member 元素不允许重复 )zadd key score member [score member...]## 查看 key 对应的有序集合中索引 [start,stop] 数据 —— 按照 score 值由⼩到⼤( start 和stop 指的不是 score ,⽽是元素在有序集合中的索引)zrange key start top## 查看 member 元素在 key 对应的有序集合中的索引zscore key member## 获取 key 对应的 zset 中的元素个数zcard key## 获取 key 对应的 zset 中, score 在 [min,max] 范围内的 member 个数zcount key min max## 从 key 对应的 zset 中移除指定的 memberzrem key6 member## 查看 key 对应的有序集合中索引 [start,stop] 数据 —— 按照 score 值由⼤到⼩zrevrange key start stop
## 查看 redis 中满⾜ pattern 规则的所有的 key ( keys * )keys pattern## 查看指定的 key 谁否存在exists key## 删除指定的 key-value 对del key## 获取当前 key 的存活时间 ( 如果没有设置过期返回 -1 ,设置过期并且已经过期返回 -2)ttl key## 设置键值对过期时间expire key secondspexpire key milliseconds## 取消键值对过期时间persist key
## 切换数据库select index## 将键值对从当前 db 移动到⽬标 dbmove key index## 清空当前数据库数据flushdb## 清所有数据库的 k-vflushall## 查看当前 db 中 k-v 个数dbsize## 获取最后⼀次持久化操作时间lastsave
## rdb 持久化开关rdbcompression yes## 配置 redis 的持久化策略save 900 1save 300 10save 60 10000## 指定 rdb 数据存储的⽂件dbfilename dump.rdb
## 开启 AOFappendonly yes## 设置触发条件(三选⼀)appendfsync always ## 只要进⾏成功的写操作,就执⾏ aofappendfsync everysec ## 每秒进⾏⼀次 aofappendfsync no ## 让 redis 执⾏决定 aof## 设置 aof ⽂件路径appendfilename "appendonly.aof"
## 开启 AOFappendonly yes## 设置触发条件(三选⼀)appendfsync always ## 只要进⾏成功的写操作,就执⾏ aofappendfsync everysec ## 每秒进⾏⼀次 aofappendfsync no ## 让 redis 执⾏决定 aof## 设置 aof ⽂件路径appendfilename "appendonly.aof"
redis-server redis-6379.conf
- <!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
- <dependency>
- <groupId>redis.clients</groupId>
- <artifactId>jedis</artifactId>
- <version>2.9.0</version>
- </dependency>
- public static void main(String[] args) {
- Product product = new Product("101", "娃哈哈AD钙奶", 2.5);
- //1.连接redis
- Jedis jedis = new Jedis("47.96.11.185", 6379);
- //2.操作
- String s = jedis.set(product.getProductId(), new
- Gson().toJson(product));
- System.out.println(s);
- //3.关闭连接
- jedis.close();
- }
Spring Data Redis , part of the larger Spring Data family, provides easyconfiguration and access to Redis from Spring applications. It offers both low-leveland high-level abstractions for interacting with the store, freeing the user frominfrastructural concerns.Spring Data Redis 依赖中,提供了⽤于连接 redis 的客户端:
- RedisTemplate
- StringRedisTemplate
spring :redis :host : 47.96.11.185port : 6379database : 0password : 123456
- //1.string
- //添加数据 set key value
- stringRedisTemplate.boundValueOps(product.getProductId()).set(
- jsonstr);
- //2.hash
- stringRedisTemplate.boundHashOps("products").put(product.getProductId()
- ,jsonstr);
- //3.list
- stringRedisTemplate.boundListOps("list").leftPush("ccc");
- //4.set
- stringRedisTemplate.boundSetOps("s1").add("v2");
- //5.zset
- stringRedisTemplate.boundZSetOps("z1").add("v1",1.2);
- //添加数据 set key value
- stringRedisTemplate.boundValueOps(product.getProductId()).set(
- jsonstr);
- //添加数据时指定过期时间 setex key 300 value
- stringRedisTemplate.boundValueOps("103").set(jsonstr,300);
- //设置指定key的过期时间 expire key 20
- stringRedisTemplate.boundValueOps("103").expire(20, TimeUnit.SECONDS);
- //添加数据 setnx key value
- Boolean absent =
- stringRedisTemplate.boundValueOps("103").setIfAbsent(jsonstr);
- //string
- String o = stringRedisTemplate.boundValueOps("103").get();
- //hash
- Object v = stringRedisTemplate.boundHashOps("products").get("101");
- //list
- String s1 = stringRedisTemplate.boundListOps("list").leftPop();
- String s2 = stringRedisTemplate.boundListOps("list").rightPop();
- String s3 = stringRedisTemplate.boundListOps("list").index(1);
- //set
- Set<String> vs = stringRedisTemplate.boundSetOps("s1").members();
- //zset
- Set<String> vs2 = stringRedisTemplate.boundZSetOps("z1").range(0, 5);
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-data-redis</artifactId>
- </dependency>
spring :datasource :druid :driver-class-name : com.mysql.jdbc.Driver## 如果后端项⽬服务器和数据库服务器不在同⼀台主机,则需要修改 localhost 为数据库服务器 ip 地址url : jdbc : mysql : //localhost : 3306/fmmall2?characterEncoding=utf-8username : rootpassword : admin123redis :port : 6379host : 47.96.11.185database : 0password : 123456
- @Service
- public class IndexImgServiceImpl implements IndexImgService {
- @Autowired
- private IndexImgMapper indexImgMapper;
- @Autowired
- private StringRedisTemplate stringRedisTemplate;
- private ObjectMapper objectMapper = new ObjectMapper();
- public ResultVO listIndexImgs() {
- List<IndexImg> indexImgs = null;
- try {
- //1000个并发请求,请求轮播图
- String imgsStr =
- stringRedisTemplate.boundValueOps("indexImgs").get();
- //1000个请求查询到redis中的数据都是null
- if (imgsStr != null) {
- // 从redis中获取到了轮播图信息
- JavaType javaType = objectMapper.getTypeFactory()
- .constructParametricType(ArrayList.class,
- IndexImg.class);
- indexImgs = objectMapper.readValue(imgsStr, javaType);
- } else {
- // 1000个请求都会进⼊else
- // (service类在spring容器中是单例的,
- // 1000个并发会启动1000个线程来处理,但是公⽤⼀个service实 例)
- synchronized (this){
- // 第⼆次查询redis
- String s =
- stringRedisTemplate.boundValueOps("indexImgs").get();
- if(s == null){
- // 这1000个请求中,只有第⼀个请求再次查询redis时依然为
- null
- indexImgs = indexImgMapper.listIndexImgs();
- System.out.println("----------------查询数据
- 库");
- stringRedisTemplate.boundValueOps("indexImgs")
-
- .set(objectMapper.writeValueAsString(indexImgs));
- stringRedisTemplate.boundValueOps("indexImgs")
- .expire(1, TimeUnit.DAYS);
- }else{
- JavaType javaType =
- objectMapper.getTypeFactory()
- .constructParametricType(ArrayList.class,
- IndexImg.class);
- indexImgs = objectMapper.readValue(s,
- javaType);
- }
- }
- }
- } catch (JsonProcessingException e) {
- e.printStackTrace();
- }
- //返回数据
- if(indexImgs != null){
- return new ResultVO(ResStatus.OK,"success",indexImgs);
- }else{
- return new ResultVO(ResStatus.NO,"fail",null);
- }
- }
- }
- indexImgs = indexImgMapper.listIndexImgs();
- if(indexImgs != null) {
- String s = objectMapper.writeValueAsString(indexImgs);
- stringRedisTemplate.boundValueOps("indexImgs").set(s);
- stringRedisTemplate.boundValueOps("indexImgs").expire(1,
- TimeUnit.DAYS);
- }else{
- //当从数据库查询数据为null时,保存⼀个⾮空数据到redis,并设置过期时间
- stringRedisTemplate.boundValueOps("indexImgs").set("[]");
- stringRedisTemplate.boundValueOps("indexImgs").expire(10,
- TimeUnit.SECONDS);
- }
## 在 redis-5.0.5 ⽬录下创建 msconf ⽂件夹[root@theo redis-5.0.5] # mkdir msconf## 拷⻉ redis.conf ⽂件 到 msconf ⽂件夹 ---> redis-master.conf[root@theo redis-5.0.5] # cat redis.conf |grep -v "#" | grep -v "^$"> msconf/redis-master.conf## 修改 redis-master.conf 端⼝及远程访问设置[root@theo msconf] # vim redis-master.conf
## 将 redis-master.conf 拷⻉两份分别为: redis-slave1.conf redisslave2.conf[root@theo msconf] # sed 's/6380/6381/g' redis-master.conf > redisslave1.conf[root@theo msconf] # sed 's/6380/6382/g' redis-master.conf > redisslave2.conf## 修改 redis-slave1.conf redis-slave2.conf ,设置 “ 跟从 ”---127.0.0.16380[root@theo msconf] # vim redis-slave1.conf[root@theo msconf] # vim redis-slave2.conf
## 启动三个redis实例
[root@theo msconf] # redis-server redis-master.conf &[root@theo msconf] # redis-server redis-slave1.conf &[root@theo msconf] # redis-server redis-slave2.conf &
## ⾸先实现三个 redis 实例之间的主从配置(如上)## 创建并启动三个哨兵## 拷⻉ sentinel.conf ⽂件三份: sentinel-26380.conf sentinel-26382.confsentinel-26382.conf## 创建 sentinelconf ⽬录[root@theo redis-5.0.5] # mkdir sentinelconf## 拷⻉ sentinel.conf ⽂件到 sentinelconf ⽬录: sentinel-26380.conf[root@theo redis-5.0.5] # cat sentinel.conf | grep -v "#" | grep -v "^$"> sentinelconf/sentinel-26380.conf[root@theo redis-5.0.5] # cd sentinelconf/[root@theo sentinelconf] # lltotal 4-rw-r--r-- 1 root root 326 May 19 17 :09 sentinel-26380.conf## 编辑 sentinelconf/sentinel-26380.conf ⽂件[root@theo sentinelconf] # vim sentinel-26380.con
port 26380daemonize nopidfile "/var/run/redis-sentinel-26380.pid"logfile ""dir "/tmp"sentinel deny-scripts-reconfig yes# 此处配置默认的主库的 ip 和端⼝ 最后的数字是哨兵数量的⼀半多⼀个sentinel monitor mymaster 127 .0.0.1 6380 2sentinel config-epoch mymaster 1sentinel leader-epoch mymaster 1protected-mode no
[root@theo sentinelconf] # sed 's/26380/26381/g' sentinel-26380.conf >sentinel-26381.conf[root@theo sentinelconf] # sed 's/26380/26382/g' sentinel-26380.conf >sentinel-26382.conf
启动 主 redis启动 备 1redis启动 备 2redis再依次启动三个哨兵:[root@theo sentinelconf] # redis-sentinel sentinel-26380.conf
[root@theo ~] # cd /usr/local/redis-5.0.5[root@theo redis-5.0.5] # mkdir cluster-conf[root@theo redis-5.0.5] # cat redis.conf | grep -v "#"|grep -v "^$" >cluster-conf/redis-7001.conf[root@theo redis-5.0.5] # cd cluster-conf/[root@theo cluster-conf] # lsredis-7001.conf[root@theo cluster-conf] # vim redis-7001.conf
[root@theo cluster-conf] # sed 's/7001/7002/g' redis-7001.conf > redis-7002.conf[root@theo cluster-conf] # sed 's/7001/7003/g' redis-7001.conf > redis-7003.conf[root@theo cluster-conf] # sed 's/7001/7004/g' redis-7001.conf > redis-7004.conf[root@theo cluster-conf] # sed 's/7001/7005/g' redis-7001.conf > redis-7005.conf[root@theo cluster-conf] # sed 's/7001/7006/g' redis-7001.conf > redis-7006.conf
[root@theo cluster-conf] # redis-server redis-7001.conf &[root@theo cluster-conf] # redis-server redis-7002.conf &[root@theo cluster-conf] # redis-server redis-7003.conf &[root@theo cluster-conf] # redis-server redis-7004.conf &[root@theo cluster-conf] # redis-server redis-7005.conf &[root@theo cluster-conf] # redis-server redis-7006.conf &
[root@theo cluster-conf] # ps -ef|grep redisroot 4789 1 0 10 :20 ? 00 :00:00 redis-server *:7001[cluster]root 4794 1 0 10 :20 ? 00 :00:00 redis-server *:7002[cluster]root 4799 1 0 10 :20 ? 00 :00:00 redis-server *:7003[cluster]root 4806 1 0 10 :21 ? 00 :00:00 redis-server *:7004[cluster]root 4811 1 0 10 :21 ? 00 :00:00 redis-server *:7005[cluster]root 4816 1 0 10 :21 ? 00 :00:00 redis-server *:7006[cluster]
[root@theo cluster-conf] # redis-cli --cluster create 47.96.11.185:700147.96.11.185:7002 47.96.11.185:7003 47.96.11.185:7004 47.96.11.185:700547.96.11.185:7006 --cluster-replicas 1
[root@theo cluster-conf]# redis-cli -p 7001 -c
[root@theo cluster-conf] # redis-cli --cluster create47.96.11.185:7001 47.96.11.185:7002 47.96.11.185:700347.96.11.185:7004 47.96.11.185:7005 47.96.11.185:7006 --clusterreplicas 1
[root@theo cluster-conf] # redis-cli --cluster info 47.96.11.185:700147 .96.11.185:7001 (4678478a...) - > 2 keys | 5461 slots | 1 slaves.47 .96.11.185:7002 (e26eaf2a...) - > 0 keys | 5462 slots | 1 slaves.47 .96.11.185:7003 (5752eb20...) - > 1 keys | 5461 slots | 1 slaves.[OK] 3 keys in 3 masters.0 .00 keys per slot on average.
[root@theo cluster-conf] # redis-cli --cluster rebalance47.96.11.185:7001>>> Performing Cluster Check (using node 47 .96.11.185:7001)[OK] All nodes agree about slots configuration.>>> Check for open slots...>>> Check slots coverage...[OK] All 16384 slots covered.*** No rebalancing needed! All nodes are within the 2 .00% threshold.
[root@theo cluster-conf] # redis-cli --cluster del-node47.96.11.185:7001 4678478aa66b6d37b23944cf7db0ac07298538a4>>> Removing node 4678478aa66b6d37b23944cf7db0ac07298538a4 fromcluster 47 .96.11.185:7001>>> Sending CLUSTER FORGET messages to the cluster...>>> SHUTDOWN the node .[root@theo cluster-conf] # redis-cli --cluster info 47.96.11.185:700247 .96.11.185:7002 (e26eaf2a...) - > 1 keys | 8192 slots | 2 slaves.47 .96.11.185:7003 (5752eb20...) - > 2 keys | 8192 slots | 1 slaves.[OK] 3 keys in 2 masters.0 .00 keys per slot on average.
[root@theo cluster-conf] # redis-cli --cluster add-node47.96.11.185:7007 47.96.11.185:7002
<dependency><groupId> org.springframework.boot </groupId><artifactId> spring-boot-starter-data-redis </artifactId></dependency>
spring :redis :cluster :nodes : 47.96.11.185 : 7001,47.96.11.185 : 7002,47.96.11.185 : 7003max-redirects : 3
@RunWith ( SpringRunner . class )@SpringBootTest ( classes = RedisDemo3Application . class )class RedisDemo3ApplicationTests {@Autowiredprivate StringRedisTemplate stringRedisTemplate ;@Testvoid contextLoads () {//stringRedisTemplate.boundValueOps("key1").set("value1");String s = stringRedisTemplate . boundValueOps ( "key1" ). get ();System . out . println ( s );}}
# volatile-lru -> 从设置了过期时间的数据中淘汰最久未使⽤的数据 .# allkeys-lru -> 从所有数据中淘汰最久未使⽤的数据 .# volatile-lfu -> 从设置了过期时间的数据中淘汰使⽤最少的数据 .# allkeys-lfu -> 从所有数据中淘汰使⽤最少的数据 .# volatile-random -> 从设置了过期时间的数据中随机淘汰⼀批数据 .# allkeys-random -> 从所有数据中随机淘汰⼀批数据 .# volatile-ttl -> 淘汰过期时间最短的数据 .# noeviction -> 不淘汰任何数据,当内存不够时直接抛出异常 .
- @Service
- public class UserServiceImpl implements UserService {
- @Autowired
- private UsersMapper usersMapper;
- @Autowired
- private StringRedisTemplate stringRedisTemplate;
- private ObjectMapper objectMapper = new ObjectMapper();
- @Transactional
- public ResultVO userResgit(String name, String pwd) {
- //...
- }
- @Override
- public ResultVO checkLogin(String name, String pwd) {
- Example example = new Example(Users.class);
- Example.Criteria criteria = example.createCriteria();
- criteria.andEqualTo("username", name);
- List<Users> users = usersMapper.selectByExample(example);
- if(users.size() == 0){
- return new ResultVO(ResStatus.NO,"登录失败,⽤户名不存
- 在!",null);
- }else{
- String md5Pwd = MD5Utils.md5(pwd);
- if(md5Pwd.equals(users.get(0).getPassword())){
- //如果登录验证成功,则需要⽣成令牌token(token就是按照特定规则
- ⽣成的字符串)
- //使⽤jwt规则⽣成token字符串
- JwtBuilder builder = Jwts.builder();
- HashMap<String,Object> map = new HashMap<>();
- map.put("key1","value1");
- map.put("key2","value2");
- String token = builder.setSubject(name)
- .setIssuedAt(new Date())
-
- .setId(users.get(0).getUserId() + "")
-
- .setClaims(map)
-
- .setExpiration(new
- Date(System.currentTimeMillis() + 24*60*60*1000))
- .signWith(SignatureAlgorithm.HS256,
- "QIANfeng6666")
- .compact();
- //当⽤户登录成功之后,以token为key 将⽤户信息保存到reids
- try {
- String userInfo =
- objectMapper.writeValueAsString(users.get(0));
-
- stringRedisTemplate.boundValueOps(token).set(userInfo,30,
- TimeUnit.MINUTES);
- } catch (JsonProcessingException e) {
- e.printStackTrace();
- }
- return new ResultVO(ResStatus.OK,token,users.get(0));
- }else{
- return new ResultVO(ResStatus.NO,"登录失败,密码错
- 误!",null);
- }
- }
- }
- }
- @PostMapping("/add")
- public ResultVO addShoppingCart(@RequestBody ShoppingCart
- cart,@RequestHeader("token")String token) throws JsonProcessingException
- {
- ResultVO resultVO = shoppingCartService.addShoppingCart(cart);
- String s = stringRedisTemplate.boundValueOps(token).get();
- Users users = objectMapper.readValue(s, Users.class);
- System.out.println(users);
- return resultVO; }
- @Component
- public class CheckTokenInterceptor implements HandlerInterceptor {
- @Autowired
- private StringRedisTemplate stringRedisTemplate;
- @Override
- public boolean preHandle(HttpServletRequest request,
- HttpServletResponse response, Object handler) throws Exception {
- String method = request.getMethod();
- if("OPTIONS".equalsIgnoreCase(method)){
- return true;
- }
- String token = request.getHeader("token");
- if(token == null){
- ResultVO resultVO = new ResultVO(ResStatus.LOGIN_FAIL_NOT, "请先登录!", null);
- doResponse(response,resultVO);
- }else{
- //根据token从redis中获取⽤户信息
- String s = stringRedisTemplate.boundValueOps(token).get();
- if(s == null){
- //如果⽤户信息为空,表示⽤户未登录或者距离上⼀次访问超过30分钟
- ResultVO resultVO = new
- ResultVO(ResStatus.LOGIN_FAIL_NOT, "请先登录!", null);
- doResponse(response,resultVO);
- }else{
- // 如果不为空,表示⽤户登录成功,续命
- stringRedisTemplate.boundValueOps(token).expire(30,
- TimeUnit.MINUTES);
- return true;
- }
- }
- return false;
- }
- private void doResponse(HttpServletResponse response,ResultVO
- resultVO) throws IOException {
- response.setContentType("application/json");
- response.setCharacterEncoding("utf-8");
- PrintWriter out = response.getWriter();
- String s = new ObjectMapper().writeValueAsString(resultVO);
- out.print(s);
- out.flush();
- out.close();
- }
- }
- @Component
- public class SetTimeInterceptor implements HandlerInterceptor {
- @Autowired
- private StringRedisTemplate stringRedisTemplate;
- @Override
- public boolean preHandle(HttpServletRequest request,
- HttpServletResponse response, Object handler) {
- String token = request.getHeader("token");
- if(token != null){
- String s = stringRedisTemplate.boundValueOps(token).get();
- if(s != null){
- stringRedisTemplate.boundValueOps(token).expire(30,
- TimeUnit.MINUTES);
- }
- }
- return true;
- }
- }
- @Configuration
- public class InterceptorConfig implements WebMvcConfigurer {
- @Autowired
- private CheckTokenInterceptor checkTokenInterceptor;
- @Autowired
- private SetTimeInterceptor setTimeInterceptor;
- @Override
- public void addInterceptors(InterceptorRegistry registry) {
- registry.addInterceptor(checkTokenInterceptor)
- .addPathPatterns("/shopcart/**")
- .addPathPatterns("/orders/**")
- .addPathPatterns("/useraddr/**")
- .addPathPatterns("/user/check");
-
- registry.addInterceptor(setTimeInterceptor).addPathPatterns("/**");
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。