IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> SpringCloud:网关gateway -> 正文阅读

[Java知识库]SpringCloud:网关gateway

一、简介

网关是一个服务:
Spring Cloud GateWay是Spring Cloud的?个全新项?,?标是取代Netflix Zuul,基于Spring5.0+SpringBoot2.0+WebFlux(基于?性能的Reactor模式响应式通信框架Netty,异步?阻塞模型)等技术开发,性能?于Zuul,官?测试,GateWay是Zuul的1.6倍,旨在为微服务架构提供?种简单有效的统?的API路由管理?式。

二、开始使用

1.引入包(gateway)????????

<!-- 网关 -->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- 负载均衡 -->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

2. 配置nacos进行服务注册和发现

? ? ? ? 描述:使用nacos+gateway实现各模块服务的负载均衡

? ? ? ? nacos的配置使用可以参考文章:

????????SpringCloud:注册中心nacos_Cx_轩的博客-CSDN博客

3..yml配置

spring:
  application:
    name: Cx-gateway
  cloud:
    gateway:
      httpclient:
        connect-timeout: 90000  #连接超时 毫秒
        response-timeout: 90s #应答超时 java.time.Duration http状态码504
      discovery:
        locator:
          enabled: false # 启用探测器 默认false,开启后可以通过ip:port/服务名称/接口地址进行服务转发 
          lower-case-service-id: true # 路由名小写
      routes:
        - id: Cx-admin # admin后台
          uri: lb://Cx-admin
          predicates:
            - Path=/admin/**
          filters:
            - StripPrefix=1   # 过滤前缀 admin
        - id: Cx-es # es服务
          uri: lb://Cx-es
          predicates:
            - Path=/es/**
          filters:
            - StripPrefix=1   # 过滤前缀 es

此处对predicates断言进行使用描述:(常用的几种列举出来方便大家参考)

1.Path路径断言
predicates:

        -Path=/xx  # 拦截此路径下的所有请求发送到网关配置的uri (以一个模块一个路径去区分)
2.Query断言
predicates:

        -Query=name,age.  #参数值可以写正则,也可以只写参数名
3.Method断言
predicates:

        -Method=get 
4.Host断言
predicates:

        -Host=xxxx.com
5.Cookie断言
predicates:

        -Cookie=user,Cx #cookie断言和上面介绍的几种断言方式都大同小异,唯一不同的是他必须连同属性值一起验证,不能单独只验证属性是否存在
6.Header断言
predicates:

        -Header=id,1234\d+ # 正则表达式\d+ 数字,header断言是检查头信息里是否携带了相关属性或令牌
7.时间路由
predicates:
          - After=2022-02-07T17:05:00.789+08:00[Asia/Shanghai]  # 时间匹配有三种模式,分别是Before、After和Between,指定了在什么时间范围内路由才会生效

三、网关+单点登录使用

1.使用jwt生成无状态token令牌,然后在网关项目中进行auth验证。

2.创建网关全局拦截

@Configuration
@Component
@Slf4j
public class AuthFilter implements GlobalFilter,Ordered {
	
	private static final String AUTHORIZE_TOKEN = "token";

	private static AntPathMatcher matcher = new AntPathMatcher();
	
	@Override
	public int getOrder() {
		return 0;
	}

	@Override
	public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
		ServerHttpRequest request = exchange.getRequest();
		String url = request.getPath().toString();
		log.info("【登录拦截】获取请求地址路径:"+url);
		// 不需要拦截的url直接通过
		if(isNotAuth(url)){
			return chain.filter(exchange);
		}
		String token = request.getHeaders().getFirst(AUTHORIZE_TOKEN);
		if(StrUtil.isBlank(token)){
			token = request.getQueryParams().getFirst(AUTHORIZE_TOKEN);
		}
		if(StrUtil.isBlank(token)){
			log.info("【登录拦截】未获取到token值...");
			loginResponse(exchange);
		}
		log.debug("【登录拦截】获取token值:"+token);
		try {
			SSOToken ssoToken = SSOToken.parser(token);
			// 获取token中的用户名
			String userId = ssoToken.getId();
			log.info("【登录拦截】获取userId:"+userId);
        } catch (Exception e) {
        	log.error("【登录拦截】异常:"+e.getMessage());
            return loginResponse(exchange);
        }
		return chain.filter(exchange);
	}
	
	public static Mono<Void> loginResponse(ServerWebExchange exchange) {
        JSONObject json = JSONUtil.createObj();
        json.set("code", 401);
        json.set("msg", "请重新登陆授权");
        ServerHttpResponse response = exchange.getResponse();
        byte[] bytes = JSONUtil.toJsonStr(json).getBytes(StandardCharsets.UTF_8);
        //指定编码,否则在浏览器中会中文乱码
        response.getHeaders().add("Content-Type", "text/plain;charset=UTF-8");
        DataBuffer buffer = response.bufferFactory().wrap(bytes);
        return response.writeWith(Flux.just(buffer));
    }

	private boolean isNotAuth(String url) {
		List<String> uriList = new ArrayList<>();
		// admin后台不需要拦截
        uriList.add("/admin/**");
        uriList.add("/sso/login");
        
        for (String pattern : uriList) {
            if (matcher.match(pattern, url)) {
                // 不需要拦截
                return true;
            }
        }
		return false;
	}
}

上述代码中SSOToken就是jwt的封装,大家可以直接使用jwt进行解析即可。

注:此处使用jwt无状态token令牌,为了方便不同模块、不同前端项目针对不同ip和端口部署的分布式应用时在进行用户验权时可以不需要考虑会话session和cookie只需要将token存储在浏览器中即可全局使用。在访问时只校验token的有效性。所以在使用jwt的token时可以降低token的有效时长在增加安全性。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-07-05 23:25:27  更:2022-07-05 23:26:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 15:41:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码