广告
返回顶部
首页 > 资讯 > 精选 >如何使用SpringCloudApiGateway支持Cors跨域请求
  • 675
分享到

如何使用SpringCloudApiGateway支持Cors跨域请求

2023-06-20 16:06:49 675人浏览 泡泡鱼
摘要

本篇内容介绍了“如何使用SpringCloudapiGateway支持Cors跨域请求”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!问题背景

本篇内容介绍了“如何使用SpringCloudapiGateway支持Cors跨域请求”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

问题背景

公司的项目需要前后端分离,Vue+java,这时候就需要支持Cors跨域请求了。最近对zuul进行升级,假如说zuul是1.0的话,api gateway就是2.0的网关,支持ws等,基于NIO,各方面还是强大的。

解决方案

新建一个Configuration类即可

import org.springframework.cloud.client.discovery.DiscoveryClient;import org.springframework.cloud.gateway.discovery.DiscoveryClientRouteDefinitionLocator;import org.springframework.cloud.gateway.route.RouteDefinitionLocator;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.Http.HttpHeaders;import org.springframework.http.HttpMethod;import org.springframework.http.httpstatus;import org.springframework.http.server.Reactive.ServerHttpRequest;import org.springframework.http.server.reactive.ServerHttpResponse;import org.springframework.WEB.cors.reactive.CorsUtils;import org.springframework.web.server.ServerWebExchange;import org.springframework.web.server.WebFilter;import org.springframework.web.server.WebFilterChain;import reactor.core.publisher.Mono;@Configurationpublic class RouteConfiguration {    //这里为支持的请求头,如果有自定义的header字段请自己添加(不知道为什么不能使用*)    private static final String ALLOWED_HEADERS = "x-requested-with, authorization, Content-Type, Authorization, credential, X-XSRF-TOKEN,token,username,client";    private static final String ALLOWED_METHODS = "*";    private static final String ALLOWED_ORIGIN = "*";    private static final String ALLOWED_Expose = "x-requested-with, authorization, Content-Type, Authorization, credential, X-XSRF-TOKEN,token,username,client";    private static final String MAX_AGE = "18000L";    @Bean    public WebFilter corsFilter() {        return (ServerWebExchange ctx, WebFilterChain chain) -> {            ServerHttpRequest request = ctx.getRequest();            if (CorsUtils.isCorsRequest(request)) {                ServerHttpResponse response = ctx.getResponse();                HttpHeaders headers = response.getHeaders();                headers.add("Access-Control-Allow-Origin", ALLOWED_ORIGIN);                headers.add("Access-Control-Allow-Methods", ALLOWED_METHODS);                headers.add("Access-Control-Max-Age", MAX_AGE);                headers.add("Access-Control-Allow-Headers", ALLOWED_HEADERS);                headers.add("Access-Control-Expose-Headers", ALLOWED_Expose);                headers.add("Access-Control-Allow-Credentials", "true");                if (request.getMethod() == HttpMethod.OPTIONS) {                    response.setStatusCode(HttpStatus.OK);                    return Mono.empty();                }            }            return chain.filter(ctx);        };    }        @Bean    public RouteDefinitionLocator discoveryClientRouteDefinitionLocator(DiscoveryClient discoveryClient) {        return new DiscoveryClientRouteDefinitionLocator(discoveryClient);    }}

application.yml配置

官方文档提及到还有另外一种方式,就是通过yml来配置。

spring:  cloud:    gateway:      globalcors:        corsConfigurations:          '[/**]':            allowedOrigins: "https://blog.csdn.net/moshowgame"            allowedMethods:            - GET

跨域解决方案(CORS)

1. 什么是跨域?

跨域问题是出于浏览器的【同源策略】限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。

可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。

所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)

由于我们现在是采用的前后端分离的微服务架构前端和后端必定存在跨域问题。解决跨域问题可以采用CORS。

2. CORS简介

CORS 是一个 W3C 标准,全称是"跨域资源共享"(Cross-origin resource sharing)。

CORS需要浏览器和服务器同时支持。但是目前基本上浏览器都支持,所以我们只要保证服务器端服务器实现了 CORS 接口,就可以跨源通信。

浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)。

3. 具体解决方式

解决跨域问题,就是在服务器端给响应添加头信息

NameRequiredComments
Access-Control-Allow-Origin必填允许请求的域
Access-Control-Allow-Methods必填允许请求的方法
Access-Control-Allow-Headers可选预检请求后,告知发送请求需要有的头部
Access-Control-Allow-Credentials可选表示是否允许发送cookie,默认false;
Access-Control-Max-Age可选本次预检的有效期,单位:秒;
3.1 在Spring Boot 中解决

