0.前言

  CORS(Cross-Origin Resource Sharing)是一个用于处理跨域问题的W3C标准,本文将介绍什么是跨域,引起跨域的同源策略,什么是CORS,CORS的工作过程,请求方式以及与它有关的header,最后是java使用例子代码。

1.什么是跨域?

  浏览器从一个域名的网页请求另一个域名的资源时,域名,端口,协议任意一个不同都是跨域请求。(需要注意域名和域名对应的ip也属于跨域)

  

 2.什么是同源策略?

  在Web浏览器中,允许某个网页脚本访问另一个网页的数据,但前提是这两个网页必须有相同的协议,主机名和端口号,一旦两个网站满足上述条件,这两个网站被认为同源。此策略可防止某个网页上的恶意脚本通过该网页的文档对象模型访问另一个网页上的敏感数据,但是仅适用于脚本,不适用于HTML标签。

3.什么是CORS?

  CORS是一种基于HTTP 头的机制,该机制通过允许服务器标示除了它自己以外的其它origin(域,协议和端口),允许第一个资源所在的域之外的另一个域请求web页面上的受限资源。尤其是Ajax请求,在默认情况下是被同源安全策略禁止的。CORS定义了一种浏览器和服务器可以交互的方式,以确定允许跨源请求是否安全。它比纯粹的同源请求允许更多的自由和功能,但比简单的允许所有跨源请求更安全。整个CORS通信过程,都是浏览器自动完成的,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加头信息,有时会多一次请求,但用户不会有感觉,因此实现CORS通信的关键在服务器,只要服务器实现了CORS接口,就可以进行跨源通信。

4.CORS的工作过程

  对于可以修改数据的Ajax和HTTP请求方法(通常为GET以外的HTTP方法或者用于某些MIME类型的POST使用),规范要求浏览器预先发送请求,使用HTTP OPTIONS请求方法从服务器请求支持的方法,在得到服务器的“批准”后,使用实际的HTTP请求方法发送实际请求。服务器还可以通知客户端“凭据”(包括Cookies和HTTP身份验证数据)是否应随请求一起发送。

  

 5.CORS请求

  CORS请求分为简单请求和预检请求,上图中发送的真实请求为简单请求,发送真实请求前需进行的OPTIONS请求为复杂请求。

  ①简单请求

  概念:当请求方式为HEAD,GET或POST并且HTTP头信息仅包含Accept,Accept-Language,Content-Language,Last-Event-ID,Content-Type,其中Content-Type仅限三个值,包括application-x-www-form-urlencoded,multipart/form-data,text-plain。(这样设计是为了兼容form表单,因为表单一直可以发送跨域请求。)

  例子:加入用户访问http://www.example.com,并且向要跨域获取http://service.example.com的用户信息。与CORS兼容的浏览器将尝试向service.example.com进行跨域请求,具体如下:

//浏览器添加一个额外的Origin头,值为为父页面提供服务的域,并发送GET请求
Origin: http://www.example.com
//在service.example.com域的服务将返回带Access-Control-Allow-Origin头,其值表示允许访问的域或者返回错误页面,表示服务器不准跨域请求。
Access-Control-Allow-Origin: http://www.example.com
Access-Control-Allow-Origin: * //通配符表示允许所有

[注:“*”的值很特殊,因为它不允许请求提供凭据,这意味着它不允许在跨域请求中发送HTTP身份验证,客户端SSL证书或Cookie。在CORS体系结构中,Access-Control-Allow-Origin头是由外部web服务设置的(service.example.com),而不是原始的web应用服务(www.example.com)设置的]

  ②预检请求

  概念:除了上面简单请求的情况外都要先进行预检请求,通过后再发送真实请求。

  例子:

//www.example.com域上的服务发出OPTIONS预检请求
OPTIONS /
Host: service.example.com
Origin: http://www.example.com
//如果service.example.com接受该操作,则响应如下:
Access-Control-Allow-Origin: http://www.example.com
Access-Control-Allow-Methods: PUT, DELETE
//之后www.example.com将发送真实请求,若不接受,将会对OPTIONS请求响应错误。

