【HTTP header】【Access-Control-Allow-Credentials】跨域Ajax请求时是否带Cookie的设置
1. 无关Cookie跨域Ajax请求
客户端
以 Jquery 的 ajax 为例:
- $.ajax({
- url : 'http://remote.domain.com/corsrequest',
- data : data,
- dataType: 'json',
- type : 'POST',
- crossDomain: true,
- contentType: "application/json", // POST时必须
- ...
主要注意的是参数 crossDomain: true。发送Ajax时,Request header 中会包含跨域的额外信息,但不会含cookie。
服务器端
跨域的允许主要由服务器端控制。服务器端通过在响应的 header 中设置 Access-Control-Allow-Origin
及相关一系列参数,提供跨域访问的允许策略。相关参数的设置介绍,可参见 [Access_control_CORS]
以Java为例:
- /**
- * Spring Controller中的方法:
- */
- @RequestMapping(value = "/corsrequest")
- @ResponseBody
- public Map<String, Object> mainHeaderInfo(HttpServletResponse response) {
- response.setHeader("Access-Control-Allow-Origin", "*");
- ...
- }
- 通过在响应 header 中设置 ‘*’ 来允许来自所有域的跨域请求访问。
- response.setHeader("Access-Control-Allow-Origin", "*");
- 只允许来自特定域
http://my.domain.cn:8080
的跨域访问- response.setHeader("Access-Control-Allow-Origin", "http://my.domain.cn:8080");
- 较灵活的设置方式,允许所有包含
mydomain.com
的域名访问.- if(request.getHeader("Origin").contains("mydomain.com")) {
- response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
- }
2. 带Cookie的跨域Ajax请求
客户端
- $.ajax({
- url : 'http://remote.domain.com/corsrequest',
- data : data,
- dataType: 'json',
- type : 'POST',
- xhrFields: {
- withCredentials: true
- },
- crossDomain: true,
- contentType: "application/json",
- ...
通过设置
withCredentials: true
,发送Ajax时,Request header中便会带上 Cookie 信息。服务器端
相应的,对于客户端的参数,服务器端也需要进行设置:
- /**
- * Spring Controller中的方法:
- */
- @RequestMapping(value = "/corsrequest")
- @ResponseBody
- public Map<String, Object> getUserBaseInfo(HttpServletResponse response) {
- if(request.getHeader("Origin").contains("woego.cn")) {
- response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
- }
- response.setHeader("Access-Control-Allow-Credentials", "true");
- ...
- }
对应客户端的
xhrFields.withCredentials: true
参数,服务器端通过在响应 header 中设置Access-Control-Allow-Credentials = true
来运行客户端携带证书式访问。通过对 Credentials 参数的设置,就可以保持跨域 Ajax 时的 Cookie。这里需要注意的是:服务器端
Access-Control-Allow-Credentials = true
时,参数Access-Control-Allow-Origin
的值不能为'*'
。 - if(request.getHeader("Origin").contains("mydomain.com")) {
3. Java中使用跨域 Filter
当允许跨域访问的接口较多时,在每个请求中都添加 Access-Control-Allow-Origin 显然是不合适的。对于比较原生的 Java web 应用,使用 Filter 是一个不错的选择。
NOTE:不同的框架,特别是支持REST的框架,大多提供了自己的跨域设置方式,如Spring4的Config等,可以优先从使用的框架中寻找支持。
Filter本身很简单,可以直接把上面两句设置 Header 的语句抽取出来写一个Filter。这里推荐一个 Tomcat 中的 Filter:
org.apache.catalina.filters.CorsFilter
。- <filter>
- <filter-name>CorsFilter</filter-name>
- <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>CorsFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
一点补充:
Filter的 默认 设置包含了:- <filter>
- <filter-name>CorsFilter</filter-name>
- <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
- <init-param>
- <param-name>cors.allowed.origins</param-name>
- <param-value>*</param-value>
- </init-param>
- <init-param>
- <param-name>cors.support.credentials</param-name>
- <param-value>true</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>CorsFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
这里的 cors.allowed.origins 虽然是 ‘*’,但实现上已经被优化,不会与 credentials 冲突
- <filter>
【HTTP header】【Access-Control-Allow-Credentials】跨域Ajax请求时是否带Cookie的设置的更多相关文章
- 跨域Ajax请求时是否带Cookie的设置
1. 无关Cookie跨域Ajax请求 客户端 以 Jquery 的 ajax 为例: $.ajax({ url : 'http://remote.domain.com/corsrequest', d ...
- 跨域Ajax请求WebService方法
一.允许跨域Ajax请求,更改如下配置: 在要调用的WebService上面添加特性标签: 二.以如下返回用户信息的WebService方法为例 三.在另一个网站上通过Ajax访问webService ...
- 使用$.getJSON实现跨域ajax请求
jQuery中常用getJSON来调用并获取远程的JSON字符串,将其转换为JSON对象,如果成功,则执行回调函数.原型如下: jQuery.getJSON( url, [data], [callba ...
- 用JQuery的$.getJSON发起跨域Ajax请求
jQuery中常用getJSON来调用并获取远程的JSON字符串,将其转换为JSON对象,如果成功,则执行回调函数.原型如下: jQuery.getJSON( url, [data], [callba ...
- jQuery+ASP.NET MVC基于CORS实现带cookie的跨域ajax请求
这是今天遇到的一个实际问题,在这篇随笔中记录一下解决方法. ASP.NET Web API提供了CORS支持,但ASP.NET MVC默认不支持,需要自己动手实现.可以写一个用于实现CORS的Acti ...
- 跨域Ajax请求 web.config文件配置
在web.config文件的<system.webServer>节点下面添加如下配置代码:<!--允许跨域ajax访问--> <httpProtocol> < ...
- .net MVC下跨域Ajax请求(CORS)
二.CROS (Cross-origin Resource Sharing) CROS相当于一种协议,由浏览器.服务端共同完成安全验证,进行安全的跨域资源共享.对于开发人员来说就跟在本站AJAX请求一 ...
- chrome实现全浏览器跨域ajax请求
如图,在chrome快捷方式上打开属性栏,在‘目标’栏加上后缀--disable-web-security --user-data-dir.即可实现在此浏览器上所有网页的跨域请求.
- 跨域Ajax请求(jQuery JSONP MVC)
通过jQuery的$.ajax方法发送JSONP请求 js代码 <script type="text/javascript"> function jsonptest2( ...
随机推荐
- Spring Tools Suite (STS) 简介
首先,sts是一个定制版的Eclipse,专为Spring开发定制的,方便创建调试运行维护Spring应用. 官方页面.下载地址(3.8.1 win x64). 其次,没什么好介绍的,用一下就明白了. ...
- IOC关注服务(或应用程序部件)是如何定义的以及他们应该如何定位他们依赖的其它服务
IOC关注服务(或应用程序部件)是如何定义的以及他们应该如何定位他们依赖的其它服务.通常,通过一个容器或定位框架来获得定义和定位的分离,容器或定位框架负责: 保存可用服务的集合 提供一种方式将各种部件 ...
- 转载: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- ...
- python中使用@property
class Student(object): @property def score(self): return self._score @score.setter def score(self, v ...
- Windows 上 GitHub Desktop 的操作[转]
第1章 上传开源代码至GitHub 1 1.1 git Windows 客户端 1 1.2 注册GitHub账户 2 1.3 登录 2 1.4 创建本地代码仓库 2 1. ...
- java web - 为什么要使用spring struts
1.软件里有很多优秀的框架,有一种类型的框架,它的特点是建立在一个现有技术的基础上,提供和现有技术一样业务功能的技术框架,这个新的技术框架比原技术更加易用,更加健壮同时功能更加强大,例如:jQuery ...
- sudo 之后 unable to resolve host的问题解决办法
gedit /etc/hosts #127.0.0.1 localhost #127.0.0.1 Masterback或者其他 把后面的Masterback 或者其他改成新的主机名,应该是最近修改过主 ...
- 数字转人民币大写(SQL SERVER)
--数字转人民币大写NumToRMB ---新建方法create FUNCTION dbo.NumToRMB (@num numeric(14,5)) RETURNS varchar(100) ...
- The Rox Java NIO Tutorial
FQ之后访问 http://rox-xmlrpc.sourceforge.net/niotut/
- js中如何跳出循环
1.for循环中我们使用continue:终止本次循环计入下一个循环,使用break终止整个循环. 2.而在jquery中 $.each使用return true 终止本次循环计入下一个循环,retu ...