[]解决跨域相关!

已邀请:

Laya_XS

赞同来自: ohkei elfhuv

跨域问题分为两种:一种是文件请求跨域,一种是数据请求跨域;
1、文件请求跨域的解决方法有两种,一种是上面同事说的,此种方法只能解决本地调试的问题,无法解决其他主机存在的跨域问题,想彻底解决文件跨域问题,需要修改webServer(一般webserver大多数都是 apache、nginx、tomcat等),在请求特定的域名下加上跨域标识,这里以nginx为例:
http {
  ......
  add_header Access-Control-Allow-Origin *;
  add_header Access-Control-Allow-Headers X-Requested-With;
  add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
  ......
}
这样就可以实现GET,POST,OPTIONS的跨域请求的支持
也可以 add_header Access-Control-Allow-Origin http://www.layabox.com; --指定允许的url;
2、数据请求跨域需要后端语言配合修改,在请求里加上header标识,这里以php语言为例:
header("Access-Control-Allow-Origin: *");不一定用*,*是允许所有的主机跨域访问,你也可以写指定域名下的主机可以访问;

cuixueying

赞同来自: shenzhe charley yyyyyy亚帅

由于浏览器本身默认的是不允许文件跨文件读取的,会涉及到跨域的问题。
通过添加启动参数可以解决跨域问题。
在chrome浏览器快捷方式->右击打开属性->快捷方式一栏->目标末尾添加 --allow-file-access-from-files
打开快捷方式,将转换后自动生成的html文件拖拽至chrome浏览器即可正常显示。
 

layaFlash - LayaFlash为Flash程序员而生

赞同来自: charley a365571557

即将推出新的LayaFlash工具,集成运行器调试环境

郭一伟

赞同来自: 咕咕噜噜

我们服务器休假去了,自己正做laya小程序做测试,这几天被服务器整的头大,服务器也不知道死哪去了,用netty做的我也不知道怎么改,我总结了几个问题,等服务器滚回来时一起算帐
1,加‘--allow-file-access-from-files’头,是在前端加?tomcat加?后端加?还是都加?
2,目前没加头,让服务器和web程序在同一机器里跑,在send后,仍然没有反应,用layaair调式有反应,这算跨域问题吗?这是SSL的问题吗?
3,我想做个测试,不用我们那个死服务器了,就连www.baidu.com,这个加头后,为啥还连不上,
看代码->
this.hr=new HttpRequest();
this.hr.once(Laya.Event.PROGRESS, this, this.onHttpRequestProgress);
this.hr.once(Laya.Event.COMPLETE, this, this.onHttpRequestComplete);
this.hr.once(Laya.Event.ERROR, this, this.onHttpRequestError);
this.hr.send("http://www.baidu.com", null, 'post', 'text',
['Access-Control-Allow-Origin','*',
'Access-Control-Allow-Headers','X-Requested-With',
'Access-Control-Allow-Methods','GET,POST,OPTIONS']);//一定在哪写错,快来帮我看看呀
 
我没做过H5,没做过WEB,都是我们那个万恶的策划逼我把cocos的项目用laya重写,十几万行代码呢,C++转成TS,说这有前途,跨域不知道是啥,只能理解成不是一个路由器下的两台机器,别喷我,每个人是从小小白成长起来的。

mingchaoyan

赞同来自:

mac 用户可在ide上用二维码打开
嗯,虽然麻烦点,但是勉强可用
1.7.7

taisss

赞同来自:

mac用户直接用Safari, 本地调试没有跨域烦恼!

aidimiebear

赞同来自:

前段时间我用laya做了一个联网的游戏,涉及了跨域的问题,我的服务端用的skynet,http服务也是用的skynet提供的http例子自己做的扩充,我的解决方案是在服务端做了处理,在返回数据时添加了个附加参数,例如这样,  response(id, code, result, {["Access-Control-Allow-Origin"]="*"})     希望对用skynet做服务端http的朋友有帮助。如果是apache或者nginx的话也是可以在服务端返回的时候加上这样类似的参数,不过如果是正式环境的话,最好不要用*,会留下漏洞的。

Laya_XS

赞同来自:

谢谢!

CrossCrush

赞同来自:

Mac下可使用命令行打开chrome,记住先关闭当前chrome窗口。
 
