跨域

crosDomain.png

服务器端解决,通过一个filter过滤来自移动端服务器的请求,为response添加Access-Control-Allow信息。通过设置Access-Control-Allow-Credentials=true允许客户端发送cookie,客户端需要设置XMLHttpRequest()的withCredentials 属性为true

 var xhr = new XMLHttpRequest();
    xhr.withCredentials = true;

在ionic中需要设置$http:

  $http({
          method: "GET",
          url: url,
          params: params,
          cache: false,
          timeout: 20000,
          withCredentials:true,
          headers: {'Content-Type': 'application/json;charset=UTF-8','Cache-Control':'no-cache'}
        }).then(function (result) {          
            ...
          }

跨域小知识

客户端ClientA请求服务器server1,server1的页面中使用ajax请求了server2中的数据就发生了跨域。默认情况,浏览器不允许跨域请求。大致解决思路有:

浏览器端解决。

适合开发者自己调试, 在chrome浏览器中添加启动参数:

--args --disable-web-security --user-data-dir 

server端解决方案JSONP。

通过某些手段规避浏览器的跨域规则,比如使用JSONP等,JSONP需要客户端与服务器端配合。
网页通过动态插入<script>元素,由它向跨源网址发出请求,不再受跨域规则限制。
推荐JQuery,在ajax请求中指定dataType:'jsonp'的方式。这种方式自动实现<script>加回调函数的效果。
js代码

<script type="text/javascript" src="jquery.js"></script>  
<script type="text/javascript">  
    $.ajax({  
        url:"http://crossdomain.com/services.php",  
        dataType:'jsonp',  
        data:'',  
        jsonp:'callback',  
        success:function(result) {  
            for(var i in result) {  
                alert(i+":"+result[i]);//循环输出a:1,b:2,etc.  
            }  
        },  
        timeout:3000  
    });  
</script>

这种方法需要js实现处理返回结果的回调函数,如果有很多页面跨域,实现这些回调函数挺烦人的。
服务器端实现,在原来的返回结果基础上添加回调函数名称和括号,默认用success,也可以配合jQuery的ajax请求指定函数名称。
支持跨域前的返回:

['data1','data2']

为支持jsonp,修改后的返回:

callbackFunction(['data1','data2'])

server端实现方案2,通过Allow-Control-Access机制。

现代浏览器都通过Allow-Control-Access机制允许跨域,原理如下:

  1. 浏览器发现存在跨域请求,不直接拒绝,而是向服务器server2发多送一个Origin字段把server1的IP地址加端口告知server2,如果是put、delete这种高危请求,浏览器先发送一个options类型的请求。
  2. 如果server2没有任何允许跨域的意思,浏览器不再处理服务器的响应,而是报一个跨域错误。
  3. 如果server2允许跨域,需要在response中通知浏览器,告知浏览器允许谁跨域,允许不允许浏览器发送cookie信息。
  4. 浏览器检查server2返回的信息,如果当前请求合乎规则,则进一步处理服务器端响应,执行js,展示页面。
    server2允许跨域的java端实现,通过filter为response添加Allow-Control-Access信息:
package org.example.core.filter;

import java.io.IOException;
import java.util.Arrays;
import java.util.List;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import jodd.util.StringUtil;

/**
 * @author damowang 20170802 解决移动端开发浏览器跨域问题
 *
 */
public class CORSFilter implements Filter {
    /**客户端域名,通过init-param配置,在filter初始化时赋值*/
    private String allowOrigin;

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest srequest, ServletResponse sresponse,
            FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) sresponse;
        HttpServletRequest request = (HttpServletRequest) srequest;     
        //设置允许谁(server1的域名或ip)跨域,在一次request中Access-Control-Allow-Methods只能设置一个客户端地址,因此通过判断客户端设置该字段
        if (StringUtil.isNotEmpty(allowOrigin)) {
            List<String> allowOriginList = Arrays.asList(allowOrigin.split(","));
            String currentOrigin = request.getHeader("Origin");
            if (allowOriginList.contains(currentOrigin)) {
                response.setHeader("Access-Control-Allow-Origin", currentOrigin);
            }
        }
        response.setHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS");
        response.setHeader("Access-Control-Allow-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with,Authorization,Cache-Control,Content-Type");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        chain.doFilter(request, response);

    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        allowOrigin = filterConfig.getInitParameter("allowOrigin");

    }
}

web.xml中配置拦截器

<!-- 跨域拦截器 -->
  <filter>
      <filter-name>corsFilter</filter-name>
      <filter-class>org.example.core.filter.CORSFilter</filter-class>
      
      <init-param>
          <param-name>allowOrigin</param-name>
          <param-value>http://server1.com:8100,http://anotherDomainOfServer1.com</param-value>
      </init-param>
  </filter>
  <filter-mapping>
      <filter-name>corsFilter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>

客户端允许发送cookie:

 var xhr = new XMLHttpRequest();
 xhr.withCredentials = true;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,753评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,668评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,090评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,010评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,054评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,806评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,484评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,380评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,873评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,021评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,158评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,838评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,499评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,044评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,159评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,449评论 3 374
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,136评论 2 356

推荐阅读更多精彩内容