0
点赞
收藏
分享

微信扫一扫

4.9 Gateway 网关以及跨域

4.9 Gateway 网关以及跨域

1.创建 SpringBoot Module(qilemo-gateway) ,

Project Metadata
Group: com.qilemo
Artifact: qilemo-gateway
Type: Maven Project
Language: java
Packaging: jar
Java Version: 11
Version: 0.0.1-SNAPSHOT
Name: qilemo-gateway
Description: API网关
Package: com.qilemo.gateway

2.在 qilemo 聚合配置文件中添加新 module (pom.xml);

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.qilemo</groupId>
    <artifactId>qilemo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>qilemo</name>
    <description>聚合服务</description>
    <packaging>pom</packaging>

    <modules>
        <module>qilemo-product</module>
        <module>qilemo-ware</module>
        <module>qilemo-coupon</module>
        <module>qilemo-member</module>
        <module>qilemo-order</module>
        <module>renren-fast</module>
        <module>renren-generator</module>
        <module>qilemo-common</module>
        <module>qilemo-gateway</module>
    </modules>

</project>

3.在 qilemo-gateway 下的配置文件(pom.xml)中引用 qilemo-common 依赖;

        <dependency>
            <groupId>com.qilemo</groupId>
            <artifactId>qilemo-common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

4.开启注册发现,并且排除从 common 中引用的数据源相关的内容(QilemoGatewayApplication.java主程序),@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) ;

@EnableDiscoveryClient
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class QilemoGatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(QilemoGatewayApplication.class, args);
    }

}

5.创建nacos注册发现(application.properties),nacos配置管理(boostrap.properties)配置文件

注册发现:application.properties
spring.cloud.nacos.discovery.server-addr=localhost:8848
spring.application.name=qilemo-gateway

server.port=88

配置管理:boostrap.properties

spring.cloud.nacos.config.server-addr=localhost:8848
spring.application.name=qilemo-gateway

#如果配置文件保存在线上nacos配置管理中,使用以下方法进行引用;
#spring.cloud.nacos.config.namespace=e6e1bdc5-d6eb-4137-8f1e-66ce78da6131
#spring.cloud.nacos.config.group=DEFAULT_GROUP
#
#spring.cloud.nacos.config.extension-configs[0].data-id=nacos-discovery
#spring.cloud.nacos.config.extension-configs[0].group=DEFAULT_GROUP
#spring.cloud.nacos.config.extension-configs[0].refresh=true

6.创建新的路由规则配置文件(application.yml);

路由规则:不管有多少条路由规则都需要遵守从小到大的原则,既下面的路径范围包含了上面的路径;最大的规则范围一定要放在最后面,如:所有来源于 /api/** 开头的请求,都转发到 /renren-fast/ 服务下;如果要添加新的路由规则,就需要在 admin-route 路由规则之上进行添加;

spring:
  cloud:
    gateway:
      routes:
#       商品服务路由
        - id: product-route
          uri: lb://qilemo-product
          predicates:
            - Path=/api/product/**
          filters:
            - RewritePath=/api/(?<segment>.*), /$\{segment}
#       admin全局路由,所有api开头的请求都转发到renren-fast
        - id: admin-route
          uri: lb://renren-fast
          predicates:
            - Path=/api/**
          filters:
            - RewritePath=/api/(?<segment>.*), /renren-fast/$\{segment}

7.跨源资源共享(CORS)

出于安全性,浏览器限制脚本内发起的跨源HTTP请求。不允许访问网段不相同下的资源,所以如果想要在不同的微服务之间进行通讯,就需要使用到 CORS 跨域资源共享;

7.1在网关微服务下创建Cors配置类(config.QilemoCorsConfiguration.java);

进行跨域配置:

@Configuration
public class QilemoCorsConfiguration {

    @Bean
    public CorsWebFilter corsWebFilter(){
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration configuration = new CorsConfiguration();
        //1.跨域配置
        configuration.addAllowedHeader("*");//允许那些请求头跨域,"*"表示所有头
        configuration.addAllowedMethod("*");//允许那些请求方式跨域,"*"表示所有方式
//        configuration.addAllowedOrigin("*");//如果使用这条语句配置的请求来源在运行时提示错误,请使用下面的方式;
        configuration.addAllowedOriginPattern("*");//允许那个请求来源跨域,"*"表示所有来源
        configuration.setAllowCredentials(true);//是否允许携带cookie进行跨域,true:表示允许。

        source.registerCorsConfiguration("/**",configuration);
        return new CorsWebFilter(source);
    }

}

跨域配置类配置好后,提示如下错误:使用上面的代码;

java.lang.IllegalArgumentException: When allowCredentials is true, allowedOrigins cannot contain the special value "*" since that cannot be set on the "Access-Control-Allow-Origin" response header.  To allow credentials to a set of origins, list them explicitly or consider using "allowedOriginPatterns" instead.

7.2.测试页面登陆是否成功,

如果登陆时依然提示错误,错误内容为:有多个请求头;需要将 renren-fast 后端脚手架中配置的 Cors跨域配置类的内容注释掉,使用上面我们自己配置的 Cors跨域配置。

@Configurationpublic class CorsConfig implements WebMvcConfigurer {//    @Override//    public void addCorsMappings(CorsRegistry registry) {//        registry.addMapping("/**")//            .allowedOrigins("*")//            .allowCredentials(true)//            .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")//            .maxAge(3600);//    }}
举报

相关推荐

0 条评论