相关概念
# Error解决
## 项目无法启动问题
```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>
<parent>
<groupId>com.junjie.bitmall</groupId>
<artifactId>bitmall</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<artifactId>bitmall-gateway</artifactId>
<name>bitmall-gateway</name>
<description>bit商城-网关服务</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR3</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
```
>**这个版本的gateway网关不能和web依赖同时出现, 必须把web依赖删除, 如上所示, 否则微服务会启动失败(报错信息一定要看全, 不能只看异常, 还需要看其他)**
****
## 浏览器报错问题
`header contains multiple values`
> **错误显示出现了冗余, 原因是renren-fast微服务上也有跨域配置类, 注释掉即可**
```java
@Configuration
public class CorsConfig implements WebMvcConfigurer {
// @Override
// public void addCorsMappings(CorsRegistry registry) {
// registry.addMapping("/**")
//// .allowedOriginPatterns("*")
// .allowedOrigins("*")
// .allowCredentials(true)
// .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
// .maxAge(3600);
// }
}
````
# 相关概念
## 为什么需要访问网关?
> **如果不访问网关, 直接访问微服务, 如product微服务, 首先会造成单点故障, 而且后台管理系统肯定不仅仅只需要访问product微服务, 肯定会有其他微服务, 没有网关做不下去**
## 解决跨域问题
### 1) 跨域是什么
> 跨域指的是浏览器不能执行其他网站的脚本, 它是由浏览器的同源策略造成的, 是浏览器对JavaScript施加的安全策略
>
> **即: 不让你乱执行其他网站的JS脚本, 也不让你去扒其他网站的数据**
### 2) 同源策略是什么
> **同源策略指的是, 协议, 域名, 端口号都需要一致, 如果有一个不一致, 就会产生跨域问题**
![image.png](https://cos.easydoc.net/13568421/files/ljz3t30x.png)
### 3) 跨域的流程
[跨域的流程](https://www.processon.com/embed/64a57ce9e79b6b5e77adc78b)
**这里的跨域问题主要是, 前端项目对应的端口号是8001, 而登录请求默认会分配到88端口号的网关, 端口号不一致导致的跨域, 因此, 我们访问么的目标微服务就是网关微服务, 需要再目标微服务上允许跨域**
### 4) 如何解决跨域问题
#### A. NGINX解决跨域问题
![image.png](https://cos.easydoc.net/13568421/files/ljz3wleh.png)
> 通过访问NGINX反向代理服务器, 可以做到协议, 域名, 端口号上的一致, 符合同源策略, 而且NGINX可以反向代理, 访问不同的应用服务器, 完美实现了动态数据和静态页面的加载, 缺点是太麻烦, 不使用
#### B. 在目标服务器同意预检请求(gateway)
[全局过滤器](doc:ifp7R1pI)
### 5) 为什么使用全局过滤器
> **如果不使用全局过滤器, 就需要对每一个请求都允许跨域, 不合理, 因此, 使用全局过滤器跨域一揽子解决这类问题**