本篇内容主要讲解“SpringCloud Gateway中怎么配置fastjson序列化验证”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringCloud Gateway中怎么配置fastjson序列化验证”吧!
成都创新互联公司专注于澄江企业网站建设,响应式网站,成都商城网站开发。澄江网站建设公司,为澄江等地区提供建站服务。全流程按需定制,专业设计,全程项目跟踪,成都创新互联公司专业和态度为您提供的服务
首先在maven中引入reactive redis包和fastjson包
org.springframework.boot spring-boot-starter-data-redis-reactive com.alibaba fastjson ${fastjson.version}
编写RedisAutoConfig.class进行自定义ReactiveRedisTemplate Bean配置
我这里使用的是ReactiveRedisTemplate
需要注意的是new ReactiveRedisTemplate时需要传入1个RedisSerializationContext对象,redis的key、value序列化方式就配置在RedisSerializationContext中。
这里我们使用StringRedisSerializer进行key和hashKey的序列化,使用fastjson的GenericFastJsonRedisSerializer进行value和hashValue的序列化。
@Configuration public class RedisAutoConfig { @Bean public ReactiveRedisTemplatereactiveRedisTemplate(LettuceConnectionFactory connectionFactory) { StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); GenericFastJsonRedisSerializer fastJsonRedisSerializer = new GenericFastJsonRedisSerializer(); RedisSerializationContext.SerializationPair keySerializationPair = RedisSerializationContext.SerializationPair.fromSerializer(stringRedisSerializer); RedisSerializationContext.SerializationPair
这样配置完成后,就可以直接自动注入ReactiveRedisTemplate
@Autowired private ReactiveRedisTemplatereactiveRedisTemplate;
首先在maven中引入spring cloud gateway依赖
org.springframework.cloud spring-cloud-starter-gateway
编写自定义filter factory TokenVerifyGatewayFilterFactory进行自定义token校验
首先从request的header中取出token字段,根据token查询redis,取出token对应的用户id,如果用户id存在则token有效,如果不存在则返回token无效。
@Component public class TokenVerifyGatewayFilterFactory extends AbstractGatewayFilterFactory{ @Autowired private ReactiveRedisTemplate reactiveRedisTemplate; @Override public GatewayFilter apply(Object config) { return (exchange, chain) -> { ServerHttpRequest request = exchange.getRequest(); String token = request.getHeaders().get("token").get(0); return this.getUserId(token).flatMap(op -> { //1、判断redis中是否存在对应缓存,不存在则直接返回token无效 if (!op.isPresent()) { ServerHttpResponse response = exchange.getResponse(); byte[] bits = "token无效".getBytes(StandardCharsets.UTF_8); DataBuffer buffer = response.bufferFactory().wrap(bits); response.setStatusCode(HttpStatus.UNAUTHORIZED); response.getHeaders().add("Content-Type", "text/plain;charset=UTF-8"); return response.writeWith(Mono.just(buffer)); } //2、缓存有效,获取userId,进行日志记录或者其他操作 System.out.println("redis缓存token用户:" + op.get()); //3、token鉴权通过,继续执行filter完成转发 return chain.filter(exchange); }); }; } private Mono > getUserId(String token) { //a、以reactive的方式查询redis,获取token对应value值 return this.reactiveRedisTemplate.opsForValue().get(token) //b、对redis返回结果进行Optional封装,这里v为String类型的用户id .map(v -> Optional.ofNullable((String)v)) //c、如果token无效,b不会执行,在这里返回1个值为null的Optional对象 .switchIfEmpty(Mono.just(Optional.ofNullable(null))); } }
编写SpringCloudGateway配置文件
对于任意uri,都使用TokenVerifyGatewayFilterFactory进行请求过滤,并将localhost:8080的任意请求转发至https://www.baidu.com。
spring: cloud: gateway: routes: - id: testRoute uri: https://www.baidu.com predicates: - Path=/** filters: - TokenVerify
Redis缓存数据设置
在Redis中缓存key=”goodToken”,value=”magicTan”,即goodToken是合法token,用户id为magicTan。如果使用不合法token如invalidToken就无法取到用户id。
运行项目进行测试
调用localhost:8080,header中设置token为goodToken,可以看到请求转发至百度,并且控制台输出了缓存的用户id
到此,相信大家对“SpringCloud Gateway中怎么配置fastjson序列化验证”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!