1. 无关Cookie跨域Ajax请求

客户端

以 Jquery 的 ajax 为例:

  

  1. $.ajax({
  2. url : 'http://remote.domain.com/corsrequest',
  3. data : data,
  4. dataType: 'json',
  5. type : 'POST',
  6. crossDomain: true,
  7. contentType: "application/json", // POST时必须
  8. ...

主要注意的是参数 crossDomain: true。发送Ajax时,Request header 中会包含跨域的额外信息,但不会含cookie。

服务器端

跨域的允许主要由服务器端控制。服务器端通过在响应的 header 中设置 Access-Control-Allow-Origin 及相关一系列参数,提供跨域访问的允许策略。相关参数的设置介绍,可参见 [Access_control_CORS]

以Java为例:

  1. /**
  2. * Spring Controller中的方法:
  3. */
  4. @RequestMapping(value = "/corsrequest")
  5. @ResponseBody
  6. public Map<String, Object> mainHeaderInfo(HttpServletResponse response) {
  7. response.setHeader("Access-Control-Allow-Origin", "*");
  8. ...
  9. }
  • 通过在响应 header 中设置 ‘*’ 来允许来自所有域的跨域请求访问。

    1. response.setHeader("Access-Control-Allow-Origin", "*");
  • 只允许来自特定域 http://my.domain.cn:8080 的跨域访问
    1. response.setHeader("Access-Control-Allow-Origin", "http://my.domain.cn:8080");
  • 较灵活的设置方式,允许所有包含 mydomain.com 的域名访问.
    1. if(request.getHeader("Origin").contains("mydomain.com")) {
    2. response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
    3. }

    2. 带Cookie的跨域Ajax请求

    客户端

    1. $.ajax({
    2. url : 'http://remote.domain.com/corsrequest',
    3. data : data,
    4. dataType: 'json',
    5. type : 'POST',
    6. xhrFields: {
    7. withCredentials: true
    8. },
    9. crossDomain: true,
    10. contentType: "application/json",
    11. ...

    通过设置 withCredentials: true ,发送Ajax时,Request header中便会带上 Cookie 信息。

    服务器端

    相应的,对于客户端的参数,服务器端也需要进行设置:

    1. /**
    2. * Spring Controller中的方法:
    3. */
    4. @RequestMapping(value = "/corsrequest")
    5. @ResponseBody
    6. public Map<String, Object> getUserBaseInfo(HttpServletResponse response) {
    7. if(request.getHeader("Origin").contains("woego.cn")) {
    8. response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
    9. }
    10. response.setHeader("Access-Control-Allow-Credentials", "true");
    11. ...
    12. }

    对应客户端的 xhrFields.withCredentials: true 参数,服务器端通过在响应 header 中设置 Access-Control-Allow-Credentials = true 来运行客户端携带证书式访问。通过对 Credentials 参数的设置,就可以保持跨域 Ajax 时的 Cookie。这里需要注意的是:

    服务器端 Access-Control-Allow-Credentials = true时,参数Access-Control-Allow-Origin 的值不能为 '*' 

  • 3. Java中使用跨域 Filter

    当允许跨域访问的接口较多时,在每个请求中都添加 Access-Control-Allow-Origin 显然是不合适的。对于比较原生的 Java web 应用,使用 Filter 是一个不错的选择。

    NOTE:不同的框架,特别是支持REST的框架,大多提供了自己的跨域设置方式,如Spring4的Config等,可以优先从使用的框架中寻找支持。

    Filter本身很简单,可以直接把上面两句设置 Header 的语句抽取出来写一个Filter。这里推荐一个 Tomcat 中的 Filter:org.apache.catalina.filters.CorsFilter

      • 引入 
        这个类在 Tomcat 的 catalina.jar 中,可以通过将 tomcat/lib 下的 jar 包引用到项目中的方式来使用。但如果你对项目的 jar 环境有’洁癖’, 也可以单独把 这个类的 SVN源码 拷贝到项目中,修改(删除)一下‘日志’和‘异常提示内容’的引用就可以运行在任何原生java web项目中了。

      • 设置方法 
        在 web.xml 中设置Filter:

    1. <filter>
    2. <filter-name>CorsFilter</filter-name>
    3. <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
    4. </filter>
    5. <filter-mapping>
    6. <filter-name>CorsFilter</filter-name>
    7. <url-pattern>/*</url-pattern>
    8. </filter-mapping>

    一点补充: 
    Filter的 默认 设置包含了:

    1. <filter>
    2. <filter-name>CorsFilter</filter-name>
    3. <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
    4. <init-param>
    5. <param-name>cors.allowed.origins</param-name>
    6. <param-value>*</param-value>
    7. </init-param>
    8. <init-param>
    9. <param-name>cors.support.credentials</param-name>
    10. <param-value>true</param-value>
    11. </init-param>
    12. </filter>
    13. <filter-mapping>
    14. <filter-name>CorsFilter</filter-name>
    15. <url-pattern>/*</url-pattern>
    16. </filter-mapping>

    这里的 cors.allowed.origins 虽然是 ‘*’,但实现上已经被优化,不会与 credentials 冲突

【HTTP header】【Access-Control-Allow-Credentials】跨域Ajax请求时是否带Cookie的设置的更多相关文章

  1. 跨域Ajax请求时是否带Cookie的设置

    1. 无关Cookie跨域Ajax请求 客户端 以 Jquery 的 ajax 为例: $.ajax({ url : 'http://remote.domain.com/corsrequest', d ...

  2. 跨域Ajax请求WebService方法

    一.允许跨域Ajax请求,更改如下配置: 在要调用的WebService上面添加特性标签: 二.以如下返回用户信息的WebService方法为例 三.在另一个网站上通过Ajax访问webService ...

  3. 使用$.getJSON实现跨域ajax请求

    jQuery中常用getJSON来调用并获取远程的JSON字符串,将其转换为JSON对象,如果成功,则执行回调函数.原型如下: jQuery.getJSON( url, [data], [callba ...

  4. 用JQuery的$.getJSON发起跨域Ajax请求

    jQuery中常用getJSON来调用并获取远程的JSON字符串,将其转换为JSON对象,如果成功,则执行回调函数.原型如下: jQuery.getJSON( url, [data], [callba ...

  5. jQuery+ASP.NET MVC基于CORS实现带cookie的跨域ajax请求

    这是今天遇到的一个实际问题,在这篇随笔中记录一下解决方法. ASP.NET Web API提供了CORS支持,但ASP.NET MVC默认不支持,需要自己动手实现.可以写一个用于实现CORS的Acti ...

  6. 跨域Ajax请求 web.config文件配置

    在web.config文件的<system.webServer>节点下面添加如下配置代码:<!--允许跨域ajax访问--> <httpProtocol> < ...

  7. .net MVC下跨域Ajax请求(CORS)

    二.CROS (Cross-origin Resource Sharing) CROS相当于一种协议,由浏览器.服务端共同完成安全验证,进行安全的跨域资源共享.对于开发人员来说就跟在本站AJAX请求一 ...

  8. chrome实现全浏览器跨域ajax请求

    如图,在chrome快捷方式上打开属性栏,在‘目标’栏加上后缀--disable-web-security --user-data-dir.即可实现在此浏览器上所有网页的跨域请求.

  9. 跨域Ajax请求(jQuery JSONP MVC)

    通过jQuery的$.ajax方法发送JSONP请求 js代码 <script type="text/javascript"> function jsonptest2( ...

随机推荐

  1. Spring Tools Suite (STS) 简介

    首先,sts是一个定制版的Eclipse,专为Spring开发定制的,方便创建调试运行维护Spring应用. 官方页面.下载地址(3.8.1 win x64). 其次,没什么好介绍的,用一下就明白了. ...

  2. IOC关注服务(或应用程序部件)是如何定义的以及他们应该如何定位他们依赖的其它服务

    IOC关注服务(或应用程序部件)是如何定义的以及他们应该如何定位他们依赖的其它服务.通常,通过一个容器或定位框架来获得定义和定位的分离,容器或定位框架负责: 保存可用服务的集合 提供一种方式将各种部件 ...

  3. 转载:Create a Flash Login System Using PHP and MySQL

    本文共两部分: 1. http://dev.tutsplus.com/tutorials/create-a-flash-login-system-using-php-and-mysql-part-1- ...

  4. python中使用@property

    class Student(object): @property def score(self): return self._score @score.setter def score(self, v ...

  5. Windows 上 GitHub Desktop 的操作[转]

    第1章 上传开源代码至GitHub    1 1.1 git Windows 客户端    1 1.2 注册GitHub账户    2 1.3 登录    2 1.4 创建本地代码仓库    2 1. ...

  6. java web - 为什么要使用spring struts

    1.软件里有很多优秀的框架,有一种类型的框架,它的特点是建立在一个现有技术的基础上,提供和现有技术一样业务功能的技术框架,这个新的技术框架比原技术更加易用,更加健壮同时功能更加强大,例如:jQuery ...

  7. sudo 之后 unable to resolve host的问题解决办法

    gedit /etc/hosts #127.0.0.1 localhost #127.0.0.1 Masterback或者其他 把后面的Masterback 或者其他改成新的主机名,应该是最近修改过主 ...

  8. 数字转人民币大写(SQL SERVER)

    --数字转人民币大写NumToRMB ---新建方法create  FUNCTION dbo.NumToRMB (@num numeric(14,5))   RETURNS varchar(100) ...

  9. The Rox Java NIO Tutorial

    FQ之后访问 http://rox-xmlrpc.sourceforge.net/niotut/

  10. js中如何跳出循环

    1.for循环中我们使用continue:终止本次循环计入下一个循环,使用break终止整个循环. 2.而在jquery中 $.each使用return true 终止本次循环计入下一个循环,retu ...