Spring Boot 入门之路(8)--- 解决 Spring Boot 中的跨域问题

SpringBoot 解决跨域问题的 5 种方案! 跨域问题的本质是浏览器为了保证用户的一种安全拦截机制,想要解决跨域问题,只需要告诉浏览器“我是自己人,不要拦我”就行。它的常见实现方式有 5 种:通过注解实现局部跨域、通过配置文件实现全局跨域、通过 CorsFilter 对象实现全局跨域、通过 Response 对象实现局部跨域,通过 ResponseBodyAdvice 实现全局跨域。 阅读详情

在谈 Spring Boot 中的跨域问题之前,我想我们有必要先了解下同源策略

1 同源策略

不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源。该策略是浏览器安全的基石。

也许大家很疑惑,何为’'源“?何为“同源”?其实,源可以理解为协议,域名和端口号的组合,而同源指的是地址中的协议,域名和端口号均相同。

由于浏览器同源策略的影响,不是同源的脚本是不能操作其他源下面的对象的,非同源的网站之间不能发送 AJAX 请求。想要操作另一个源下的对象就需要跨域,其中跨域可以分为 JSONP 跨域和 CORS 跨域。

2 JSONP 跨域和 CORS 跨域

CORS,即 Cross-Origin Resource Sharing,中文意思为跨域资源共享。它定义了在跨域访问资源时浏览器和服务器之间如何进行通信。

CROS 是现在主流解决跨域问题的方案,它与 JSONP 之间的区别如下:

  1. JSONP 只能实现 GET 请求,而 CORS 支持所有类型的HTTP请求。
  2. 使用 CORS,开发者可以使用普通的 XMLHttpRequest 发起请求和获得数据,比起 JSONP 有更好的错误处理。
  3. JSONP 主要被老的浏览器支持,它们往往不支持 CORS ,而绝大多数现代浏览器都已经支持了 CORS。

总的来说,CORS 与 JSONP 相比,更为先进,方便和可靠。

3 CORS 跨域简介

CORS 将请求分为两类:简单请求和非简单请求。

简单请求

下面是一个简单的例子:

GET /test HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate, sdch, br
Origin: http://www.examples.com
Host: www.examples.com

对于简单请求,CORS 的策略是请求时在请求头中增加一个 Origin 字段,服务器收到请求后,根据该字段判断是否允许该请求访问。若允许,则在 HTTP 头信息中添加 Access-Control-Allow-Origin 字段,并返回正确的结果,否则不会在 HTTP 头信息中添加 Access-Control-Allow-Origin 字段。

非简单请求

对于非简单请求的跨源请求,浏览器会在真实请求发出前,增加一次 OPTION 请求,称为预检请求。预检请求将真实请求的信息,包括请求方法、自定义头字段、源信息添加到 HTTP 头信息字段中,询问服务器是否允许这样的操作。例子如下:

OPTIONS /test HTTP/1.1
Origin: http://www.examples.com
Access-Control-Request-Method: DELETE
Access-Control-Request-Headers: X-Custom-Header
Host: www.examples.com

服务器收到请求时,需要分别对 Origin、Access-Control-Request-Method(请求使用的 HTTP 方法)、Access-Control-Request-Headers(请求中包含的自定义头字段) 进行验证,验证通过后,会在返回 HTTP头信息中添加 :

Access-Control-Allow-Origin: http://www.examples.com
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: X-Custom-Header
Access-Control-Allow-Credentials: true
Access-Control-Max-Age: 1728000

其含义为:

  1. Access-Control-Allow-Methods: 真实请求允许的方法
  2. Access-Control-Allow-Headers: 服务器允许使用的字段
  3. Access-Control-Allow-Credentials: 是否允许用户发送、处理 cookie
  4. Access-Control-Max-Age: 预检请求的有效期,单位为秒。有效期内,不会重复发送预检请求

当预检请求通过后,浏览器会发送真实请求到服务器。这就实现了跨源请求。

4 模拟跨域请求

我们先不使用 CORS,看看接下来会发生什么?

