跨域报错:Response to preflight request doesn‘t pass access control check: No ‘Access-Control-Allow-Origi

在编写一个简单POST跨域请求时碰到了这个问题,我看了下网上的答案,感觉我好像也都做到了,但是就是不行,我将核心问题进行了抽象,抽象为下面的代码

前端是这样的:

$.ajax({
			type: "post", 
			url: "http://localhost:8081/test/testUploadPhoto",
			dataType: "json", 
			data:{
				canvasPhotoBase64Data:"dataUrl",
			},
			beforeSend: function(xhr) {
			    xhr.setRequestHeader("Access-Control-Allow-Origin", "*");
			},
			success: function (data) {
				console.log("已接收")
			},
			error : function(XMLHttpRequest, textStatus, errorThrown) {
				console.log("errorThrown:"+errorThrown);
			}
		});

后端是这样的:

@RequestMapping("/test")
@RestController
public class TestUpload {
    @RequestMapping("/testUploadPhoto")
    public String testUploadPhoto(String canvasPhotoBase64Data, HttpServletResponse response){
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
        response.setHeader("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With");
        System.out.println(canvasPhotoBase64Data);
        return "123";
    }
}

感觉没啥问题,然而就是下面的错误

Access to XMLHttpRequest at 'http://localhost:8081/test/testUploadPhoto' from origin 'https://localhost:8044' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

于是我试着把前端的这部分删除了

beforeSend: function(xhr) {
	xhr.setRequestHeader("Access-Control-Allow-Origin", "*");
},

然后就跑通了...不知道为啥把request请求的这个请求头删掉就行了,我把两个请求放在这对比一下,记录一下,以后有机会再来分析,有点忙暂时没时间分析了。

失败的跨域:

 

成功的跨域:

 

总结:

跨域这个真的是从最开始开发项目就经常遇到的问题,每次一遇到跨域的问题就是百度一通,把能加的配置一加,然后后面能跑通了就行了,这次跨域的失败让我发现其实跨域这个好像不需要配置太多,在后端增加几个参数就行了,不用前端后端加一堆东西,在此也算做个记录,如果下次再遇到跨域问题我看看是不是一样的。

 

 

 

 

 

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
跨域问题是由于浏览器的同源策略导致的,同源策略要求网页只能访问与其来源相同的资源。当一个网页向不同源的服务器发送请求时,浏览器会进行跨域检查,如果服务器没有正确配置跨域访问的响应头,就会出现"Response to preflight request doesn’t pass access control check: No ‘Access-Control-Allow-Origin’ header is present on the requested resource"的错误。 解决这个问题的方法有多种,下面是两种常见的解决方案: 1. 在服务器端配置响应头信息,允许跨域访问。在服务器端的响应头中添加"Access-Control-Allow-Origin"字段,并设置为允许访问的域名或"*"(表示允许任意域名访问)。 示例代码如下(以Node.js为例): ```javascript // 设置允许跨域访问的响应头 res.setHeader('Access-Control-Allow-Origin', '*'); ``` 2. 使用代理服务器进行请求转发。在项目中配置一个代理服务器,将跨域请求转发到目标服务器,这样就可以绕过浏览器的同源策略限制。 示例代码如下(以Vue.js为例): ```javascript // vue.config.js module.exports = { devServer: { proxy: { '/api': { target: 'http://example.com', // 目标服务器地址 changeOrigin: true, // 允许跨域 pathRewrite: { '^/api': '' // 将请求路径中的/api前缀去掉 } } } } }; ``` 这样,当你在前端代码中发送请求到"/api"路径时,代理服务器会将请求转发到目标服务器,并将响应返回给前端,从而解决跨域问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值