Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SpringBoot跨域配置

SpringBoot跨域配置

作者头像
小沐沐吖
发布于 2022-09-22 07:29:12
发布于 2022-09-22 07:29:12
1.3K00
代码可运行
举报
文章被收录于专栏:小沐沐吖小沐沐吖
运行总次数:0
代码可运行

SpringBoot跨域配置

什么是跨域

跨域:指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。

例如:a页面想获取b页面资源,如果a、b页面的协议、域名、端口、子域名不同,所进行的访问行动都是跨域的,而浏览器为了安全问题一般都限制了跨域访问,也就是不允许跨域请求资源。注意:跨域限制访问,其实是浏览器的限制。理解这一点很重要!!!

同源策略:是指协议,域名,端口都要相同,其中有一个不同都会产生跨域;

一、同源策略

  1. 同源,就是咱们域名、端口号、ip、采用的协议都相同,那么我们就是同源的
  2. 反之就是不同源的!!!
  3. 出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。
  4. 所以,用最简单的话来说,就是前端可以发请求给服务器,服务器也可以进行响应,只是因为浏览器会对请求头进行判断,所以要么前端设置请求头,要么后端设置请求头

不同源的应用场景:

  1. 本地文件,向远程服务器发送请求,可以发送,但是会出现跨域
  2. 本地服务器跑前端文件,服务器跑服务器程序,也会出现跨域问题

二、跨域问题

axios发起的POST请求

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Access to XMLHttpRequest at 'http://localhost:8080/login' from origin 'http://localhost:8081' 
has been blocked by CORS policy: No 'Access-Control-Allow-Origin' 
header is present on the requested resource.

// 在'http://localhost:8080/login'从原点'http://localhost:8081'已被CORS策略阻止:
// 请求的资源上不存在“Access Control Allow Origin”标头

POST http://localhost:8080/login net::ERR_FAILED 200

Uncaught (in promise) AxiosError 
{
    message: 'Network Error', 
    name: 'AxiosError', 
    code: 'ERR_NETWORK', 
    config: {}, 
    request: XMLHttpRequest,
    ......
}

三、后端解决CORS跨域

对于 CORS的跨域请求,主要有以下几种方式可供选择:

  1. 返回新的CorsFilter
  2. 重写WebMvcConfigurer
  3. 使用注解@CrossOrigin
  4. 手动设置响应头 (HttpServletResponse)
  5. 自定webfilter实现跨域

注意:

  • CorFilterWebMvConfigurer@CrossOrigin需要SpringMVC 4.2以上版本才支持,对应springBoot 1.3版本以上
  • 上面前两种方式属于全局 CORS 配置,后两种属于局部 CORS配置。
  • 如果使用了局部跨域是会覆盖全局跨域的规则,所以可以通过@CrossOrigin 注解来进行细粒度更高的跨域资源控制。
  • 其实无论哪种方案,最终目的都是修改响应头,向响应头中添加浏览器所要求的数据,进而实现跨域

所有解决跨域问题,不外乎就是解决浏览器拦截问题,要么前端设置请求头,要么后端设置请求头,无论谁设置请求头,浏览器只要放行即可

四、全局跨域

1、配置新的CorsFilter

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

/**
 * 全局跨域配置
 */
@Configuration
public class GlobalCorsConfig {

    @Bean
    public CorsFilter corsFilter(){
        //1. 添加 CORS配置信息
        CorsConfiguration config = new CorsConfiguration();
        //放行哪些原始域
        // springboot 2.4.0 之前使用这个 或直接指定放行的域名http://localhost:8081...
        // config.addAllowedOrigin("*"); 
        config.addAllowedOriginPattern("*"); // springboot 2.4.0 之后使用这个
        // 是否发送 Cookie
        config.setAllowCredentials(true);
        // 放行哪些请求方式
        config.addAllowedMethod("*");
        // 放行哪些原始请求头部信息
        config.addAllowedHeader("*");
        // 暴露哪些头部信息
        config.addExposedHeader("*");
        //2. 添加映射路径
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**",config);
        //3. 返回新的CorsFilter
        return new CorsFilter(source);
    }
}

2、重写WebMvcConfigurer

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.jetbrains.annotations.NotNull;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class GlobalCorsConfig implements WebMvcConfigurer{
    @Override
    public void addCorsMappings(@NotNull CorsRegistry registry) {
        registry.addMapping("/**")
                // 是否发送cookie
                .allowCredentials(true)
                // 放行哪些域名
                // springboot 2.4.0 之前使用这个 或直接指定放行的域名http://localhost:8081...
                // .allowedOrigins("*")
                .allowedOriginPatterns("*") // springboot 2.4.0 之后使用这个
                // 允许任何方法
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                // 允许任何请求头
                .allowedHeaders("*")
                .exposedHeaders("*")
                // 表明在3600秒内,不需要再发送预检验请求
                .maxAge(3600L)
        ;
    }
}

