Ajax 跨域请求:

Ajax 在进行跨域请求时受到同源策略的限制。即默认情况下,XMLHttpRequest 对象只能访问与包含它的页面位于同一域中的资源。
同源策略可以预防某些恶意的行为,但是,有时候我们需要进行合理的跨域请求。

允许 Ajax 进行跨域请求需要在服务器端进行特殊修改.
服务器端需要在响应头中添加 Access-Control-Allow-Origin 头部来指定允许跨域访问的请求来源:
     Access-Control-Allow-Origin: *

     * 值表示允许任意跨域请求。

     如果响应中没有改头部,或头部与来源不匹配,浏览器会驳回请求。

  注意,默认情况下,跨域请求不会包含 Cookie 信息。


如果在跨域请求时需要携带凭据(Cookie、HTTP认证、客户端SSL证明等)。可以将 XHR 对象的 withCredentials 属性设置为 true。
服务器如果接收带凭据的请求,则响应中包含如下头部:
     Access-Control-Allow-Credentials: true

  注意:如果Ajax请求时,设置了 withCredentials 属性为 true,那么Access-Conrol-Allow-Origin 需要设置具体值,不允许为 *

================================================================
具体实例:
  某个网站由动态服务器和静态服务器组成,两个服务器的资源根据同源策略是属于不同来源。
  对于动态页面,可以直接从会话中获取用户名来显示。但是像网站首页等静态页面中,只能使用 ajax 请求来获取用户名。
     不过:
          1)由于静态页面部署目录在另一个tomcat下,静态页面中的js与网站其它动态页面生成来源并不相同,所有单纯的 ajax 请求并不适用。
          2)用户登录后信息会在会话中有存储。所有每次静态页面向服务器中查询用户是否登录时都是在判断会话中是否存在用户的信息,如果存在,则用户是登录的。
          3)用户登录后的会话id是存放在cookie中的,普通 ajax 跨源请求并不能携带cookie,所有即使是在同一个浏览器的不同窗口中,从静态页发起的跨域 ajax 请求并不能被服务器当做同一会话。所有用户登录信息不能被静态页中的ajax请求获取到。

     解决方法:
  1)服务器端返回时设置 Access-Control-Allow-Origin 允许指定页面的 ajax 跨域访问。
               response.setHeader("Access-Control-Allow-Origin", "http://www.site.com:8081");
               http://www.site.com:8081 是静态页请求来源
  2)使用 ajax 请求时,设置 withCredentials 属性为 true,表示请求携带凭据。
               $.ajax({
                    url: url,
                    type: "get",
                    dataType: "json",
                    xhrFields: {
                         withCredentials: true
                    },
                    success: succCfun
               });
  3)服务器返回时设置 Access-Control-Allow-Credentials为 true,表示服务器接受带凭据请求。
               response.setHeader("Access-Control-Allow-Credentials", "true");
posted on 2015-10-05 21:36  蚯蚓饮泉  阅读(842)  评论(0)    收藏  举报