HTML5 跨域提交和上传实现 及 nginx $_SERVER[‘HTTP_X_FILENAME’]解决

以下所涉及的基本都需要有服务器端的权限,没有请绕道~ ,当然也可以当学习哈~

GET

这个普通的jsonp就可以了,其实就是远程调个本地的函数。。谷歌去吧。

POST

发现个有意思的,就是file条件下可以无视跨域,这种做内置浏览器的时候可以好好利用下。

AJAX 这个是本篇最纠结的

普通提交依旧通过jsonp解决

关于表单提交和文件的上传

需要服务器端头的设置

相关原理参考: http://drops.wooyun.org/tips/188

服务器端的设置代码为

if (isset ( $_SERVER ['HTTP_ORIGIN'] )) {
	header ( "Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}" );
	header ( 'Access-Control-Allow-Credentials: true' );
	header ( 'Access-Control-Max-Age: 86400' ); // cache for 1 day
}
// Access-Control headers are received during OPTIONS requests
if ($_SERVER ['REQUEST_METHOD'] == 'OPTIONS') {

	if (isset ( $_SERVER ['HTTP_ACCESS_CONTROL_REQUEST_METHOD'] ))
		header ( "Access-Control-Allow-Methods: GET, POST, OPTIONS" );

	if (isset ( $_SERVER ['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'] ))
		header ( "Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}" );

	// exit(0);
}

 

XMLHttpRequest Level 2

是否支持跨域的脚本验证

var xhr = new XMLHttpRequest();
	if (typeof xhr.withCredentials == undefined) {
		document.write("fuck");
		//This browser does not support xhr2 yet.
	} else {
		document.write("true");
		//Go head!
	}

简单数据提交

	xhr.open("POST", "http://xxxxxxx", true);
	xhr.onload = function(data) {
		document.write("ok");
		document.write(data);
		//加载完咯...
	}
	//支持跨域发送cookies 改成true 就发不了... 和顺序没有关系
	//xhr.withCredentials = true;
	xhr.send();

 

上传相关文件从这获取,别人写好的,使用的是html5的特性。不过要积分。javaeye那边无需积分

http://blog.csdn.net/never_say_goodbye/article/details/8598521

上传的文件的提取不同于表单的提交,也不能简单通过查看chrome的表单请求头做判断

上传的文件名

$fn = (isset($_SERVER['HTTP_X_FILENAME']) ? $_SERVER['HTTP_X_FILENAME'] : false);

注:这样获取的文件名在apache下可用。在nginx 里会无法获取。可直接通过判断php://input进行文件传入判断,完善点可以再通过获取文件头判断文件类型

上传的文件数据,单个。。

file_get_contents('php://input')

转发请注明出处http://blog.martoo.cn
如有漏缺,请联系我 QQ 243008827

发表评论

电子邮件地址不会被公开。 必填项已用*标注