专注app软件定制开发【云原生】 Spring Cloud Alibaba 之 Gateway 服务网关跨域问题

文章目录

一、专注app软件定制开发什么是跨域问题?

专注app软件定制开发在了解什么是跨域的时候,专注app软件定制开发我们首先要了解一个概念,叫同源策略,专注app软件定制开发什么是同源策略呢,专注app软件定制开发就是我们的浏览器出于安全考虑,只允许与本域专注app软件定制开发下的接口交互。不同源的客户端脚本在没有明确授权的情况下,不能读写对方的资源。

大致意思就是,比如刚刚登录了淘宝或京东购买商品,但又点进了另外一个网站,那么现在淘宝或京东账户是处于登录状态,并没有退出登录,所以点进去这个网站可以看到淘宝或京东的登录信息,可以直接操作账户信息,所以就很危险!

再来了解一个概念:本域,什么是本域呢?就是同一种协议,同一种域名,同端口,就是本域。

浏览器请求的三种报错

1、请求未发送

2、请求发送后,服务器发现不一样,服务器未反应。

3、请求发送,服务器有反应,数据返回的时候,浏览器发现不对,被拦截。

域名不一致就是跨域,主要包括:

  • 域名不同,例如:www.taobao.com、www.jd.com
  • 域名相同,端口不同,http://localhost:8081 、http://localhost:8002

跨域问题:浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截的问题

⛅跨域的解决方法

跨域的解决方案有很多,例如最常见的

前端解决方案:

  • JSONP解决跨域
  • Nginx 反向代理解决跨域
  • 通过Webpack工具解决跨域
  • CORS 跨域资源同享 解决跨域

后端解决方案:

  • 在Controller层加注解 @CrossOrigin 解决跨域
  • 通过设置config配置类,放行指定url

二、模拟一个跨域问题

新建html界面,并通过 live server 插件为html页面开辟一个端口

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta http-equiv="X-UA-Compatible" content="IE=edge">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title></head><body>    <pre>        spring:          cloud:            gateway:            globalcors: # 全局的跨域处理              add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题              corsConfigurations:                '[/**]':                  allowedOrigins: # 允许哪些网站的跨域请求                    - "http://127.0.0.1:5500"                  allowedMethods: # 允许的跨域ajax的请求方式                    - "GET"                    - "POST"                    - "DELETE"                    - "PUT"                    - "OPTIONS"                  allowedHeaders: "*" # 允许在请求中携带的头信息                  allowCredentials: true # 是否允许携带cookie                  maxAge: 360000 # 这次跨域检测的有效期        </pre>        </body><script src="https://unpkg.com/axios/dist/axios.min.js"></script><script>    axios.get("http://localhost:10010/user/1?authorization=admin")    .then(res => console.log(res.data))    .catch(err => console.log(err));</script></html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

⏳安装Live Server 为html开启端口启动

安装 live server 插件

配置成功!

⚡运行程序

运行程序调用接口

安装成功后,在html页面 右击,单击 Open Live Server 启动

运行程序后出现如下问题

出现跨域问题,下面给出解决方案!

停止Live Server

右击直接选中Stop Live Server 即可

完成停止!

三、跨域问题的解决方案

✒️Spring Boot 跨域解决方案

采用 注解的方式

/** * @author whc * @date 2022/7/9 11:11 */@RestController@CrossOriginpublic class TestController {    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

@CrossOrigin 注解解析:

声明该注解允许该接口跨域访问

@CrossOrigin 表示所有的URL均可访问此资源

@CrossOrigin(origins = “http://127.0.0.1:5500”)

  • 表示只允许这一个url可以跨域访问这个controller 代码说明:

  • @CrossOrigin这个注解用起来很方便,这个可以用在方法上,也可以用在类上。如果你不设置他的value属性,或者是origins属性,就默认是可以允许所有的URL/域访问。

采用配置类的方式

通过JavaConfig来配置跨域

import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.CorsRegistration;import org.springframework.web.servlet.config.annotation.CorsRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configurationpublic class WebConfig implements WebMvcConfigurer {    // mvc拦截器配置跨域    @Override    public void addCorsMappings(CorsRegistry registry) {        // 跨域路径        CorsRegistration cors = registry.addMapping("/**");        // 可访问的外部域        cors.allowedOrigins("*");        // 支持跨域用户凭证        cors.allowCredentials(true);        cors.allowedOriginPatterns("*");        // 设置 header 能携带的信息        cors.allowedHeaders("*");        // 支持跨域的请求方法        cors.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS");        // 设置跨域过期时间,单位为秒        cors.maxAge(3600);    }    // 简写形式    @Override    public void addCorsMappings(CorsRegistry registry) {        registry.addMapping("/**")                .allowedOrigins("*")                .allowCredentials(true)                .allowedOriginPatterns("*")                .allowedHeaders("*")                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")                .maxAge(3600);    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

两种方式均可解决跨域问题。

♨️SpringCloud Alibaba Gateway 跨域解决方案

配置yaml网关信息,放行指定url请求

server:  port: 10010 # 网关端口spring:  application:    name: gateway # 服务名称  cloud:    nacos:      server-addr: localhost:8848 # nacos地址    gateway:      routes: # 网关路由配置        - id: user-service # 路由id,自定义,只要唯一即可          # uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址          uri: lb://userService # 路由的目标地址 lb就是负载均衡,后面跟服务名称          predicates: # 路由断言,也就是判断请求是否符合路由规则的条件            - Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求        - id: order-service # 路由id,自定义,只要唯一即可          # uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址          uri: lb://orderService          predicates:            - Path=/order/**            - Before=2022-07-09T17:42:47.789-07:00[Asia/Shanghai]      globalcors: # 全局的跨域处理        add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题        corsConfigurations:          '[/**]':            allowedOrigins: # 允许哪些网站的跨域请求              - "http://127.0.0.1:5500"            allowedMethods: # 允许的跨域ajax的请求方式              - "GET"              - "POST"              - "DELETE"              - "PUT"              - "OPTIONS"            allowedHeaders: "*" # 允许在请求中携带的头信息            allowCredentials: true # 是否允许携带cookie            maxAge: 360000 # 这次跨域检测的有效期
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

配置完成后,前端访问,如下

⛵小结

以上就是【Bug 终结者】对 【云原生】 Spring Cloud Alibaba 之 Gateway 服务网关跨域问题 的简单介绍,Gateway 服务网关是我们比较常用的技术,全方位解决问题,不断提高自己的技术水平,加油!

如果这篇【文章】有帮助到你,希望可以给【Bug 终结者】点个赞👍,创作不易,如果有对【后端技术】、【前端领域】感兴趣的小可爱,也欢迎关注❤️❤️❤️ 【Bug 终结者】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💝💝💝!

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发