6.与CORS有关的头

  ①请求头

  Origin

  说明:该字段必须,指示了请求来自于哪个站点。该字段仅指示服务器名称,并不包含任何路径信息

  语法:Origin: ""

     Origin: <scheme> "://" <host> [ ":" <port> ]

  示例:Origin: http://www.example.com

  Access-Control-Request-Method

  说明:该字段必须,用于预检请求告诉服务器哪些HTTP方法在实际请求是将被使用

  语法:Access-Control-Request-Method: <method>

  示例:Access-Control-Request-Method: POST

  Access-Control-Request-Headers

  说明:用于预检请求告诉服务器在真正的请求中会采用哪些头

  语法:Access-Control-Request-Headers: <header-name>, <header-name>, ...

  示例:Access-Control-Request-Headers: X-PINGOTHER, Content-Type

  ②响应头

  Access-Control-Allow-Origin

  说明:该字段必须,用于指定该响应是否被允许与给定的域共享

  语法:Access-Control-Allow-Origin: *

       Access-Control-Allow-Origin: <origin>

  示例:Access-Control-Allow-Origin:* --表示允许所有资源访问

     Access-Control-Allow-Origin:http://www.example.com --表示允许http://www.example.com访问

  Access-Control-Allow-Credentials 

  说明:该字段可选。值为布尔值,表示是否允许发送Cookie,默认情况下,Cookie不包括在CORS请求之中。

  语法:Access-Control-Allow-Credentials:true

  Access-Control-Expose-Headers

  说明:该字段可选,用于列出哪些头部可以作为响应的一部分暴露给外部。默认情况下有七种简单响应头部可以暴露给外部,包括:Cache-Control,Content-Language,Content-Length,Content-Type,Expires,Last-Modified,Pragma,Access-Control-Max-Age,Access-Control-Allow-Methods,Access-Control-Allow-Headers

  语法:Access-Control-Expose-Headers: <header-name>, <header-name>, ...

  示例:Access-Control-Expose-Headers: Content-Length

  Access-Control-Max-Age

  说明:该字段可选,表示预检请求的返回结果(即Access-Control-Allow-Method和Access-Control-Allow-Headers提供的信息)可以被缓存多久,即多久可以不用发送预检请求,若为-1则禁用,表示每次都请求都必须发送预检请求。

  语法:Access-Control-Max-Age: <delta-seconds>

  示例:Access-Control-Max-Age: 600

  Access-Control-Allow-Methods

  说明:该字段必须,在对预检请求的应答中明确了客户端所要访问的资源允许使用的方法或方法列表。

  语法:Access-Control-Allow-Methods: <method>, <method>, ...

  示例:Access-Control-Allow-Methods: POST, GET, OPTIONS

  Access-Control-Allow-Headers 

  说明:如果请求包括Access-Control-Request-Headers字段,则该字段必须,表明服务器支持的所有header,不限于预检中请求发送的字段还可能有自定义的。

  语法:Access-Control-Allow-Headers: <header-name>[, <header-name>]*

     Access-Control-Allow-Headers: *

  示例:Access-Control-Allow-Headers: X-Custom-Header, Upgrade-Insecure-Requests

7.java操作

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
// 这里填写你允许进行跨域的主机ip
httpServletResponse.setHeader("Access-Control-Allow-Origin", "*");
     // 服务器允许的header
     httpServletResponse.setHeader("Access-Control-Allow-Headers",
"origin, content-type, accept, authorization");
// 允许的访问方法
httpServletResponse.setHeader("Access-Control-Allow-Methods",
"POST, GET, PUT, OPTIONS, DELETE, PATCH");
// Access-Control-Max-Age 用于 CORS 相关配置的缓存
httpServletResponse.setHeader("Access-Control-Max-Age", "1209600");
     // 是否允许发送cookie
httpServletResponse.setHeader("Access-Control-Allow-Credentials", "true");
HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
if (null != httpRequest && "OPTIONS".equalsIgnoreCase(httpRequest.getMethod())) {
return;
} filterChain.doFilter(servletRequest, httpServletResponse);
}

