说说背景:假如有一个用户服在用户登录后,生成一个token给到客户端,用户每次请求时都需要这个token,于是每次都会在网关 gateway 校验,校验通过后网关从token中解析出userId,然后将userId送到各个服务。

比如现在有一个 java 服务 和 一个 php 服务,从网关访问的URL 分别是 http://127.0.0.1:8201/java/ 和 http://127.0.0.1:8201/php/,现在暂时只需对 php 这个服务验证,先看效果图

spring cloud gateway 的官网文档地址:http://cloud.spring.io/spring-cloud-gateway/single/spring-cloud-gateway.html#_addrequestheader_gatewayfilter_factory

一、需要自定义 GatewayFilterFactory 继承  AbstractGatewayFilterFactory 抽象类,代码如下:

  1. package cn.taxiong.tx_api_gateway_server.filter;
  2.  
  3. import org.springframework.cloud.gateway.filter.GatewayFilter;
  4. import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
  5. import org.springframework.core.io.buffer.DataBuffer;
  6. import org.springframework.http.HttpHeaders;
  7. import org.springframework.http.server.reactive.ServerHttpResponse;
  8. import reactor.core.publisher.Mono;
  9.  
  10. /**
  11. * JWT验证的过滤器
  12. *
  13. * @author szliugx@gmail.com
  14. * @create 2018-09-09 下午10:05
  15. **/
  16. public class JwtCheckGatewayFilterFactory extends AbstractGatewayFilterFactory<JwtCheckGatewayFilterFactory.Config> {
  17.  
  18. public JwtCheckGatewayFilterFactory() {
  19. super(Config.class);
  20. }
  21.  
  22. @Override
  23. public GatewayFilter apply(Config config) {
  24. return (exchange, chain) -> {
  25. String jwtToken = exchange.getRequest().getHeaders().getFirst("Authorization");
  26. //校验jwtToken的合法性
  27. if (jwtToken != null) {
  28. // 合法
  29. // 将用户id作为参数传递下去
  30. return chain.filter(exchange);
  31. }
  32.  
  33. //不合法(响应未登录的异常)
  34. ServerHttpResponse response = exchange.getResponse();
  35. //设置headers
  36. HttpHeaders httpHeaders = response.getHeaders();
  37. httpHeaders.add("Content-Type", "application/json; charset=UTF-8");
  38. httpHeaders.add("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0");
  39. //设置body
  40. String warningStr = "未登录或登录超时";
  41. DataBuffer bodyDataBuffer = response.bufferFactory().wrap(warningStr.getBytes());
  42.  
  43. return response.writeWith(Mono.just(bodyDataBuffer));
  44. };
  45. }
  46.  
  47. public static class Config {
  48. //Put the configuration properties for your filter here
  49. }
  50. }

二、需要将自定义的 GatewayFilterFactory 注入到Spring 中

  1. package cn.taxiong.tx_api_gateway_server.config;
  2.  
  3. import cn.taxiong.tx_api_gateway_server.filter.JwtCheckGatewayFilterFactory;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6.  
  7. /**
  8. * 应用配置
  9. *
  10. * @author szliugx@gmail.com
  11. * @create 2018-09-09 下午10:57
  12. **/
  13. @Configuration
  14. public class AppConfig {
  15. @Bean
  16. public JwtCheckGatewayFilterFactory jwtCheckGatewayFilterFactory(){
  17. return new JwtCheckGatewayFilterFactory();
  18. }
  19. }

三、网关服务的配置文件中配置 自定义过滤器 生效的服务

这里只配置了 php 这个服务,java 这个服务不使用这个过滤器规则

