跨域相关问题

网络算
• 阅读 2415

最近遇到了一个项目,第一次和其他组的后端合作,由于域名也是新申请的,所以在合作过程中遇到了很多跨域的问题。现在自己做一下模拟总结。这里我的前端使用的vue,后端使用的express。没有使用vue的proxyTable,就是作为后端解决一下这个跨域

解决代码

app.all('*', function (req, res, next) {
    res.header('Access-Control-Allow-Origin', 'http://h5.xesv5.com:8081')
    res.header('Access-Control-Allow-Credentials', true)
    res.header("Access-Control-Allow-Headers", "Content-Type,Accept,X-Requested-With,traceid,rpcid")
    res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS")
    res.header("Content-Type", "application/json;charset=utf-8")
    if (req.method == 'OPTIONS') {
        res.sendStatus(200)
    } else {
        if (req.path.indexOf('/getUserInfo') < 0 && (!req.session || !req.session.userInfo)) {
            res.send({
                stat: 1230,
                message: '登录失效'
            })
        } else {
            next()
        }
    }
})

问题一:域名不一致的跨域提示

现象:

跨域相关问题

Response to preflight request doesn't pass access control check: No 'Access-Control-Origin' header is present on the requested resource.

解决办法:

设置Access-Control-Allow-Orign。我的后端一开始只设置了允许http://pylon.xueersi.com域名,但是没有带上端口号,带上端口号即可。

问题二: 后端没有设置Access-Control-Allow-Credentials

当前端设置withCredentials:true时,表示前端允许跨域的后端接口种cookie

现象:

跨域相关问题

The value of the 'Access-Control-Allow-Crentials' header in the response is '' which must be 'true' when the request's crentials mode is 'include'. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute

解决办法:

后端也需要在请求头设置Access-Control-Allow-Credentials:true

问题三:设置Credentials后,Access-Control-Allow-Origin需要指定域名,不可以设置*

跨域相关问题

问题四:前端在请求头上设置了参数,后端需要允许请求头设置该参数

现象:

跨域相关问题

Request header field token is not allowed by Access-Control-Allow-Headers in preflight response

解决办法:

如果前端需要在请求头里加上token字段,后端这边需要Access-Control-Allow-Headers设置

 res.header("Access-Control-Allow-Headers", "Content-Type,Accept,X-Requested-With,token")

补充:axios请求头设置参数

config.headers.common['token'] = 123

问题五:协议不同产生的问题

现象:

由于投放出去的链接是https的,但是之前我们测试使用的都是http协议的链接。后来改成https的时候,提示下面的错误:
跨域相关问题
Mixed Content: The page at 'https://xxx.com/#/' was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint. This request has been blocked: the content must be serverd over HTTPS

我的第一反应其实这也是一个跨域的问题,因为一个是http一个是https,后端只允许了http://xx,没有允许https协议的链接,但是报的错误是Mixed Content,这算是安全策略的报错,浏览器禁止了https协议访问http协议的资源和接口,大概是浏览器首先检测到的是这个安全策略的问题。
后来我把所有的接口协议修改为:'//xxx.com/xxx'后,继续报错,说明这个时候浏览器开始进一步检测跨域的问题:

跨域相关问题

Response to preflight request doesn't pass access control check: The 'Access-control-Allow-Origin' header has a value 'http://xx.com' that is not equal to the supplied origin.

原因很简单:就是跨域的Access-Control-Allow-Origin设置的是http协议的,运维老师加上https的就可以。