CORS(跨域资源共享)笔记的更多相关文章

  1. django上课笔记7-jQuery Ajax 和 原生Ajax-伪造的Ajax-三种Ajax上传文件方法-JSONP和CORS跨域资源共享

    一.jQuery Ajax 和 原生Ajax from django.conf.urls import url from django.contrib import admin from app01 ...

  2. CORS跨域资源共享

    CORS(跨域资源共享)跨域问题及解决 当使用ajax跨域请求时,浏览器报错:XmlHttpRequest error: Origin null is not allowed by Access-Co ...

  3. CORS跨域资源共享你该知道的事儿

    "唠嗑之前,一些客套话" CORS跨域资源共享,这个话题大家一定不陌生了,吃久了大转转公众号的深度技术好文,也该吃点儿小米粥溜溜胃里的缝儿了,今天咱们就再好好屡屡CORS跨域资源共 ...

  4. 在ASP.NET Web API中实现CORS(跨域资源共享)

    默认情况下,是不允许网页从不同的域访问服务器资源的,访问遵循"同源"策略的原则. 会遇到如下的报错: XMLHttpRequest cannot load http://local ...

  5. 跨域漏洞丨JSONP和CORS跨域资源共享

    进入正文之前,我们先来解决个小问题,什么是跨域? 跨域:指的是浏览器不能执行其它网站的脚本,它是由浏览器的同源策略造成的,是浏览器的安全限制! 跨域常见的两种方式,分别是JSONP和CORS. 今天i ...

  6. 浅谈跨域问题,CORS跨域资源共享

    1,何为跨域? 在理解跨域问题之前,你先要了解同源策略和URL,简单叙述: 1)同源策略 三同:协议相同,域名相同,端口相同: 目的:保证用户信息安全,防止恶意网站窃取数据.同源策略是必须的,否则co ...

  7. Node.js实现CORS跨域资源共享

    什么是CORS CORS(Cross-origin resource sharing),跨域资源共享,是一份浏览器技术的规范,用来避开浏览器的同源策略 简单来说就是解决跨域问题的除了jsonp外的另一 ...

  8. tomcat7.0配置CORS(跨域资源共享)

    平时我们做前台页面时可能会遇到浏览器以下提示(浏览器控制台): 已阻止跨源请求:同源策略禁止读取位于 http://xxx.xxx.com 的远程资源.(原因:CORS 头缺少 'Access-Con ...

  9. CORS(跨域资源共享)详解及与JSONP的对比

    上篇讲解的JSONP的跨域请求方式,但是在浏览器的支持及请求方式上有局限性,接下来将介绍一种新的跨域请求方式CORS. CORS是一个W3C标准,全称是"跨域资源共享"(Cross ...

  10. CORS跨域资源共享简述

    什么是CORS? 默认情况下,为预防某些而已行为,浏览器的XHR对象只能访问来源于同一个域中的资源.但是我们在日常实际开发中,常常会遇到跨域请求的需求,因此就出现了一种跨域请求的方案:CORS(Cro ...

随机推荐

  1. selenium截图功能

    selenium自动化测试完后需要查看值观的结果,或者查操作过程中是否正确,此时需要使用自带的截图功能. 示例1: from time import sleep from selenium impor ...

  2. Linux 学习笔记03丨Linux文件系统、文件基本属性、目录处理及文件查看

    Chapter 2. 文件系统 2.1 Linux 系统目录结构 命令窗口下输入命令: $ ls /,能够看到根目录下的全部目录及文件 树状目录结构为: 最顶级的目录: / :根目录 / 是根目录,~ ...

  3. 阿里云云开发平台助力风变科技Serverless架构升级实战

    阿里云云开发平台助力风变科技Serverless架构升级实战 背景 风变科技 一个希望通过技术去推动下一代基础教育的组织.旗下产品包括第一代的熊猫书院(读书类产品).第二代的熊猫小课(泛学科综合学习平 ...

  4. CentOS下的IPMI尝试

    1.载入支持 ipmi 功能的系统模块 modprobe ipmi_msghandler modprobe ipmi_devintf modprobe ipmi_poweroff modprobe i ...

  5. 我与PHP,ULM和Vue.js不得不说的故事(一个放荡不羁与一个神神秘秘一个似曾相识,从入门到放弃记录第二章)

    ·关于UML(git) 究竟是命运在茫茫语言之中遇到了你,还是我的魅力让你向我奔涌而来.好吧都不是,我俩就像古代包办婚姻,被专业牢牢的绑在一起了,既然都是一条绳上的蚂蚱.我我们应该能体谅彼此的不容易, ...

  6. Django----初始化项目结构

    1.初始化项目结构图 │ .gitignore # 提交git仓库时,不提交的文件必须要在这里进行标注 │ README.en.md # 英文(项目介绍) │ README.md # 中文项目简介 │ ...

  7. Spring Boot 2 集成 Swagger

    本文测试代码使用 Spring Boot 2.1.6.RELEASE + Swagger 2.9.2 添加依赖 <dependency> <groupId>io.springf ...

  8. 记一次MySQL出现Waiting for table metadata lock的原因、排查过程与解决方法

    任务背景:将sql文件通过shell直接导入到mysql中执行(还原) bug表现:导入后java项目卡死 过程: 1.网上乱搜一通,无意间看到一篇文章,这篇文章说明了如何开启mysql的genera ...

  9. 关于老猿Python系列文章发布网址变化的说明

    老猿Python系列文章最开始在新浪发布,后逐渐开通了CSDN.博客园和简书三个网址,但老猿一来工作忙,二来Python需要学习的内容太多,因此实在没时间同时维护这么多博客,事实上除了CSDN其他网站 ...

  10. moviepy音视频剪辑:使用rotate函数实现视频变换处理以及参数expand取值为True时的花屏问题解决方案

    ☞ ░ 前往老猿Python博文目录 ░ 一.rotate函数功能介绍 moviepy的rotate函数用于将剪辑逆时针旋转指定的角度或弧度. 调用语法:rotate(clip, angle, uni ...