我们建立两个 Spring Boot ,分别命名为 test 和 demo。

test 项目的控制器:

package edu.szu.test.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class IndexController {

	@RequestMapping("index")
    public String index(){
        return "index" ;
	}
}

application.properties:

# 页面默认前缀目录
spring.mvc.view.prefix=/WEB-INF/jsp/
# 响应页面默认后缀
spring.mvc.view.suffix=.jsp
# 指定端口
server.port=8080

test/src/main/webapp/WEB-INF/jsp/index.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
Hello 8080!
</body>
</html>

demo 项目的控制器:

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class IndexController {

	@RequestMapping("/index")
    public String index(){
        return "index" ;
	}
}

application.properties:

# 页面默认前缀目录
spring.mvc.view.prefix=/WEB-INF/jsp/
# 响应页面默认后缀
spring.mvc.view.suffix=.jsp
# 指定端口
server.port=8087

demo/src/main/webapp/WEB-INF/jsp/index.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>
Hello 8087!
<input type="button" value="commit" onclick="test()"/>
</body>
<script type="text/javascript">
    function test(){
        $.ajax({
            url:'http://localhost:8080/index',
            type:'post',
            dataType:'text',
            success:function(data){
                console.log(data);
            }
        });
    }
</script>
</html>

运行 test 和 demo 两个项目的启动类,在浏览器中输入 http://localhost:8087/index,发现页面一直无法跳转。打开控制台,发现如下报错。

在这里插入图片描述
翻译一下,由于在请求的资源上没有 Access-Control-Allow-Origin 的头部 header,8087这个域没有访问权限,XMLHttpRequest 不能加载8080端口的数据。

5 Spring Boot 配置 CORS 的方法

通过 @CrossOrigin 实现

在方法或类上添加 @CrossOrigin 注解,可以直接配置 CORS。

@Controller
public class IndexController {

	@RequestMapping("index")
	@CrossOrigin("http://localhost:8087")
    public String index(){
        return "index" ;
	}
}
配置过滤器
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {

    @Bean
    public CorsFilter corsFilter() {
        final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
        final CorsConfiguration corsConfiguration = new CorsConfiguration();
        //是否允许请求带有验证信息
        corsConfiguration.setAllowCredentials(true);
        //允许访问的客户端域名
        corsConfiguration.addAllowedOrigin("*");
        //允许服务端访问的客户端请求头
        corsConfiguration.addAllowedHeader("*");
        //允许访问的方法名,GET POST等
        corsConfiguration.addAllowedMethod("*");
        urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
        return new CorsFilter(urlBasedCorsConfigurationSource);
    }
}

该方式针对全局配置有效。

配置拦截器
@Configuration
public class MyConfiguration implements WebMvcConfigurer  {

    @Override  
    public void addCorsMappings(CorsRegistry registry) {  
        registry.addMapping("/**")  
                .allowCredentials(true)  
                .allowedHeaders("*")  
                .allowedOrigins("*")  
                .allowedMethods("*");  

    }  
}

该方式针对全局配置有效。

参考:SpringBoot配置Cors解决跨域请求问题
CORS解决ajax跨域问题
Spring Boot 2.0 解决跨域问题 SpringBoot2.X
(十三) : SpringBoot设置支持跨域请求

Springboot +spring security,解决跨域问题 阅读详情

相关推荐

spring boot项目实战:跨域问题解决

背景前后端分离架构,前端anglerjs,后端spring boot,使用shiro作为权限控制,已配置通用跨域请求支持。 前端调用接口时部分情况正常,部分情况出现跨域请求不支持情况,错误信息如下:Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' hea

思与学的博客 2595

Springboot解决跨域

这种方式和@CrossOrigin方式要配置的属性基本一样,大致原理也类似,都是在DispatcherServlet中触发跨域处理,配置了一个CorsConfiguration对象,然后用该对象创建CorsInterceptor拦截器,然后在拦截器中调用DefaultCorsProcessor#processRequest方法,完成对跨域请求的校验。origins:允许的域,* 表示所有,一般可以指定具体的域, allowedHeaders:允许的请求头字段,* 表示所有。

