12:CORS跨域设置-Java Spring

简介: 12:CORS跨域设置-Java Spring

12.1 CORS介绍

CORS跨域资源共享(Cross-origin resource sharing)是指在服务器端定义跨域请求规则,允许控制浏览器向跨域服务器发出请求,支持各种请求方式,解除了Ajax同源使用的限制


目前所有浏览器都支持CORS跨域设置,它突破了一个请求在浏览器发出只能在同源的情况下向服务器获取数据的限制,成为了主流的跨域解决方案

12.2 CORS原理

CORS通过额外的HTTP头部信息,浏览器将Ajax请求分为普通请求和特殊请求

普通请求

请求方法

  • GET
  • HEAD
  • POST(Content-Type只限于application/x-www-form-urlencodedmultipart/form-datatext/plain

HTTP的头信息

  • Accept
  • Accept-Language
  • Content-Language
  • DPR
  • Downlink
  • Save-Data
  • Viewport-Width
  • Width
  • Content-Type

特殊请求

请求方法

  • PUT
  • DELETE
  • TRACE
  • PATCH
  • POST(Content-Type值只限于application/json

HTTP的头信息

  • 自定义

12.3 CORS实现

SpringBoot设置CORS的的本质是通过设置浏览器响应头信息,浏览器使用OPTIONS方法发送预检请求,获知服务器是否允许该跨域请求,如果不允许发送带数据的真实请求,则会受到限制

普通请求

普通请求头中携带Origin字段,用于说明当前请求的协议、域名和端口,服务器根据这个值决定是否同意这次请求

  • Access-Control-Allow-Origin 服务端请求域设置
  • Access-Control-Allow-Credentials Cookie请求设置
  • Access-Control-Request-Headers 额外发送的请求头字段信息

XMLHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段,想拿到额外的字段必须在Headers头字段里指定

  • Cache-Control
  • Content-Language
  • Content-Type
  • Expires
  • Last-Modified
  • Pragma

1.浏览器正常请求

浏览器直接发出CORS请求,在头信息之中增加Origin、Access字段

GET /cors HTTP/1.1
Origin: http://www.xxx.com
Host: xxx.xxxx.com
Accept-Language: en-US  
Connection: keep-alive  
User-Agent: Mozilla/5.0...

2.服务端对请求的肯定回应

服务器收到请求以后,检查Origin、Access字段是否许可范围内,如果不在,服务器返回一个HTTP响应,如果在,服务器返回肯定响应

Access-Control-Allow-Origin: http://www.xxx.com
Access-Control-Allow-Methods: GET
Content-Type: text/html; charset=utf-8

特殊请求

特殊会在正式通信之前,增加一次HTTP预检请求(Preflight)

  • Access-Control-Allow-Origin 服务端请求域设置
  • Access-Control-Allow-Credentials Cookie请求设置
  • Access-Control-Request-Headers 额外发送的请求头字段信息
  • Access-Control-Max-Age 用来指定本次预检请求的有效期,单位为秒

1.浏览器预检请求

预检请求是指浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP动词和头信息字段。只有得到肯定答复,浏览器才会发出正式的HTTPRequest请求,否则就报错

OPTIONS /cors HTTP/1.1
Origin: http://www.xxx.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: Header
Host: xxx.xxxx.com      
Accept-Language: en-US
Connection: keep-alive
User-Agent: Mozilla/5.0...

2.服务端对预检请求的肯定响应

服务器收到预检请求以后,检查了Origin、Access头字段以后,确认允许跨域请求,做出响应

HTTP/1.1 200 OK
Date: 
Server: 
Access-Control-Allow-Origin: http://www.xxx.com
Access-Control-Allow-Methods: GET, POST, PUT  
Access-Control-Allow-Headers: Header
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Content-Length: 0
Keep-Alive: timeout=2, max=100
Connection: Keep-Alive
Content-Type: text/plain

3.浏览器正常请求

服务器通过了预检请求,以后每次浏览器正常的CORS请求和服务器的响应,都会有一个Origin、Access头信息字段

PUT /cors HTTP/1.1
Origin: http://www.xxx.com
Host: xxx.xxxx.com
Header: value  
Accept-Language: en-US  
Connection: keep-alive  
User-Agent: Mozilla/5.0...

4.服务器响应数据

Access-Control-Allow-Origin: http://www.xxx.com
Content-Type: text/html; charset=utf-8


目录
相关文章
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
103 2
|
9天前
|
Java Spring
Java Spring Boot监听事件和处理事件
通过上述步骤,我们可以在Java Spring Boot应用中实现事件的发布和监听。事件驱动模型可以帮助我们实现组件间的松耦合,提升系统的可维护性和可扩展性。无论是处理业务逻辑还是系统事件,Spring Boot的事件机制都提供了强大的支持和灵活性。希望本文能为您的开发工作提供实用的指导和帮助。
51 15
|
6天前
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
|
1月前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
67 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
2月前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
263 12
基于开源框架Spring AI Alibaba快速构建Java应用
|
3月前
|
Java 数据库连接 开发者
Spring 框架:Java 开发者的春天
【10月更文挑战第27天】Spring 框架由 Rod Johnson 在 2002 年创建,旨在解决 Java 企业级开发中的复杂性问题。它通过控制反转(IOC)和面向切面的编程(AOP)等核心机制,提供了轻量级的容器和丰富的功能,支持 Web 开发、数据访问等领域,显著提高了开发效率和应用的可维护性。Spring 拥有强大的社区支持和丰富的生态系统,是 Java 开发不可或缺的工具。
|
3月前
|
JSON Java Maven
实现Java Spring Boot FCM推送教程
本指南介绍了如何在Spring Boot项目中集成Firebase云消息服务(FCM),包括创建项目、添加依赖、配置服务账户密钥、编写推送服务类以及发送消息等步骤,帮助开发者快速实现推送通知功能。
149 2
|
2月前
|
Java 数据库连接 API
Spring 框架的介绍(Java EE 学习笔记02)
Spring是一个由Rod Johnson开发的轻量级Java SE/EE一站式开源框架,旨在解决Java EE应用中的多种问题。它采用非侵入式设计,通过IoC和AOP技术简化了Java应用的开发流程,降低了组件间的耦合度,支持事务管理和多种框架的无缝集成,极大提升了开发效率和代码质量。Spring 5引入了响应式编程等新特性,进一步增强了框架的功能性和灵活性。
61 0
|
2月前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
49 0
|
9天前
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
49 17