V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
tanteng
V2EX  ›  JavaScript

ajax 在子域名下跨域的问题

  •  
  •   tanteng · 2015-04-01 20:49:11 +08:00 · 8880 次点击
    这是一个创建于 3509 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有两个子域名,a.xx.com和b.xx.com,现在我在a.xx.com一个页面中发送ajax请求b.xx.com一个控制器中的方法,希望得到返回数据,但是返回状态302,应该是跨域问题没有解决。

    网上有很多方法解决子域名跨域,但比较杂乱,说说一般常见的专业做法是怎样的,谢谢!

    32 条回复    2015-04-03 12:29:38 +08:00
    jokester
        1
    jokester  
       2015-04-01 20:56:17 +08:00
    302为什么"应该是跨域问题没有解决"
    能不能讲一下你的思路
    jasonslyvia
        2
    jasonslyvia  
       2015-04-01 21:01:53 +08:00
    b.xx.com 中添加 Access-Control-Allow-Origin: a.xx.com 即可,详细的请查相关文档。
    Ison
        3
    Ison  
       2015-04-01 21:15:26 +08:00
    jquery的jsonp可以解决跨域问题
    lz可以自己查一下
    tanteng
        4
    tanteng  
    OP
       2015-04-01 21:16:25 +08:00
    @jokester 在b.xx.com的页面请求b.xx.com的方法返回是正常的,状态200,同样的js代码在a.xx.com请求返回状态302,被跳转。
    airyland
        5
    airyland  
       2015-04-01 21:39:26 +08:00
    明显LZ应该先解决b站服务端对于非同域请求返回302的问题。这跟ajax无关了。
    tanteng
        6
    tanteng  
    OP
       2015-04-01 22:20:38 +08:00
    @airyland 解决了跨域也就解决了302,302就是非法请求跳转了
    iyaozhen
        7
    iyaozhen  
       2015-04-01 22:25:17 +08:00
    @tanteng a.xx.com 请求 b.xx.com 就是跨域了。
    所以根源就是跨域问题。上面已经有人告诉你方法了:
    jsonp 或 设置 Access-Control-Allow-Origin
    lk09364
        8
    lk09364  
       2015-04-01 22:28:06 +08:00
    @tanteng 你在哪里的文档看到 302 是『非法请求』……
    anewg
        9
    anewg  
       2015-04-01 22:44:12 +08:00
    302原来叫非法请求跳转。。长见识了
    tanteng
        10
    tanteng  
    OP
       2015-04-01 23:19:23 +08:00
    @lk09364
    @anewg
    请问我有讲302是非法请求跳转吗,请理解别人说话的意思,表达不严谨请见谅!发现在v2ex上很多人真的是不对问题进行讲解,却擅长喷人。
    tanteng
        11
    tanteng  
    OP
       2015-04-01 23:21:30 +08:00
    这个问题就是讨论ajax跨域如何解决的问题,还是用jsonp吧。http://www.tantengvip.com/2015/04/jsonp-ajax/
    tanteng
        12
    tanteng  
    OP
       2015-04-01 23:23:46 +08:00
    @anewg
    @lk09364
    请理解我回复的意思,请求ajax用firefox查看不成功,状态码302,location:其他一个网址。正常的情况是返回状态200,并且显示字节长度等。
    belin520
        13
    belin520  
       2015-04-01 23:52:51 +08:00 via Android
    @tanteng jsonp不支持post,最理想的还是后端开域名白名单
    FrankFang128
        14
    FrankFang128  
       2015-04-01 23:57:17 +08:00 via Android
    302就不是跨域了
    lk09364
        15
    lk09364  
       2015-04-01 23:59:50 +08:00
    @tanteng 也许我的文字表达能力薄,导致你对我的留言有所误解,在此先道个歉。
    我很久之前也处理过类近的问题,而浏览器只是直接返回错误(具体的忘记了),并没有出现 302 。

    据我记忆,302 是伺服器端返回的,而使用AJAX 技术的话302 会被浏览器无视的(除了使用 Access-Control-Origin 外)[0]。如果伺服器返回 302 的话,这问题大概和客户端无关。我从而推断出你有可能在伺服器端使用了一个特殊程序,在遇到错误的跨站请求时会返回 302 。因此我想问问你伺服器端是不是自己写的代码,如果不是的话那是不是在文档里看到『非法请求跳转』这一字串。因为对于一个API 产品/服务来说,这个是常见问题,估计文档会直接给出方法。

    既然场景可以使用 jsonp 的话那就再好不过了,我的场景使用POST,所以不行。

    [0]: http://blog.dzhuvinov.com/?p=979
    anewg
        16
    anewg  
       2015-04-02 00:23:52 +08:00
    @tanteng 那你教教我怎么理解你6楼的回复?浏览器跨域限制跟server返回什么状态码压根就没有直接关系。搞清这两个概念再下结论也不迟不是?
    falcon05
        17
    falcon05  
       2015-04-02 03:17:07 +08:00 via iPhone
    我也根本没有看出是跨域问题,估计是服务端根据referer, cookie ,session之类的判断跳转了
    xz
        18
    xz  
       2015-04-02 07:23:51 +08:00 via Android
    看到6楼跟10我竟然笑了
    airyland
        19
    airyland  
       2015-04-02 08:35:39 +08:00
    我觉得大家还是散了吧。LZ玻璃心又觉得我们理解不对。
    des
        20
    des  
       2015-04-02 08:56:05 +08:00 via Android
    @tanteng 你六楼有讲,谢谢
    TimLang
        21
    TimLang  
       2015-04-02 09:31:01 +08:00
    以前跨域都是jsonp或iframe,现在解决方案成熟很多,你可以搜一下“Angular通过CORS实现跨域方案”
    lincanbin
        22
    lincanbin  
       2015-04-02 09:31:02 +08:00 via Android
    302不是跨域问题,是跳转。
    你关了Chrome默认的安全设置再试试就知道了。
    想必是你目标网站的Apache之类服务做了放盗链,你想要盗链,Header中要附上Refer
    NewYear
        23
    NewYear  
       2015-04-02 10:47:13 +08:00
    其实是误会 为什么是误会 我给你们说

    楼主的意思是 服务器判断了,非法请求返回302,所以返回302在这个情况下是非法的

    楼下的意思是 302状态码原来是代表非法?

    楼主也请你说明白,跨域有两种情况,一种是去请求自己的资源,自己有服务器掌控权,两边都有。这种情况解决方法蛮多的,比如用flash中转,比如上面说的在包头加个参数。

    一种是拿别人的数据,别人要求你按指定的方式可以拿到数据,对方也可能只让自己的网站拿数据,非自己网站,直接不给你数据。而你却想要它的数据……就一般而言,这个方法也蛮多的,你如果有搜索的话,一定会知道的,那就是拿自己服务器来中转请求。

    浏览器对跨域问题还是很严肃的,因为不严肃的话会涉及到安全问题,所以不管是哪一年,都会有无数人抛出这个问题……“如何通过js获取对方网站数据”“如何跨域”等等。

    好了,我给你们排解了误会,也解答了你的问题。给分吧
    niko
        24
    niko  
       2015-04-02 11:10:28 +08:00
    @Ison jsonp只能get
    tonyleen
        25
    tonyleen  
       2015-04-02 11:32:01 +08:00
    tonyleen
        26
    tonyleen  
       2015-04-02 11:32:37 +08:00
    learnshare
        27
    learnshare  
       2015-04-02 12:13:44 +08:00
    JSONP 是一个不太好的解决方案,设置 Access-Control-Allow-Origin 才对。
    wuxqing
        28
    wuxqing  
       2015-04-02 19:37:28 +08:00
    @learnshare
    Access-Control-Allow-Origin不支持ie8及以下版本
    learnshare
        29
    learnshare  
       2015-04-03 10:06:45 +08:00
    @wuxqing 抱歉,IE10-
    tanteng
        30
    tanteng  
    OP
       2015-04-03 11:28:55 +08:00
    @FrankFang128
    @NewYear
    @lincanbin
    @airyland
    @xz
    @anewg
    我没理解清楚,返回了302,就是说跨域请求成功了吗,只是请求被判断为非法请求,没有返回期望的数据而是直接跳转了。能不能这么理解?

    另外,a.xx.com请求b.xx.com是不是有跨域问题?
    tanteng
        31
    tanteng  
    OP
       2015-04-03 11:29:53 +08:00
    我现在已经解决了这个问题,方法是把b.xx.com的请求代码复制到了a.xx.com,不然要改很多js代码
    FrankFang128
        32
    FrankFang128  
       2015-04-03 12:29:38 +08:00
    @tanteng 是跨域,但满足下面任意一条时就可以请求
    1. a.xx.comb.xx.com 均降域
    2. 使用了 CORS 协议
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2514 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 01:29 · PVG 09:29 · LAX 17:29 · JFK 20:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.