跨域问题后端解决方案
测试方法
自定义页面进行测试
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>跨域测试:jquery请求url测试跨域情况</title>
</head>
<body>
<div>
输入测试URL:
<input type="text" id="inputUrl" style="width:500px;" value="http://localhost:8080/code">
<button onclick="sendUrl()">发送</button>
</div><br/>
输出结果:<br/>
<div id="outputResponse" style="width: 500px;height: 500px">
</div>
<script>
var s = "http://***/SuperMap/Data-jia3/tileset.json";
var ss = "http://****/SuperMap/Tile/World/Image/tms.xml";
function dealSuccessResponse(response){
console.log("result",response);
var outputDoc = document.getElementById("outputResponse");
outputDoc.innerHTML = JSON.parse(response);// JSON.stringify(response);
}
function sendUrl() {
//发送消息
// var url = mapXmlUrl;
var url = document.getElementById("inputUrl").value;
// var xmlSerializer = new XMLSerializer();
// var str = xmlSerializer.serializeToString(featureRequest);
var requestOpt = {
type:'POST',
contentType:'text/xml',
data:"",
success: function (req) {
// 执行回调函数
if (dealSuccessResponse){
dealSuccessResponse(req);
}
},
timeout :10
};
this.sendRequest(url,requestOpt);
}
function sendRequest(url, opt) {
//方法:fetch : https://developer.mozilla.org/zh-CN/docs/Web/API/Fetch_API/Using_Fetch
fetch(url,{
method : opt.type,
body: opt.data
}).then(function (respone) {
if (respone.ok){
return respone;
}
throw new Error('Network respone was not ok.');
}).then(function (respone) {
if (opt.success){
opt.success(respone);
}
})
}
</script>
</body>
</html>
浏览器控制台输出
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://localhost:8080/code");
xhr.send(null);
xhr.onload = function(e) {
var xhr = e.target;
console.log(xhr.responseText);
}
解决方法
网关跨域
经过网关的请求配置gateway的yml
spring:
cloud:
gateway:
globalcors: # 全局的跨域处理
add-to-simple-url-handler-mapping: true # 因为ajax发起者会通过options请求来向服务器询问是否允许跨域,所以需要设置为true来解决options请求被拦截问题
corsConfigurations:
'[/**]':
allowedOrigins: "*" # 允许哪些网站的跨域请求
allowedMethods: "*" # 允许的跨域ajax的请求方式
allowedHeaders: "*" # 允许在请求中携带的头信息
allowCredentials: true # 是否允许携带cookie
maxAge: 360000 # 这次跨域检测的有效期,即一定时间内就不需要重复询问是否允许跨域了,直接请求即可。
未经过网关的请求
webflux方式(例如验证码过滤器),需要增加配置文件
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;
/**
* @Classname:CorsConfig
* @Description: 配置验证码的跨域
* @author: xxx
* @date: 2022/4/19 12:09
*/
@Configuration
public class CorsConfig {
private static final String MAX_AGE = "18000L";
@Bean
public WebFilter corsFilter() {
return (ServerWebExchange ctx, WebFilterChain chain) -> {
ServerHttpRequest request = ctx.getRequest();
if (CorsUtils.isCorsRequest(request)) {
HttpHeaders requestHeaders = request.getHeaders();
ServerHttpResponse response = ctx.getResponse();
HttpMethod requestMethod = requestHeaders.getAccessControlRequestMethod();
HttpHeaders headers = response.getHeaders();
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, requestHeaders.getOrigin());
headers.addAll(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, requestHeaders
.getAccessControlRequestHeaders());
if (requestMethod != null) {
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, requestMethod.name());
}
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
headers.add(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, "*");
headers.add(HttpHeaders.ACCESS_CONTROL_MAX_AGE, MAX_AGE);
if (request.getMethod() == HttpMethod.OPTIONS) {
response.setStatusCode(HttpStatus.OK);
return Mono.empty();
}
}
return chain.filter(ctx);
};
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)