努力变优秀的博客 244

Spring Boot跨域问题8种解决方案终极指南:从注解到网关的全面解析

本文总结了解决跨域问题的8种方案,涵盖局部、全局、动态和网关层等多种场景。局部方案通过@CrossOrigin注解实现精细控制,全局方案采用WebMvcConfigurer或CorsFilter统一配置。动态方案可根据请求参数调整跨域策略,网关层则通过Spring Cloud Gateway或Nginx实现集中化管理。所有方案均支持跨域调用、优化预检请求缓存时间至2小时,并增强安全性,精准控制允许的域名和凭证。适用于不同规模项目,从小型应用到微服务架构均可灵活选择。

墨夶的博客 1702

SpringBoot解决跨域问题

目录: 什么是跨域、为什么会跨域 解决方案 springboot处理跨域方案 全局配置:继承接口,重写addCorsMappings方法 通过给方法或者类加注解的形式,使用注解@CrossOrigin 自定义跨域过滤器 使用nginx反向代理服务器解决跨域问题(如果前后端分离,建议此种方案) 一.什么是跨域 何谓同源:URL由协议、域名、端口和路径组成,如果两个URL的协议、域名和端口相同,则表示它们同源。浏览器的同源策略,从一个域上加载的脚本不允许访问另外一个域的文档属性..

yiguang_820的博客 1244

采用MPU6050的手势遥控器

随着社会的发展与进步,电子产品日益更新,个人家庭迎来了越来越多的智能家电。然而,现在的智能电子设备产品的遥控器多数都是按键形的。操作繁琐不直观,学习成本大。并且对于有老人小孩的家庭,给他们的操作带来了巨大的障碍。手势遥控器是指利用简单的手势来指挥电子设备,获得便捷的操作体验。让家庭成员都可以享受科技发展带来的福利。MPU6050是一个运动传感器,内置陀螺仪,再由电子设备利用判断结果做出相应的响应即...

Sakura的博客小站 6602

华为设备有关用户名密码的策略配置

命令用来开启对密码进行复杂度检查功能,设备默认已经是开启状态。1、密码长度大于等于12位,含数字大小写字母和特殊符号。2、设置密码更换周期为90天。取值范围8-16,默认长度为8位。登录失败后锁定时间大于15分钟。3、登录失败次数小于5次。4、登录超时30分钟以内。

简单的创作,希望可以帮助到跟我一样的学习者! 7839

在 SpringBoot 中设置允许跨域请求

一、前言 现在在团队做的项目(网站)都是前后端分离的 ① 后台负责写接口、传递JSON,如下面一个 POST 请求(后台设置允许跨域请求后,DELETE、GET、PUT 也是可以的) 这是我最近写的众酬网项目,新增众酬项目,的接口 ② 前台负责解析JSON、设计界面 要实现接口可以给前端访问,还要设置允许跨域访问接口 参考文章 SpringBoot下如何配置实现跨域请求...

IT小村 3万+

从AI画稿到3D虚拟时装:Illustrator与Substance 3D的服装设计工作流

本文旨在解决传统服装与纺织品设计师在产品开发流程中,面临的“2D印花图案无法直观预见3D上身效果”、“物理打样成本高昂且周期漫长”的核心痛点。我们将介绍一套纯数字化的3D可视化工作流,核心是利用 Adobe Illustrator 进行矢量印花图案创作,通过 Adobe Substance 3D Sampler 将其转化为逼真的PBR(基于物理渲染)布料材质,并最终在 Adobe Substance 3D Stager 中,将该材质应用于3D服装模型,渲染出照片级的虚拟样衣。本指南将帮助设计师以极低的成本和

Kingsdesigner的博客 1394

SpringBoot 中实现跨域的5种方式

一、为什么会出现跨域问题 出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。 同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port) 二、什么是跨域 当一个请求url的协议、域

Pastxu的小屋 1609

QGis软件 —— 5、QGis增加线,并对线进行绘制、旋转、缩放、移动等基本操作