在spring boot中给我们提供了 @CrossOrigin 注解用于解决跨域问题。

使用场景要求:jdk1.8+、Spring4.2+

只需要在我们需要的controller上加@CrossOrigin

@RestController//实现跨域注解//origin="*"代表所有域名都可访问//maxAge飞行前响应的缓存持续时间的最大年龄,简单来说就是Cookie的有效期 单位为秒若maxAge是负数,则代表为临时Cookie,不会被持久化,Cookie信息保存在浏览器内存中,浏览器关闭Cookie就消失@CrossOrigin(origins = "*",maxAge = 3600)@RequestMapping("/album")public class AlbumController {}
3.2 在spring cloud中解决

只需要在spring Cloud Gateway 服务中添加配置就行

spring:  application:    name: system-gateway  cloud:    gateway:      globalcors:        cors-configurations:          '[/**]': # 匹配所有请求            allowedOrigins: "*" #跨域处理 允许所有的域            allowedMethods: # 支持的方法            - GET            - POST            - PUT            - DELETE

当然也可以自己利用Gateway的拦截器来手动添加相应的头信息

default-filters:      - AddResponseHeader=Access-Control-Allow-Credentials,true      - AddResponseHeader=Access-Control-Allow-Headers,access-control-allow-origin      - AddResponseHeader=Access-Control-Allow-Methods,GET      - AddResponseHeader=Access-Control-Allow-Origin,*      - AddResponseHeader=Access-Control-Allow-Age,3600
3.3 在Nginx中解决
location /example {   if ($request_method = 'OPTIONS') {       add_header Access-Control-Allow-Origin *;       add_header Access-Control-Max-Age 1728000;       add_header Access-Control-Allow-Methods GET,POST,OPTIONS;       add_header Access-Control-Allow-Headers  'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';       add_header Content-Type' 'text/plain; charset=utf-8';       add_header Content-Length 0 ;       return 204;    } +   if ($http_origin ~* (https?://(.+\.)?(example\.com$))) {+     add_header  Access-Control-Allow-Origin $http_origin;+     add_header  Access-Control-Allow-Credentials true;+     add_header  Access-Control-Allow-Methods GET,POST,OPTIONS;+     add_header  Access-Control-Expose-Headers Content-Length,Content-Range;+   }     proxy_redirect off;    proxy_set_header Host $host;    proxy_set_header X-Real-IP $remote_addr;    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    proxy_pass http://127.0.0.1:8080/;   }

解释:

if ($request_method = 'OPTIONS') {...} 当请求方法为 OPTIONS 时:

  1. 添加允许源 Access-Control-Allow-Origin 为 * (可根据业务需要更改)

  2. 添加缓存时长 Access-Control-Max-Age,当下次请求时,无需再发送 OPTIONS 请求

  3. 添加允许的方法,允许的首部

  4. 添加一个内容长度为0,类型为 text/plain; charset=utf-8 , 返回状态码为 204 的首部

if ($http_origin ~* (https?://(.+\.)?(example\.com$))) {...}, 当 origin 为合法域名(可根据业务调整或去除合法域名验证)时:

  1. 添加允许源Access-Control-Allow-Origin为 $http_origin (可根据业务需要更改)

  2. 添加允许认证Access-Control-Allow-Credentials为 true ,允许接收客户端 Cookie(可根据业务需要更改。 但要注意,当设置为true时,Access-Control-Allow-Origin 不允许设置为 *)

  3. 添加允许的方法,暴露的首部

至此,完成跨域请求正确响应。

“如何使用SprinGCloudApiGateway支持Cors跨域请求”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: 如何使用SpringCloudApiGateway支持Cors跨域请求

本文链接: https://www.lsjlt.com/news/298197.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何使用SpringCloudApiGateway支持Cors跨域请求
    本篇内容介绍了“如何使用SpringCloudApiGateway支持Cors跨域请求”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!问题背景...
    99+
    2023-06-20
  • 使用SpringCloudApiGateway之支持Cors跨域请求
    问题背景 公司的项目需要前后端分离,vue+java,这时候就需要支持Cors跨域请求了。最近对zuul进行升级,假如说zuul是1.0的话,api gateway就是2.0的网关,...
    99+
    2022-11-12
  • Spring Boot Web应用开发 CORS 跨域请求支持
    一、Web开发经常会遇到跨域问题,解决方案有:jsonp,iframe,CORS等等CORS与JSONP相比 JSONP只能实现GET请求,而CORS支持所有类型的HTTP请求。 使用CORS,开发者可以使用普通的XMLHttpReques...
    99+
    2023-05-31
    spring boot cors跨域
  • Java中的跨域请求如何利用cors实现
    本篇文章为大家展示了Java中的跨域请求如何利用cors实现,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。什么是跨域?跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器...
    99+
    2023-05-31
    java cors ava
  • 基于CORS如何实现WebApi Ajax跨域请求
    这篇文章主要介绍了基于CORS如何实现WebApi Ajax跨域请求,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。概述ASP.NET Web...
    99+
    2022-10-19
  • SpringBoot开发技巧之如何处理跨域请求CORS
    目录SpringBoot处理跨域特殊情况解决方法自定义Cors过滤器通过配置类指定过滤器的优先级在前后分离的架构下,我们经常会遇到跨域CORS问题,在浏览器上的表现就是出现如下一段错...
    99+
    2022-11-12
  • Python flask跨域支持(Access-Control-Allow-Origin(CORS)跨域资源共享(访问控制允许来源:允许指定的来源进行跨域请求)浏览器同源策略、OPTIONS预检请求
    文章目录 跨域优点缺点补救措施 flask接口支持跨域设置方法全局设置单个接口设置@app.route装饰器与@cross_origin装饰器请求方法冲突问题 如何检测一...
    99+
    2023-09-17
    python flask 开发语言
  • 如何使用$.getJSON实现跨域ajax请求
    本篇内容主要讲解“如何使用$.getJSON实现跨域ajax请求”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用$.getJSON实现跨域ajax请求”吧...
    99+
    2022-10-19
  • Vue如何用Ajax实现跨域请求
    本篇内容主要讲解“Vue如何用Ajax实现跨域请求”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue如何用Ajax实现跨域请求”吧!一.设置config/index.js || proxyTa...
    99+
    2023-07-04
  • vue2.0如何设置proxyTable使用axios进行跨域请求
    小编给大家分享一下vue2.0如何设置proxyTable使用axios进行跨域请求,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧...
    99+
    2022-10-19
  • 使用Filter拦截器如何实现请求跨域转发
    目录Filter拦截器实现请求跨域转发在使用Filter实现转发后特做一次记录使用filter解决跨域在web.xml配置拦截器过滤器代码Filter拦截器实现请求跨域转发 因为公司...
    99+
    2022-11-12
  • 如何使用canvas保存网页为pdf文件支持跨域
    这篇文章给大家分享的是有关如何使用canvas保存网页为pdf文件支持跨域的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。使用canvas保存网页为pdf文件支持跨域正文需求:用户点击下载,将页面保存为PDF文件并...
    99+
    2023-06-09
  • 如何使用Nginx反向代理来避免ajax跨域请求
    这篇文章主要介绍如何使用Nginx反向代理来避免ajax跨域请求,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!服务器上 nginx + tomcat ,其中 nginx 监听 80 ...
    99+
    2022-10-19
  • 如何使用AngularJS跨站请求解决jsonp请求问题
    这篇文章将为大家详细讲解有关如何使用AngularJS跨站请求解决jsonp请求问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。这是我的请求:我在浏览器模板赋值的时候发...
    99+
    2022-10-19
  • 如何使用proxytable配置解决vue-cli的跨域请求问题
    小编给大家分享一下如何使用proxytable配置解决vue-cli的跨域请求问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!...
    99+
    2022-10-19
  • Security框架:如何使用CorsFilter解决前端跨域请求问题
    目录项目情况CORS介绍解决方案项目情况 最近做的pmdb项目是前后端分离的, 由于测试的时候是前端与后端联调,所以出现了跨域请求的问题。 浏览器默认会向后端发送一个Options方...
    99+
    2022-11-12
  • 如何在Springmvc中利用ajax实现一个跨域请求
    今天就跟大家聊聊有关如何在Springmvc中利用ajax实现一个跨域请求,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。写一个类  继承HandlerInterceptor...
    99+
    2023-05-31
    springmvc ajax
  • React Native如何采用Fetch方式发送跨域POST请求
    这篇文章主要为大家展示了“React Native如何采用Fetch方式发送跨域POST请求”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“React Nativ...
    99+
    2022-10-19
  • 如何使用php函数来优化跨域请求和安全限制?
    在Web开发中,跨域请求和安全限制是常见的问题。跨域请求指的是在一个域名下的页面访问另一个域名下的资源。由于浏览器的安全策略,普通的跨域请求是被禁止的。安全限制则是指防止恶意攻击和保护用户隐私的措施。PHP提供了一些函数和方法来优化这些问题...
    99+
    2023-10-21
    优化 跨域请求 安全限制
  • 利用Spring jsonp如何在java项目中实现一个跨域请求
    本篇文章为大家展示了利用Spring jsonp如何在java项目中实现一个跨域请求,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。jsonp介绍    &nb...
    99+
    2023-05-31
    spring jsonp java 跨域请求
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作