五、局部跨域

1、注解

在springboot2.x版本以后,点开注解源码可以看到credentials默认是关闭的,该值是一个布尔值,表示是否允许发送 Cookie 。默认情况下, Cookie 不包括在 CORS 请求之中,设置为 true,即表示服务器明确许可, Cookie 可以包含中跨域请求中,一起发送给服务器。这个值也只能设置为 true ,如果服务器不要浏览器发送 Cookie,删除该字段即可。 在1.x版本的springboot中,是以origins作为参数,而新版本则改为了originPatterns 在控制器(类上)上使用注解 @CrossOrigin:,表示该类的所有方法允许跨域

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RestController
@CrossOrigin(originPatterns = "*",allowCredentials = "true")
public class LoginController {
    ...
}

在方法上使用注解 @CrossOrigin:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@ApiOperation(value = "登录")
@PostMapping("login")
@CrossOrigin(originPatterns = "*",allowCredentials = "true")
public RespBean login(@RequestBody LoginVo loginVo, HttpServletRequest request){
    if (!CaptchaUtil.ver(loginVo.getCode(),request)){
        return RespBean.loginCode();
    }
    CaptchaUtil.clear(request);
    return loginService.login(loginVo.getUsername(), loginVo.getPassword());
}

2、手动设置响应头

控制器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@ApiOperation(value = "登录")
@PostMapping("login")
public RespBean login(HttpServletRequest request,HttpServletResponse response){
    // 调用cors工具类
    CorsUtilks.cors(request,response);
    ...
    return loginService.login(loginVo.getUsername(), loginVo.getPassword());
}

Cors工具类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 手动设置响应头
 */
