推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
tanteng

ajax 在子域名下跨域的问题

  •  
  •   tanteng · Apr 1, 2015 · 9470 views
    This topic created in 4086 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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

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

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

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

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

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

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

    另外,a.xx.com请求b.xx.com是不是有跨域问题?
    tanteng
        31
    tanteng  
    OP
       Apr 3, 2015
    我现在已经解决了这个问题,方法是把b.xx.com的请求代码复制到了a.xx.com,不然要改很多js代码
    FrankFang128
        32
    FrankFang128  
       Apr 3, 2015
    @tanteng 是跨域,但满足下面任意一条时就可以请求
    1. a.xx.comb.xx.com 均降域
    2. 使用了 CORS 协议
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   961 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 129ms · UTC 19:43 · PVG 03:43 · LAX 12:43 · JFK 15:43
    ♥ Do have faith in what you're doing.