QGis软件 —— 5、QGis增加线,并对线进行绘制、旋转、缩放、移动等基本操作

8239

Nvidia Orin Driveos Camera 介绍及调试详解

自动驾驶-nvidia orin driveos Camera 驱动详解及调试

u011803281的博客 2991

配置SpringBoot项目允许跨域访问

只需两步: 第一步,添加配置类: import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors.CorsConfiguration; import org.s...

谢小鱼的博客 4843

Oracle 11g安装教程(保姆级超详细安装教程)

Oracle详细安装步骤,每一步都配有图例引导 ORACLE是数据库(Oracle服务端)。是连接数据库的客户端(Oracle客户端)。是连接oracle的可视化客户端软件。

2302_81846649的博客 1万+

Spring Boot 系列:处理跨域请求

一、何为跨域 前端请求于后端处理符合三个要求(同一域名,同一端口,同一协议)下,即可访问,有一个不符合就会出现跨域问题。 1.1 一次正常的请求 Controller层代码: @RequestMapping(&amp;amp;quot;/demo&amp;amp;quot;) @RestController public class CorsTestController { @GetMapping(&amp;amp;quot;/sayHello&amp;amp;

风尘博客 7万+

SAP-ABAP:字符与数值类型转换详细指南

SAP-ABAP:字符与数值类型转换详细指南

baidu_35680696的博客 1472

国科大学习资料--高级软件工程-复习题简答题答案

国科大学习资料–高级软件工程(罗铁坚 魏峻 刘丹)-复习题简答题答案 def fib3 n (1…n).inject([0,1]){|mem| puts mem[0]+mem[1]; [mem[1],mem[0]+mem[1]]} end =====================================================================================================================================

无名何许人的博客 1396

Spring Boot项目中解决跨域问题(四种方式)

开发项目的时候因为浏览器同源策略的限制,经常会遇到跨域问题,本篇文章对常见的跨域解决方案做一个记录。

weixin_44924882的博客 1万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

8种SpringBoot跨域问题的解决方案!

跨域问题是浏览器为了保护用户的信息安全,实施了同源策略(Same-Origin Policy),即只允许页面请求同源(相同协议、域名和端口)的资源,当 JavaScript 发起的请求跨越了同源策略,即请求的目标与当前页面的域名、端口、协议不一致时,浏览器会阻止请求的发送或接收。

m0_69632475的博客 4631

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Spring Boot跨域问题解决

跨域问题本质上是浏览器的行为,它的初衷是为了保证用户的访问安全,防止被恶意网站窃取数据。因此解决跨域问题就只是需要告诉浏览器这是一个安全的请求就可以了,告诉浏览器“我是自己人”。缺点:只能实现局部跨域,当一个项目中存在多个类时,需要给所有类上都添加此注解,比较麻烦。启动服务,访问页面,点击登录按钮,接口访问成功。那怎么告诉浏览器这是一个安全的请求呢?,点击登录按钮,如下所示,出现跨域问题。通常跨域问题使用以下6个方法解决。启动服务,然后直接本地双击打开。实现方式同3.5,不再赘述。优点:实现跨域非常简单。

null 1802

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Spring boot前后端分离后,跨域问题怎么解决?

现在基于spring boot前后端分离的开发模式越来越普遍,那么,由于前后端分离引发的跨域问题,你知道怎么解决吗? 什么是跨域 跨域是指 不同域名之间相互访问。即浏览器控制当前网页下不能执行其他网站的脚本,这是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制。 也就是如果在A网站中,我们希望使用Ajax来获得B网站中的特定内容 如果A网站与B网站不在同一个域中,那么就出现了跨域访问问题。 跨域的安全限制都是对浏览器端来说的,服务器端是不存在跨域安全限制的。 同源策略 同源策略/S.

弹指天下 4512
上一篇: Spring Boot 入门之路(7)--- 单元测试与日志管理
下一篇: Spring Boot 入门之路(9)--- 全局异常处理方案
Geffin
博客等级 码龄8年 209粉丝 218原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值