public class CorsUtilks {
    public static void cors(HttpServletRequest request, HttpServletResponse response){
        response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin")); // 设置允许所有跨域访问
        response.setHeader("Access-Control-Allow-Methods", "POST,GET,PUT,OPTIONS,DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "Origin,X-Requested-With,Content-Type,Accept,Authorization,token");
        response.setHeader("Access-Control-Allow-Credentials", "true");
    }
}

六、自定义filter

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 自定义filter实现跨域
 */
@Component
public class CorsFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin")); // 设置允许所有跨域访问
        response.setHeader("Access-Control-Allow-Methods", "POST,GET,PUT,OPTIONS,DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "Origin,X-Requested-With,Content-Type,Accept,Authorization,token");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void init(FilterConfig filterConfig){}

    @Override
    public void destroy() {}
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022 年 08 月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SpringBoot 中实现跨域的5种方式
出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。2021Java面试宝典
程序员白楠楠
2021/02/19
4.2K0
Spring Boot 实现跨域的 5 种方式,总有一种适合你,建议收藏!!
点击关注公众号,Java干货及时送达 一、为什么会出现跨域问题 出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。 同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port) 二、什么是
Java技术栈
2022/07/26
5.2K0
Spring Boot 实现跨域的 5 种方式,总有一种适合你,建议收藏!!
再一次折腾跨域问题
跨域问题在前后端分离的开发场景中经常遇到,回想起来自己也已经折腾了数次,本篇文章主要对跨域问题做个记录和总结。
云原生
2022/03/30
4960
SpringBoot如何解决跨域问题?
跨域问题是Web开发中常见的问题之一,特别是在前后端分离的项目中。Spring Boot作为一个流行的Java后端框架,提供了多种方式来解决跨域问题。本文将深入探讨Spring Boot如何解决跨域问题,包括原理分析、代码实现和示例展示。
程序猿川子
2024/11/25
4370
SpringBoot如何解决跨域问题?
怎么解决跨域
存在浏览器同源策略,所以才会有跨域问题。那么浏览器是出于何种原因会有跨域的限制呢。其实不难想到,跨域限制主要的目的就是为了用户的上网安全。
程序员子龙
2024/04/30
2310
SpringBoot跨域配置「建议收藏」
简单而言,跨域请求就是当一台服务器资源从另一台服务器(不同 的域名或者端口)请求一个资源或者接口,就会发起一个跨域 HTTP 请求。举个简单的例子,从http://www.baidu.com,发送一个 Ajax 请求,请求地址是 http://www.taobao.com下面的一个接口,这就是发起了一个跨域请求,在不做任何处理的情况下,显然当前跨域请求是无法被成功请求,因为浏览器基于同源策略会对跨域请求做一定的限制。
全栈程序员站长
2022/09/13
8870
Spring Boot:处理跨域问题
同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。
HLee
2021/07/03
2.1K0
Spring Boot:处理跨域问题
springboot的跨域配置
场景: 在前后端分离协同开发的场景下,跨域是一个非常常见的问题,觉得有必要对这个问题来做一下记录,同时也是强化对这部分知识的学习
在水一方
2022/06/14
8130
springboot的跨域配置
解决跨域问题的8种方法,含网关、Nginx和SpringBoot~
跨域问题是浏览器为了保护用户的信息安全,实施了同源策略(Same-Origin Policy),即只允许页面请求同源(相同协议、域名和端口)的资源,当 JavaScript 发起的请求跨越了同源策略,即请求的目标与当前页面的域名、端口、协议不一致时,浏览器会阻止请求的发送或接收。
磊哥
2024/01/25
6.2K0
解决跨域问题的8种方法,含网关、Nginx和SpringBoot~
Springmvc与Springboot对跨域请求的处理办法
什么是跨域呢?跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器施加的安全限制。所谓同源是指,域名,协议,端口均相同,不明白没关系,举个例子:
游离于山间之上的Java爱好者
2022/08/09
2590
Springmvc与Springboot对跨域请求的处理办法
CORS跨域问题及解决方案详解
CORS(Cross-Origin Resource Sharing,跨域资源共享)跨域问题源于浏览器的同源策略。同源策略是浏览器的一种安全机制,它要求浏览器在访问一个资源时,该资源的协议、域名和端口必须与当前页面的协议、域名和端口完全一致,否则就会被视为跨域请求,浏览器会对这类请求进行限制。
威哥爱编程
2025/02/25
5400
Springboot解决Ajax跨域的三种方式
这篇文章不华丽,但比较实用,能解决不少大家实际业务中的问题。大家可以收藏起来,以备用时之需!
业余草
2020/12/23
9110
Springboot解决Ajax跨域的三种方式
跨域的解决方式(java后端)
跨域并不是请求发不出去,请求能发出去,服务端能收到请求并正常返回结果,只是结果被浏览器拦截了。你可能会疑问明明通过表单的方式可以发起跨域请求,为什么Ajax就不会?因为归根结底,跨域是为了阻止用户读取到另一个域名下的内容,Ajax可以获取响应,浏览器认为这不安全,所以拦截了响应。但是表单并不会获取新的内容,所以可以发起跨域请求。
Java微观世界
2025/01/21
3320
跨域的解决方式(java后端)
SpringBoot系列(七) 分分钟学会SpringBoot多种跨域解决方式​
 跨域是指不同域名之间的相互访问,这是由浏览器的同源策略决定的,是浏览器对JavaScript施加的安全措施,防止恶意文件破坏。
全栈学习笔记
2022/03/31
7940
SpringBoot系列(七) 分分钟学会SpringBoot多种跨域解决方式​
SpringBoot教程(七) | SpringBoot解决跨域问题
上篇文章我们介绍了SpringBoot的拦截器的写法,其中有一个比较重要的步骤,就是把我们写好的拦截器注册到Spring的一个配置类中,这个类是实现了WebMvcConfigurer 接口,这个类很重要,因为这个类中除了可以注册拦截以外,还可以配置很多内容。今天我们来讲解一下SpringBoot如何解决跨域问题。 先来解释一下什么是跨域问题。
一缕82年的清风
2022/04/08
9650
SpringBoot教程(七) | SpringBoot解决跨域问题
JAVA | Java 解决跨域问题 花式解决跨域问题
我们在开发过程中经常会遇到前后端分离而导致的跨域问题,导致无法获取返回结果。跨域就像分离前端和后端的一道鸿沟,君在这边,她在那边,两两不能往来.
双鬼带单
2020/07/27
12.3K0
JAVA | Java 解决跨域问题 花式解决跨域问题
Spring Boot 解决跨域问题的 3 种方案!
前后端分离大势所趋,跨域问题更是老生常谈,随便用标题去google或百度一下,能搜出一大片解决方案,那么为啥又要写一遍呢,不急往下看。
Java技术江湖
2021/01/06
6570
跨域问题及解决方案
在前后端分离项目中,跨域问题是一定会遇到的。跨域问题的出现,会导致css、js或者ajax对后端请求等资源无法访问的情况。
半月无霜
2023/03/03
1.2K0
Spring Boot 中解决跨域的多种方式
在开发Web应用时,经常会遇到跨域问题,这给开发者带来了不少困扰。在本文中,我将探讨Spring Boot中解决跨域问题的几种常见方式,包括使用@CrossOrigin注解、自定义WebMvcConfigurer以及使用Filter进行跨域配置。通过深入了解这些方法,我们能够更好地解决跨域问题,保证应用的稳定性和安全性。
默 语
2024/11/20
1400
Spring Boot 中解决跨域的多种方式
Springboot处理CORS跨域请求的三种方法
浏览器出于安全的考虑,使用 XMLHttpRequest对象发起 HTTP请求时必须遵守同源策略,否则就是跨域的HTTP请求,默认情况下是被禁止的。换句话说,浏览器安全的基石是同源策略。
陈哈哈
2020/07/03
17.1K0
相关推荐
SpringBoot 中实现跨域的5种方式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验