SpringCloud Gateway 解决跨域问题
温馨提示:
本文最后更新于 2023年07月05日
,已超过 654 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我。
第一种配置方案
跨域问题在前后端分离的架构中经常出现。在 SpringCloud Gateway 中,可以通过添加 Filter 来解决跨域问题。
首先,需要在 SpringCloud Gateway 的配置文件中添加以下代码:
spring:
cloud:
gateway:
globalcors:
corsConfigurations:
'[/**]':
allowedOrigins: "https://docs.spring.io"
allowedMethods:
- GET
这段代码添加了一个默认的过滤器,名称为 Cors。它允许所有来源(allowedOrigins)、所有 HTTP 方法(allowedMethods)和所有头信息(allowedHeaders)。
第二种如果需要更精细的配置
可以自定义一个 CorsFilter。例如:
@Configuration
public class CorsConfig {
@Bean
public CorsWebFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
config.addAllowedMethod("*");
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
source.registerCorsConfiguration("/**", config);
return new CorsWebFilter(source);
}
}
这段代码创建了一个 CorsFilter,它只允许所有 HTTP 方法,所有头信息和所有来源。
需要注意的是,跨域问题的解决还需要在前端的代码中进行一些配置。比如,在 Vue.js 中,可以使用 axios 库,并通过设置请求头部信息的方式来解决跨域问题。具体的代码如下:
import axios from 'axios';
axios.defaults.withCredentials = true; // 允许携带 cookie
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'; // 设置请求头信息
总之,SpringCloud Gateway 提供了多种方式来解决跨域问题。开发人员可以根据具体需求选择合适的方案,从而更好地实现前后端分离架构。
第三种配置方案
直接使用过滤器设置跨域的内容
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
//跨域请求,*代表允许全部类型
response.setHeader("Access-Control-Allow-Origin", "*");
//允许请求方式
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
//用来指定本次预检请求的有效期,单位为秒,在此期间不用发出另一条预检请求
response.setHeader("Access-Control-Max-Age", "3600");
//请求包含的字段内容,如有多个可用哪个逗号分隔如下
response.setHeader("Access-Control-Allow-Headers", "content-type,x-requested-with,Authorization, x-ui-request,lang");
//访问控制允许凭据,true为允许
response.setHeader("Access-Control-Allow-Credentials", "true");
// 浏览器是会先发一次options请求,如果请求通过,则继续发送正式的post请求
// 配置options的请求返回
if (request.getMethod().equals("OPTIONS")) {
response.setStatus(HttpStatus.SC_OK);
response.getWriter().write("OPTIONS returns OK");
return;
}
// 传递业务请求处理
chain.doFilter(servletRequest, servletResponse);
}
正文到此结束
- 本文标签: Java Spring Spring Boot
- 本文链接: https://www.letcode.cn/article/7
- 版权声明: 本文由Jack.Chen原创发布,转载请遵循《 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权