fetch跨域问题

本文深入解析了使用fetch API进行跨域POST请求的具体方法,包括如何正确设置请求头以避免常见错误,如设置credentials属性和Access-Control-Allow-Origin的问题。通过实例展示了如何在跨域请求中包含cookie,以及如何处理响应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 fetch(url,{
        method:'post', 
        mode:"cors",      //允许跨域  no-cors不允许跨域
      //  credentials:"include",  //跨域请求时是不带cookie的,添加该属性表示强制加入凭据头,请求时就会携带cookie。但是如果加上这个属性,那么服务器的Access-Control-Allow-Origin 就不能是‘*’,否则会报下面的错误。
        headers:new Headers({
         'Content-Type': 'application/x-www-form-urlencoded', // 指定提交方式为表单提交
          }),
          body:formdate
        }) .then(function(response) {
    
    return response.json();

  }).then(function(json) {
    console.log('parsed json', json);
    
  }).catch(function(ex) {
    console.log('parsing failed', ex);
   
  })

跨域设置
credentials:"include"时,如果服务器端设置Access-Control-Allow-Origin 为‘*’会报如下错误。可以去掉该请求头的设置,只添加mode:'cors'属性。
The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. Origin 'http://localhost:8080' is therefore not allowed access.

 

转载于:https://www.cnblogs.com/BlingSun/p/9777059.html

### Fetch 请求的相关问题及解决方案 当使用 `fetch` 处理请求时,CORS(源资源共享)配置是非常重要的一步。如果没有正确配置 CORS,可能会导致浏览器阻止请求完成。以下是几种常见的解决方法及其具体实现。 #### 后端配置 CORS 最安全和推荐的做法是在后端启用 CORS 支持。这通常涉及设置 HTTP 响应头以允许特定的名访问资源。例如,在 Express.js 中可以这样配置[^2]: ```javascript app.all('*', function(req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS"); res.header("Content-Type", "application/json;charset=utf-8"); next(); }); ``` 以上代码片段设置了通用的权限,适用于大多数场景下的开发需求。注意 `"*"` 表示允许任何来源访问,但在生产环境中建议替换为具体的白名单地址列表以提高安全性。 #### 使用 Vue CLI 的代理功能 在前端框架如 Vue.js 中,也可以通过配置代理的方式来规避限制。这种方法特别适合于本地调试阶段。可以在项目的 `vue.config.js` 文件里添加如下内容[^1]: ```javascript module.exports = { devServer: { proxy: { '/api': { target: 'http://localhost:5000', // 替换为目标服务器的实际URL changeOrigin: true, pathRewrite: { '^/api': '' } } } } }; ``` 这里 `/api` 是一个路径前缀,所有的匹配到这个前缀的请求都会被转发给目标服务器,并且会修改原始请求中的 Host 字段使之看起来像是直接向目标服务器发出的一样。 #### 客户端 fetch 设置 withCredentials 属性 有时候即使已经完成了基本的 CORS 配置,仍然可能出现身份验证失败的情况。这是因为默认情况下 cookies 或者其他认证信息不会随同请求一起发送出去。此时需要显式开启 credentials option: ```javascript fetch('https://other-domain.com/api/resource', { method: 'GET', credentials: 'include' // or 'same-origin' }) .then(response => response.json()) .catch(error => console.error('Error:', error)); ``` 这里的 `credentials: 'include'` 参数告诉浏览器应该连同请求一同提交 cookie 数据等敏感资料[^3]。 --- ### 总结 综上所述,针对 fetch 请求的问题可以从以下几个方面入手解决:一是确保后端已适当开放了必要的 CORS 权限;二是在前端利用构建工具提供的代理机制绕过浏览器的安全策略约束;三是必要时候调整客户端 fetch 请求的行为使其能够携带所需的身份凭证信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值