七牛---以一个七牛上传的实例小结下AJAX跨域【转】

http://blog.csdn.net/netdxy/article/details/50699842

使用七牛过程中,很多用户或多或少遇到跨域的问题,这篇文章主要介绍下跨域的概念来看什么情况下会出现跨域以及七牛关于跨域的策略。

关于跨域的,说白点就是去别服务器上取东西,域当然是别的服务器,只要协议、域名、端口有任何一个不同,都被当作是不同的域。这里以表单上传结合AJAX请求获取Token上传的Demo为切入点具体看下什么时候会出现跨域。

以下是Demo的代码示例,需要注意的是请求token的链接有两个 
一个是服务端设置允许跨域的生成token的链接http://115.231.183.78//ServletDemo/servlet/UploadToken 
另外一个是服务端没事设置允许跨域的生成token的链接http://115.231.183.78/ServletDemo/servlet/TokenNoCross

<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <script type="application/javascript">
      function xmlhttp() {
            var $xmlhttp;
            if (window.XMLHttpRequest) {
                $xmlhttp = new XMLHttpRequest();
            } else {
                $xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            }
            return $xmlhttp;
        }
        window.onload = function() {
            $xmlhttp = xmlhttp();
            $xmlhttp.onreadystatechange = function() {
                if ($xmlhttp.readyState == 4) {
                    if($xmlhttp.status == 200){
                        //设置id_token的值为请求upTokenUrl返回的值
                        document.getElementById(‘id_token‘).value = $xmlhttp.responseText;
                    }
                }
            }
            //允许跨域的生成token的链接
            $upTokenUrl = ‘http://115.231.183.78//ServletDemo/servlet/UploadToken‘;
            //不允许跨域的生成token的链接
            //$upTokenUrl = ‘http://115.231.183.78/ServletDemo/servlet/TokenNoCross‘;
            $xmlhttp.open(‘GET‘, $upTokenUrl, true);
            $xmlhttp.send();
        };
    </script>
  </head>

  <body>
     <form action="http://up.qiniu.com" method="post" enctype="multipart/form-data" >
        <table>
            <tr>
              <td>上传Token:</td>
            <td><input id="id_token" name="token" type="text" style="width:300px"/></td>
            </tr>
            <tr>
              <td>上传文件名:</td>
            <td><input type="text" name="key" style="width:300px"></td>
            </tr>
            <tr>
              <td>选择文件:</td>
            <td><input type="file" name="file" style="width:300px"></td>
            </tr>
            <tr>
            <td colspan="2">
            <input type="submit" value="上传"/>
            </td>
            </tr>
        </table>
     </form>
  </body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57

这里我将上面说的两种情况分别写入html然后放到另一台不同的IP的虚拟机里面,链接分别为:http://115.231.183.51/upnocross.htmlhttp://115.231.183.51/upcancross.html 
然后加载访问的情况是前者会预期出现AJAX请求Token出现跨域的情况而另一个链接请求是正常的,可以参考下面的截图: 
前者出现跨域的截图: 

正常请求到Token(可以正常上传)的截图: 

根据上面的情况我们可以很清楚地了解跨域是怎样产生的,简单地理解就是因为JavaScript同源策略的限制,a.com 域名下的js无法操作b.com或是c.a.com域名下的对象,解决的方法是可以在服务端设置运行跨域的响应头response.setHeader("Access-Control-Allow-Origin","*")即可。

以下给出Servlet中生成Token并且设置"Access-Control-Allow-Origin","*"的代码。

