1. 无关Cookie跨域Ajax请求

客户端

以 Jquery 的 ajax 为例:

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

主要注意的是参数 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", "*");
...
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 通过在响应 header 中设置 ‘*’ 来允许来自所有域的跨域请求访问。
response.setHeader("Access-Control-Allow-Origin", "*");
  • 1
  • 只允许来自特定域 http://my.domain.cn:8080 的跨域访问
response.setHeader("Access-Control-Allow-Origin", "http://my.domain.cn:8080");
  • 1
  • 较灵活的设置方式,允许所有包含 mydomain.com 的域名访问.
if(request.getHeader("Origin").contains("mydomain.com")) {
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
}
  • 1
  • 2
  • 3

2. 带Cookie的跨域Ajax请求

客户端

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

通过设置 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");
...
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 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:

<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 冲突。

最新文章

  1. Paxos变种和优化
  2. 160809212田京诚C语言程序设计实验2 选择结构程序设计_进阶
  3. 深入理解Java内存模型(一)——基础(转)
  4. Silverlight打印注意事项
  5. 日志基本概念/rSyslog
  6. ios8 ios7 tableview cell 分割线左对齐
  7. Dev gridControl 按回车增加一行
  8. ip 子网掩码 网关 DNS
  9. ie6+7+8等对background-color:rgba(),background-img渐变的兼容
  10. UWSGITOP-----监控uwsgi 性能
  11. JavaScript 基本类型值-String类型
  12. 201521123056 《Java程序设计》第11周学习总结
  13. Vue SSR: 基本用法 (二)
  14. 使用git将本地项目推送到码云私有仓库
  15. NFS服务与crond服务
  16. Java的基本数据类型大小及其包装类
  17. EF 性能调优
  18. python动态函数hasattr,getattr,setattr,delattr
  19. SQL查询出某字段不等于某值的行(其中有为NULL的字段)
  20. easyui更换主题之后出现validatebox的验证提示信息显示跑偏的解决方案

热门文章

  1. 好用的打包工具webpack
  2. docker概述与安装及运行容器
  3. Java工作流引擎 Activiti springmvc 后台框架源码 SSM 流程审批
  4. 图片查看器(类似于QQ,另外又加了JARA的下方的图片缩略导航图)
  5. 试试监听输入框的值 (eq:在未输入前,按钮为灰色,输入内容后,按钮变蓝色)
  6. js与html中unicode编码的使用
  7. python 环境变量的配置
  8. 77th ploty 制图神器
  9. jquery submit事件
  10. Scrapy爬虫框架的使用