SpringCloud初体验:七、gateway 网关服务如何做token验证的更多相关文章

  1. SpringCloud初体验:五、Sidecar 将 PHP 这类非 Java 生态语言的服务接入 Spring Cloud

    先起一个 Sidecar 服务,一个PHP服务一个应用,和PHP服务部署在同一台机子,通过 localhost 访问,这样就解决了网络开销,相当于本地进程间调用 Sidecar 服务比较简单, 1.这 ...

  2. Spring Cloud gateway 网关服务二 断言、过滤器

    微服务当前这么火爆的程度,如果不能学会一种微服务框架技术.怎么能升职加薪,增加简历的筹码?spring cloud 和 Dubbo 需要单独学习.说没有时间?没有精力?要学俩个框架?而Spring C ...

  3. SpringCloud初体验:四、API GateWay 服务网关

    网关服务很多,比如:Zuul.Kong.spring cloud gateway ……, 这里不纠结哪种性能好,本次体验是用的 spring cloud gateway 更多网关比较可以了解这篇文章: ...

  4. SpringCloud初体验:前言

    体验了一天 SpringCloud 后发现,人们所讲的微服务架构不是一门技术,而是一种风格. 感觉确实可以这么认同,因为一套 SpringCloud 玩下来(未深入.未完整「链路追踪.动态刷新配置…… ...

  5. SpringCloud(四)GateWay网关

    GateWay网关 概述简介 Gateway是在 Spring生态系统之上构建的AP网关服务,基于 Spring5, Spring Boot2和 Project Reactor等技术. Gateway ...

  6. 关于Ocelot和Consul 实现GateWay(网关) 服务注册 负载均衡等方面

    Ocelot   路由  请求聚合  服务发现 认证  鉴权 限流熔断 内置负载均衡器 Consul   自动服务发现    健康检查 通过Ocelot搭建API网关   服务注册   负载均衡 1. ...

  7. Spring Cloud gateway 网关服务 一

    之前我们介绍了 zuul网关服务,今天聊聊spring cloud gateway 作为spring cloud的亲儿子网关服务.很多的想法都是参照zuul,为了考虑zuul 迁移到gateway 提 ...

  8. springCloud学习05之api网关服务zuul过滤器filter

    前面学习了zuul的反向代理.负载均衡.fallback回退.这张学习写过滤器filter,做java web开发的对filter都不陌生,那就是客户端(如浏览器)发起请求的时候,都先经过过滤器fil ...

  9. SpringCloud初体验:六、利用 Sleuth 和 Zipkin 给微服务加上链路监控追踪查看功能

    首先:装上 Zipkin 服务,收集调用链跟踪数据,体验时装在了本机docker上, 方便快捷 docker run -d -p : openzipkin/zipkin 安装后访问地址也是 9411端 ...

随机推荐

  1. list<map>排序

    @Test public void test_when_test1() throws Exception { String[] strs = {"e", "ee" ...

  2. idea列表

    Idea列表  

  3. BZOJ1300 [LLH邀请赛]大数计算器

    一开始以为暴力搞,后来看了数据范围还以为要FFT,各种被虐,然后Orz Seter大神!!! 我只想到了前三位:a * b <=> 10^(log(a) + log(b)),于是把乘的数都 ...

  4. MinGW的gdb调试

        MinGW(Minimalist GNU for Windows)提供了一套简单方便的Windows下的基于GCC程序开发环境.MinGW收集了一系列免费的Windows是用的头文件和库文件: ...

  5. QueryPerformanceFrequency

    var c1: int64; t1, t2: int64; QueryPerformanceFrequency(c1); QueryPerformanceCounter(t1); // GetSell ...

  6. Java——多线程小例子

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  7. IIS7.5 与 Tomcat 8整合

    IIS需要与Tomcat共用80端口,现在只能通过IIS来转发请求给Tomcat实现,即所谓的整合: 一.下载The Apache Tomcat Connector,下载地址是:http://www. ...

  8. Quartz表结构说明

    一.表信息解析: 1.1. qrtz_blob_triggers : 以Blob 类型存储的触发器. 1.2. qrtz_calendars:存放日历信息, quartz可配置一个日历来指定一个时间范 ...

  9. ArcEngine 9.3与64位操作系统 冲突

    ArcEngine 9.3与64位操作系统 冲突 2011年03月30日 星期三 11:13 错误信息: 未处理 System.TypeInitializationException  Message ...

  10. 深入理解Linux网络技术内幕——网络设备初始化

    概述    内核的初始化过程过程中,与网络相关的工作如下所示:     内核引导时执行start_kernel,start_kernel结束之前会调用rest_init,rest_init初始化内核线 ...