相关概念

# 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) 为什么使用全局过滤器 > **如果不使用全局过滤器, 就需要对每一个请求都允许跨域, 不合理, 因此, 使用全局过滤器跨域一揽子解决这类问题**