CORS(跨域资源共享)笔记

0.前言

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

1.什么是跨域?

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

CORS(跨域资源共享)笔记

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身份验证数据)是否应随请求一起发送。

CORS(跨域资源共享)笔记

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:

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

Access-Control-Request-Method

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

语法:Access-Control-Request-Method:

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

Access-Control-Request-Headers

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

语法:Access-Control-Request-Headers:

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

②响应头

Access-Control-Allow-Origin

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

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

Access-Control-Allow-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:

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

Access-Control-Max-Age

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

语法:Access-Control-Max-Age:

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

Access-Control-Allow-Methods

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

语法:Access-Control-Allow-Methods:

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

Access-Control-Allow-Headers

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

语法:Access-Control-Allow-Headers:

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);
    }

Original: https://www.cnblogs.com/lin0/p/14138451.html
Author: Carol淋
Title: CORS(跨域资源共享)笔记

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/593663/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • LocalDateTime查找最近的五分钟点

    /** * 最近的五分钟 * @param dateTime * @return */ public static LocalDateTime getNear5(LocalDate…

    Java 2023年6月8日
    053
  • Spring Boot:快速入门教程

    什么是Spring Boot? Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进…

    Java 2023年5月30日
    078
  • Spring:代理Filter:DelegatingFilterProxy原理和作用

    DelegatingFilterProxy就是一个对于servlet filter的代理,用这个类的好处主要是通过Spring容器来管理servlet filter的生命周期, 还…

    Java 2023年5月30日
    076
  • HTTP协议

    HTTP协议是无状态的协议:对于事务的处理没有记忆能力。每次请求-响应都是独立的。 缺点:多次请求间不能共享数据—–会使用会话技术来进行解决 优点:速度快 …

    Java 2023年6月5日
    080
  • 理解oauth2.0【转载】

    原文出处: http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html OAuth是一个关于授权(authorization)的开放…

    Java 2023年6月16日
    072
  • Java类的主动使用和被动使用-面试题

    所有的java虚拟机实现必须在每个类或接口被java程序”首次主动使用”时才初始化他们 被动使用不会初始化类,但是有可能会加载类(JVM规范里没有说明)并且…

    Java 2023年5月29日
    0105
  • 如何导入数据库驱动包及连接

    在我们运行代码时,出现ClassNotFountException:com.mysql.jdbc.Driver,说明我们没有导入数据库驱动jar包,或者导错包了 导入数据库驱动: …

    Java 2023年6月8日
    0124
  • JeeSite Spring Cloud安装搭建

    引言 JeeSite Cloud 具备 JeeSite 4.x 的所有功能,是在 JeeSite 4.x 基础之上,完成的 Spring Cloud 分布式系统套件的整合。它利用 …

    Java 2023年6月5日
    098
  • AOP

    AOP AOP的入门案例: AOP的工作流程 SpringAop的本质是:代理模式 AOP的切入点表达式 重用切入点表达式: ①声明 @Pointcut(“execut…

    Java 2023年6月16日
    060
  • mysql

    一:什么情况下设置了索引但无法使用1.以%开头的like语句,模糊匹配2.or语句前后没有同时使用索引3.数据类型出现隐式转化 二:优化数据库的方法1.选取最适用的字段属性2.使用…

    Java 2023年6月5日
    0104
  • Jedis案例

    案例: 案例需求: 提供index.html页面,页面中有一个省份 下拉列表 当页面加载完成后 发送ajax请求,加载所有省份 代码实现: ProvinceDao package …

    Java 2023年6月6日
    066
  • Jquery $(this).attr和$(this).val用法示例

    以下是个人心得整理,有兴趣朋友可以参考参考 $(this).attr(key); 获取节点属性名为key的值,相当于getAttribute(key)方法 $(this).attr…

    Java 2023年6月5日
    083
  • 空对象要不得——记一次修改魔兽世界宏的感慨

    昨天群里有个盗贼发了个宏 乍一看这个条件判断语句写的好像没有问题,语句的判断条件是: 1.当存在焦点,且按键模式为alt时,选取该焦点单位为目标释放致盲。 2.对鼠标指向的单位释放…

    Java 2023年6月9日
    082
  • java mybatis 分页查询

    Page page = new Page(pageIndex + 1, pageSize); Page pagedData = signLogService.page(page,n…

    Java 2023年5月29日
    086
  • 双缓冲绘图

    双缓冲绘图 大家小时候都玩过飞机大战吧,当我们在玩这种飞行射击类游戏时,背景图总是不断地向下移动的,从而给我们营造出一种飞机正在向前飞行的游戏体验。那么,图片的快速变化是如何实现的…

    Java 2023年6月5日
    073
  • SpringCloud–feign的配置加载

    spring cloud feign我们使用 @FeignClient注解,其中有几个核心属性: java;gutter:true; @AliasFor("name&qu…

    Java 2023年6月7日
    0109
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球