open -a /Applications/Google\ Chrome.app --args --disable-web-security --user-data-dir

180*****197

赞同来自:

问一下 "在request header加上Origin" 是个什么写法

152*****450

赞同来自:

打开一个新的可跨域的chrome窗口实现方法:https://ask.layabox.com/question/39289​ 
1. 打开终端
2. 输入下面的命令( 需要替换路径中的yourname )
open -n /Applications/Google\ Chrome.app/ --args --disable-web-security  --user-data-dir=/Users/yourname/MyChromeDevUserData/

备:Mac下可使用命令行打开chrome,记住先关闭当前chrome窗口。
注意
网上有些文章--user-data-dir参数后面没有添加文件夹名,是设置不成功的。
这是在mac的根目录在建了一个叫MyChromeDevUserData的文件夹,用于保存关闭安全策略后的用户信息的,名字可以随意取,位置也可以随意放,只要路径是正确的就可以。
发现
第一次打开chrome有黄色背景色的“--disable-web-security”相关的提示,说明浏览器设置跨域成功。
再次用执行上面的命令行时,不会再有相关提示了,但是还是能跨域的!

zpo

赞同来自:

请问laya工具构建的app,layanative下载资源时直接报does not belong to the same app domain,这个怎么解决呢

一级保护废物

赞同来自:

laya的官方API文档不能查API,要它何用,删了吧!!!

Nomat

赞同来自:

请问laya工具构建的app,layanative下载资源时直接报does not belong to the same app domain,这个怎么解决呢

十字寒鸦

赞同来自:

资源跟游戏的启动文件xxx.html放同目录试试

赞同来自:

跨域用jsonp请求到了之后,还是加载不了,日,用请求到的地址赋image的url还是不行,只能用这个方法了,自己搞一个,用网页标签加载,ts版本的哈
export default class HTMLDivImage {
private _div: any;
private _image: any;
private _showing: boolean;
constructor(url: string = null, caller: any = null, onComplate: any = null, onError: any = null) {
this._div = null;
this._image = null;
// private var _onError:*;
this._showing = false;
if (url) {
this.load(url, caller, onComplate, onError);
}
}
public load(url: string, caller: any, onComplate: Function, onError: Function) {
let onload = function () {
if (onComplate) {
onComplate.apply(caller);
}
};
let onerror = function () {
if (onError) {
onError.apply(caller);
}
}
if (!this._image) {
this._image = new Laya.Browser.window.Image();
}
if (!this._div) {
let div = Laya.Browser.window.document.createElement("div");
div.style["position"] = "absolute";
div.style["z-index"] = 999;
div.appendChild(this._image);
this._div = div;
}
if (!this._showing) {
this._showing = true;
Laya.Browser.window.document.body.appendChild(this._div);
}
this._image.onload = onload;
this._image.onerror = onerror;
this._image.src = url;

public move(xpos: number, ypos: number) {
this.x = xpos;
this.y = ypos;

public size(width: number, height: number) {
if (this._image) {
this._image.style["width"] = width + "px";
this._image.style["height"] = height + "px";
}

public remove() {
if (this._showing) {
this._showing = false;
if (this._div && this._div.parentNode) {
this._div.parentNode.removeChild(this._div);
}
}

public get width() {
if (this._image) {
return this._image.width;
}
return 0;
}
public get height() {
if (this._image) {
return this._image.height;
}
return 0;
}
public set x(value: number) {
if (this._div) {
this._div.style["left"] = value + "px";
}
}
public set y(value: number) {
if (this._div) {
this._div.style["top"] = value + "px";
}
}
}
JosnP官方有例子,自己也写了下
/**
* 使用jsonp请求格式,解决跨域问题
* @param url
* @param callback
*/
public static jsonP(url: string, callback: Function): void {
let cbName = 'callback_' + new Date().getTime();
url += '&callback=' + cbName;
let ele: any = Laya.Browser.document.createElement('script');
ele.src = url;
Laya.Browser.document.body.appendChild(ele);
Laya.Browser.window[cbName] = function (data: any) {
callback(data);
ele.parentNode.removeChild(ele);
}
}

bigrys

赞同来自:

感谢

152*****794

赞同来自:

直接用node代理不就行了吗
解决方案太多了
我一般用这个
http-proxy-middleware

要回复问题请先

商务合作
商务合作