文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringCloud Gateway中怎么配置fastjson序列化验证

2023-06-05 02:22

关注

本篇内容主要讲解“SpringCloud Gateway中怎么配置fastjson序列化验证”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringCloud Gateway中怎么配置fastjson序列化验证”吧!

首先在maven中引入reactive redis包和fastjson包

<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-data-redis-reactive</artifactId></dependency><dependency>    <groupId>com.alibaba</groupId>    <artifactId>fastjson</artifactId>    <version>${fastjson.version}</version></dependency>

编写RedisAutoConfig.class进行自定义ReactiveRedisTemplate Bean配置

我这里使用的是ReactiveRedisTemplate<String, Object>,key为String类型,value为Object类型,这样value可以直接使用Java对象操作,不需要显示进行fastjson的序列化和反序列化。

需要注意的是new ReactiveRedisTemplate时需要传入1个RedisSerializationContext对象,redis的key、value序列化方式就配置在RedisSerializationContext中。

这里我们使用StringRedisSerializer进行key和hashKey的序列化,使用fastjson的GenericFastJsonRedisSerializer进行value和hashValue的序列化。

@Configurationpublic class RedisAutoConfig {    @Bean    public ReactiveRedisTemplate<String, Object> reactiveRedisTemplate(LettuceConnectionFactory connectionFactory) {        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();        GenericFastJsonRedisSerializer fastJsonRedisSerializer = new GenericFastJsonRedisSerializer();        RedisSerializationContext.SerializationPair<String> keySerializationPair =             RedisSerializationContext.SerializationPair.fromSerializer(stringRedisSerializer);        RedisSerializationContext.SerializationPair<Object> valueSerializationPair =             RedisSerializationContext.SerializationPair.fromSerializer(fastJsonRedisSerializer);        RedisSerializationContext.SerializationPair<Object> hashValueSerializationPair =             RedisSerializationContext.SerializationPair.fromSerializer(fastJsonRedisSerializer);        RedisSerializationContext<String, Object> context = new RedisSerializationContext<String, Object>() {            @Override            public SerializationPair getKeySerializationPair() {                return keySerializationPair;            }            @Override            public SerializationPair getValueSerializationPair() {                return valueSerializationPair;            }            @Override            public SerializationPair getHashKeySerializationPair() {                return keySerializationPair;            }            @Override            public SerializationPair getHashValueSerializationPair() {                return hashValueSerializationPair;            }            @Override            public SerializationPair<String> getStringSerializationPair() {                return keySerializationPair;            }        };        return new ReactiveRedisTemplate<>(connectionFactory, context);    }}

这样配置完成后,就可以直接自动注入ReactiveRedisTemplate<String, Object>对象

@Autowiredprivate ReactiveRedisTemplate<String, Object> reactiveRedisTemplate;

首先在maven中引入spring cloud gateway依赖

<dependency>    <groupId>org.springframework.cloud</groupId>    <artifactId>spring-cloud-starter-gateway</artifactId></dependency>

编写自定义filter factory TokenVerifyGatewayFilterFactory进行自定义token校验

首先从request的header中取出token字段,根据token查询redis,取出token对应的用户id,如果用户id存在则token有效,如果不存在则返回token无效。

@Componentpublic class TokenVerifyGatewayFilterFactory extends AbstractGatewayFilterFactory<Object> {    @Autowired    private ReactiveRedisTemplate<String, Object> 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<Optional<String>> 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序列化验证”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