点赞
收藏
评论区
推荐文章
待兔 待兔
3年前
什么是跨域以及如何解决?通俗易懂带你彻底搞定
什么是跨域以及如何解决?通俗易懂带你彻底搞定现在的web项目,很多都是前后端分离,特别容易出现跨域问题那么什么是跨域问题呢?本篇文章带你彻底从本质上弄明白什么是跨域问题以及如何解决一跨域有什么现象?我们先看一下
徐小夕 徐小夕
5年前
当遇到跨域开发时, 我们如何处理好前后端配置和请求库封装(koa/axios版)
我们知道很多大型项目都或多或少的采用跨域的模式开发,以达到服务和资源的解耦和高效利用.在大前端盛行的今天更为如此,前端工程师可以通过nodejs或者Nginx轻松搭建起web服务器.这个时候我们只需要请求后端服务器的接口即可实现系统的业务功能开发.这个过程中会涉及到web页面向API服务器的跨域访问(由于受到浏览器的同源策略,但是业界已有很多解决方案,
Easter79 Easter79
4年前
Vue 前端验证码
⭐前言在vue项目中,登录界面必不可少。简单项目里,验证码通常由数字字母构成。一般有两种产生方式:前端,后端。后端生成,前端直接调用接口,将返回的url放入a标签即可。而前端生成,则大多用canvas画布实现,如何让验证码随屏幕大小变化,还能保持原样不失真,这就是我们要实现的功能。当然,在创建vue项目时,我们必须得克服跨域问题。No'
Easter79 Easter79
4年前
springboot的跨域
https://www.cnblogs.com/520playboy/p/7306008.html1、对于前后端分离的项目来说,如果前端项目与后端项目部署在两个不同的域下,那么势必会引起跨域问题的出现。针对跨域问题,我们可能第一个想到的解决方案就是jsonp,并且以前处理跨域问题我基本也是这么处理。但是jsonp方式也同样有不足,不管是对
昔不亏 昔不亏
2年前
「解决 — vue调用百度ai人脸识别接口跨域报错」
之前调都没毛病的,这次咋就开始报跨域了捏问题:跨域解决:配置proxy代理1:修改vue.config.js文件2:修改baseURL3:修改前后对比注:ProxyTable会在打包后失效,可以使用反向代理工具,例如nginx,或者让后端解决
kenx kenx
4年前
SpringBoot 优雅配置跨域多种方式及Spring Security跨域访问配置的坑
前言最近在做项目的时候,基于前后端分离的权限管理系统,后台使用SpringSecurity作为权限控制管理,然后在前端接口访问时候涉及到跨域,但我怎么配置跨域也没有生效,这里有一个坑,在使用SpringSecurity时候单独配置,SpringBoot跨越还不行,还需要配置Security跨域才行。什么是跨域跨域是一种浏览器同源安全策略,即浏
科林-Colin 科林-Colin
4年前
Vue跨域解决方法
vue项目中,前端与后台进行数据请求或者提交的时候,如果后台没有设置跨域,前端本地调试代码的时候就会报“No'AccessControlAllowOrigin'headerispresentontherequestedresource.”这种跨域错误。要想本地正常的调试,解决的办法有三个:
Stella981 Stella981
4年前
No 'Access
跨域说明前后端分离下,跨域已是一个老生常谈的话题,但很多小伙伴还是经常面临这样的问题,且解决方案多变多样。这里介绍一种简单直接的后端解决方案。解决跨域(服务端)/CorsConfig跨域@authorylyue@since2018年11
Wesley13 Wesley13
4年前
JAVA拦截器,JAVA返回结果跨域问题解决
遇到的问题:通过拦截器做权限控制,没有权限时返回了json值,结果前端请求时提示跨域了备注:我的前端站点和后端站点不是一个地址报错1:AccesstoXMLHttpRequestat'http://localhost:8089/appcicd/appinfo/getappinfos'fromorigi
Stella981 Stella981
4年前
Spring boot 总结之跨域处理cors
背景现在做的很多项目都是前后端分离的,这就引出一个很常见的问题,我们的页面和接口是在不同域名下的,当我们通过ajax访问后端接口的时候就会出现跨域问题,这种问题我们怎么解决呢?一般来说就是cors和jsonp这两种方案。Spring简化了cors的配置,接下来我们来看一下它提供的cors。WebMvcConfigurer对象
Stella981 Stella981
4年前
Spring Boot 中三种跨域场景总结
@\toc\跨域这个问题松哥之前写过文章,但是最近收到小伙伴们的一些问题,让我发现之前的总结不够全面,因此打算再写一篇文章,来和大家分享一下SpringBoot中的跨域问题。这次我把SpringBoot中的跨域问题分为了三个场景:普通跨域SpringSecurity跨域OAuth2跨域分