public class UploadToken extends HttpServlet {
    public UploadToken() {
        super();
    }
    public void destroy() {
        super.destroy();
    }
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String ACCESS_KEY = "um6IEH7mtwnwkGpjImD08JdxlvViuELhI4mFfoeL";
        String SECRET_KEY = "TWvp6zA5HpfIReMr0dxxxxxxxxxxxxxxxxxxxxxx";
        Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);

        String token = auth.uploadToken("javademo", null, 3600*24, null);

        response.setContentType("text/html");
        //设置允许跨域的响应头
        response.setHeader("Access-Control-Allow-Origin","*");

        PrintWriter out = response.getWriter();
        out.println(token);
        out.flush();
        out.close();
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        super.doGet(request,response);
    }
    public void init() throws ServletException {
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

再来看下面的图片中关于两个页面默认是否允许通信的情况就很好理解了。 

对于七牛JS跨域情况来说,总结如下: 
1.上传,默认支持,在发起上传请求的时候,七牛的服务会返回相应的支持跨域的 Header,可以参考以下成功上传的截图中响应头信息: 

2.下载,默认不支持,可以通过配置支持。在你自己的空间中上传 crossdomain.xml 就可以了,其crossdomain.xml里面的内容如下

<cross-domain-policy>
<allow-access-from domain="*"/>
<allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

3.管理(比如文件删除复制移动),不支持,管理服务器不支持js跨域请求(主要是为了数据安全), 如果需要只能从服务端发送管理操作请求。

需要注意的是七牛点播平台空间域名默认有302跳转,AJAX请求会出现跨域,需要取消域名的302跳转才可以。

另外,也可以参考下这篇文章中的表述: 
HTTP访问控制(CORS)

时间: 2024-08-29 13:31:57

七牛---以一个七牛上传的实例小结下AJAX跨域【转】的相关文章

从Ueditor跨域上传,总结的一次跨域上传的爬坑经历

项目内其中一个管理后台需要发布文章,需要一个富文本编辑器,经过一番选择后,最终选择了百度的Ueditor. 由于上传的文件是上传到另一台专门存放图片等静态资源的服务器上面的,所以就涉及到了跨域上传. 我实现跨域上传的主要方式是将编辑器的前后端分离,前段直接放到需要用的项目内,接收上传的后端(已做权限验证)放到图片服务器上面. 跨域要添加两个HTTP头: Access-Control-Allow-Origin: *//允许任意域名发起的跨域请求Access-Control-Allow-Header

《生活就是一个七天接着一个七天》

<生活就是一个七天接着一个七天> 文/马德 (一) 一辈子活下来,常常是,在最有意思的时候,没有有意思地过,在最没意思的时候,想要有意思地过结果却再也过不出意思. 或者,换一种表述就是,在看不透的时候,好看的人生过得不好看:看透了,想过得好看,可是人生已经没法看了. 这句话说得并不绕.其实,人生比这个绕多了. 人生就是这样的一场游戏:在欲望浮沉中,把生命扔到很远很远,最后,只为了找到很近很近的那个简单的自己. (二) 有一年,到大连旅游,参观旅顺日俄监狱.印象中,地牢般的监狱,只有很窄的一方窗

朋友封装的一个ASP.NET上传文件的方法

自我感觉封装得还不错!!! 代码如下: C#代码   #region 上传文件的方法 /// <summary> /// 上传文件方法 /// </summary> /// <param name="myFileUpload">上传控件ID</param> /// <param name="allowExtensions">允许上传的扩展文件名类型,如:string[] allowExtensions = 

朋友封装的一个ASP.NET上传文件的方法(转)

#region 上传文件的方法 /// <summary> /// 上传文件方法 /// </summary> /// <param name="myFileUpload">上传控件ID</param> /// <param name="allowExtensions">允许上传的扩展文件名类型,如:string[] allowExtensions = { ".doc", ".

面试官:请你实现一个大文件上传和断点续传

前言这段时间面试官都挺忙的,频频出现在博客文章标题,虽然我不是特别想蹭热度,但是实在想不到好的标题了-.-,蹭蹭就蹭蹭 :) 事实上我在面试的时候确实被问到了这个问题,而且是一道在线 coding 的编程题,当时虽然思路正确,可惜最终也并不算完全答对 结束后花了一段时间整理了下思路,那么究竟该如何实现一个大文件上传,以及在上传中如何实现断点续传的功能呢? 本文将从零搭建前端和服务端,实现一个大文件上传和断点续传的 demo 文章有误解的地方,欢迎指出,将在第一时间改正,有更好的实现方式希望留下你

HTTP的上传文件实例分析

HTTP的上传文件实例分析 由于论坛不支持Word写文章发帖. 首先就是附件发送怎么搞,这个必须解决.论坛是php的.我用Chrome类浏览器跟踪请求,但是上传的文件流怎么发过去没找到,估计流可能多或者什么的不好显示,只知道发送了文件名字.需要实际了解下post文件,不能只会后台或界面不了解前台数据处理和协议怎么传送数据. 图中:有些相关文章 HTTP请求中的form data和request payload的区别 AJAX POST请求中参数以form data和request payload

PHP-------文件上传的实例

文件上传的实例 一.上传头像 在注册时,要求用户上传头像,登陆主页面,显示用户信息时,头像也要显示出来. 例子: 注册页面: 图片存数据库时是text类型. <title>无标题文档</title> </head> <body> <!--实现用户注册的页面--> <h1>注册</h1> <!--在提交时,除了提交文本性的东西,还要提交文件,要把选中的文件一起提交到处理页面,在处理页面把文件存下来,然后把文件的路径写到

jQuery.uploadify文件上传组件实例讲解

1.jquery.uploadify简介 在ASP.NET中上传的控件有很多,比如.NET自带的FileUpload,以及SWFUpload,Uploadify等等,尤其后面两个控件的用户体验比较好,无刷新,带上传进度等等.在最近的短信平台开发中,使用Uploadify进行文件上传. Uploadify官网地址是:http://www.uploadify.com/ 可满足项目开发需求. 下载地址:http://www.uploadify.com/wp-content/uploads/files/

PHP+ajaxForm异步带进度条上传文件实例

在使用ajaxForm方法之前,首先需要安装form.js的插件,网上有: 一.首先说用法,ajaxForm可以接收0或1个参数,该参数可以是一个变量.一个对象或回调函数,这个对象主要有以下参数: var object= {                     url:url, //form提交数据的地址   type:type,   //form提交的方式(method:post/get)   target:target, //服务器返回的响应数据显示的元素(Id)号