Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 562|回复: 0

解决前端开发环境中的的跨域问题

[复制链接]
  • TA的每日心情
    奋斗
    3 天前
  • 签到天数: 792 天

    [LV.10]以坛为家III

    2049

    主题

    2107

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    723136
    发表于 2021-6-26 00:24:00 | 显示全部楼层 |阅读模式

    一、为什么会有跨越问题
    是客户端浏览器同源策略导致的,就是浏览器不允许不同源的站点相互访问。试想一下要是没有这个,那站点里的安全信息如cookie,账号/密码等是不是很容易被其它站点获取。
    二、解决思路
    知道是客户端浏览器为了安全使用同源策略导致的,而服务端是没有这个限制的,那我们就只能通过服务端进行跨域了。不管是jsonp,core,还是代理的方式,都是需要服务配合的。哈哈,这也是为啥后端和生产环境下比较少听说跨域的问题,所以这里介绍前端开发环境中的几种解决方法。
    三、解决方案
    1.完全交予后端解决,配值请求头信息(core),前端什么都不用做,如express.js中配置如下,其它后端语言配置同理

    app.all('*', function(req, res, next) {
        res.header("Access-Control-Allow-Origin", "*");
        res.header("Access-Control-Allow-Headers", "X-Requested-With");
        res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
        res.header("X-Powered-By",'3.2.1')
        res.header("Content-Type", "application/json;charset=utf-8");
        next();
    });

    2.使用nginx反向代理,在配置文件nginx.conf中找到server{}对象,更改项目地址root和配置代理地址proxy_pass,这个方法适合前端静态文件使用:

    location / {
        root   D:/browseClient/dist;  #自己的前端项目地址
        index  index.html index.htm;
    }
    #解决跨域
    location /api {                                # 自定义nginx接口前缀
        proxy_pass   http://127.0.0.1:3000;            # 后台api接口地址
                proxy_redirect default;      
        #设置主机头和客户端真实地址,以便服务器获取客户端真实IP
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;   
    }

    3.如果使用vue-cli搭建的项目,可以直接使用proxyTable模块,项目框架已经集成,找到配置文件在/confif/index.j,如下配置

    //代理配置表,在这里可以配置特定的请求代理到对应的API接口
    proxyTable:{
        "/adv":{
            target:"http://127.0.0.1:3000",//需要访问的服务器地址
            changeOrigin:true,//true为开启代理
            pathRewrite:{
                '^/adv': '/'//路径的替换规则
            }
        },
        "/user":{
            target:"http://127.0.0.1:3000",//访问的服务器地址
            changeOrigin:true,//true为开启代理
            pathRewrite:{
                '^/user': '/'//路径的替换规则
            }
        }
    }

    显然,大部分情况我们不可能为每个api接口都在这加一个规则,所以更好的配置是:

    proxyTable: {
        '**': {
            target: 'http://127.0.0.1:3000',
            changeOrigin: true,   //允许跨域
        }
    }

    或者

    proxyTable: [{
        context: ['/**'],
        target: 'http://127.0.0.1:3000',
        changeOrigin: true,  //允许跨域
    }]

    是不是方便了很多
    4.其它,如jsonp是通过接口回调的方式实现跨域,这个现在已经用的少了。window.postMessage() 是HTML5的一个接口,专注实现不同窗口不同页面的跨域通讯。这些是对单个接口或者页面层面的跨域,使用也简单就不详细说了。

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-9-17 11:51 , Processed in 0.062618 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表