SpringCloud初体验:七、gateway 网关服务如何做token验证
说说背景:假如有一个用户服在用户登录后,生成一个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 抽象类,代码如下:
- package cn.taxiong.tx_api_gateway_server.filter;
- import org.springframework.cloud.gateway.filter.GatewayFilter;
- import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
- import org.springframework.core.io.buffer.DataBuffer;
- import org.springframework.http.HttpHeaders;
- import org.springframework.http.server.reactive.ServerHttpResponse;
- import reactor.core.publisher.Mono;
- /**
- * JWT验证的过滤器
- *
- * @author szliugx@gmail.com
- * @create 2018-09-09 下午10:05
- **/
- public class JwtCheckGatewayFilterFactory extends AbstractGatewayFilterFactory<JwtCheckGatewayFilterFactory.Config> {
- public JwtCheckGatewayFilterFactory() {
- super(Config.class);
- }
- @Override
- public GatewayFilter apply(Config config) {
- return (exchange, chain) -> {
- String jwtToken = exchange.getRequest().getHeaders().getFirst("Authorization");
- //校验jwtToken的合法性
- if (jwtToken != null) {
- // 合法
- // 将用户id作为参数传递下去
- return chain.filter(exchange);
- }
- //不合法(响应未登录的异常)
- ServerHttpResponse response = exchange.getResponse();
- //设置headers
- HttpHeaders httpHeaders = response.getHeaders();
- httpHeaders.add("Content-Type", "application/json; charset=UTF-8");
- httpHeaders.add("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0");
- //设置body
- String warningStr = "未登录或登录超时";
- DataBuffer bodyDataBuffer = response.bufferFactory().wrap(warningStr.getBytes());
- return response.writeWith(Mono.just(bodyDataBuffer));
- };
- }
- public static class Config {
- //Put the configuration properties for your filter here
- }
- }
二、需要将自定义的 GatewayFilterFactory 注入到Spring 中
- package cn.taxiong.tx_api_gateway_server.config;
- import cn.taxiong.tx_api_gateway_server.filter.JwtCheckGatewayFilterFactory;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- /**
- * 应用配置
- *
- * @author szliugx@gmail.com
- * @create 2018-09-09 下午10:57
- **/
- @Configuration
- public class AppConfig {
- @Bean
- public JwtCheckGatewayFilterFactory jwtCheckGatewayFilterFactory(){
- return new JwtCheckGatewayFilterFactory();
- }
- }
三、网关服务的配置文件中配置 自定义过滤器 生效的服务
这里只配置了 php 这个服务,java 这个服务不使用这个过滤器规则
SpringCloud初体验:七、gateway 网关服务如何做token验证的更多相关文章
- SpringCloud初体验:五、Sidecar 将 PHP 这类非 Java 生态语言的服务接入 Spring Cloud
先起一个 Sidecar 服务,一个PHP服务一个应用,和PHP服务部署在同一台机子,通过 localhost 访问,这样就解决了网络开销,相当于本地进程间调用 Sidecar 服务比较简单, 1.这 ...
- Spring Cloud gateway 网关服务二 断言、过滤器
微服务当前这么火爆的程度,如果不能学会一种微服务框架技术.怎么能升职加薪,增加简历的筹码?spring cloud 和 Dubbo 需要单独学习.说没有时间?没有精力?要学俩个框架?而Spring C ...
- SpringCloud初体验:四、API GateWay 服务网关
网关服务很多,比如:Zuul.Kong.spring cloud gateway ……, 这里不纠结哪种性能好,本次体验是用的 spring cloud gateway 更多网关比较可以了解这篇文章: ...
- SpringCloud初体验:前言
体验了一天 SpringCloud 后发现,人们所讲的微服务架构不是一门技术,而是一种风格. 感觉确实可以这么认同,因为一套 SpringCloud 玩下来(未深入.未完整「链路追踪.动态刷新配置…… ...
- SpringCloud(四)GateWay网关
GateWay网关 概述简介 Gateway是在 Spring生态系统之上构建的AP网关服务,基于 Spring5, Spring Boot2和 Project Reactor等技术. Gateway ...
- 关于Ocelot和Consul 实现GateWay(网关) 服务注册 负载均衡等方面
Ocelot 路由 请求聚合 服务发现 认证 鉴权 限流熔断 内置负载均衡器 Consul 自动服务发现 健康检查 通过Ocelot搭建API网关 服务注册 负载均衡 1. ...
- Spring Cloud gateway 网关服务 一
之前我们介绍了 zuul网关服务,今天聊聊spring cloud gateway 作为spring cloud的亲儿子网关服务.很多的想法都是参照zuul,为了考虑zuul 迁移到gateway 提 ...
- springCloud学习05之api网关服务zuul过滤器filter
前面学习了zuul的反向代理.负载均衡.fallback回退.这张学习写过滤器filter,做java web开发的对filter都不陌生,那就是客户端(如浏览器)发起请求的时候,都先经过过滤器fil ...
- SpringCloud初体验:六、利用 Sleuth 和 Zipkin 给微服务加上链路监控追踪查看功能
首先:装上 Zipkin 服务,收集调用链跟踪数据,体验时装在了本机docker上, 方便快捷 docker run -d -p : openzipkin/zipkin 安装后访问地址也是 9411端 ...
随机推荐
- list<map>排序
@Test public void test_when_test1() throws Exception { String[] strs = {"e", "ee" ...
- idea列表
Idea列表
- BZOJ1300 [LLH邀请赛]大数计算器
一开始以为暴力搞,后来看了数据范围还以为要FFT,各种被虐,然后Orz Seter大神!!! 我只想到了前三位:a * b <=> 10^(log(a) + log(b)),于是把乘的数都 ...
- MinGW的gdb调试
MinGW(Minimalist GNU for Windows)提供了一套简单方便的Windows下的基于GCC程序开发环境.MinGW收集了一系列免费的Windows是用的头文件和库文件: ...
- QueryPerformanceFrequency
var c1: int64; t1, t2: int64; QueryPerformanceFrequency(c1); QueryPerformanceCounter(t1); // GetSell ...
- Java——多线程小例子
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- IIS7.5 与 Tomcat 8整合
IIS需要与Tomcat共用80端口,现在只能通过IIS来转发请求给Tomcat实现,即所谓的整合: 一.下载The Apache Tomcat Connector,下载地址是:http://www. ...
- Quartz表结构说明
一.表信息解析: 1.1. qrtz_blob_triggers : 以Blob 类型存储的触发器. 1.2. qrtz_calendars:存放日历信息, quartz可配置一个日历来指定一个时间范 ...
- ArcEngine 9.3与64位操作系统 冲突
ArcEngine 9.3与64位操作系统 冲突 2011年03月30日 星期三 11:13 错误信息: 未处理 System.TypeInitializationException Message ...
- 深入理解Linux网络技术内幕——网络设备初始化
概述 内核的初始化过程过程中,与网络相关的工作如下所示: 内核引导时执行start_kernel,start_kernel结束之前会调用rest_init,rest_init初始化内核线 ...