springboot3解决跨域的几种方式小结

 更新时间:2024年03月04日 09:29:04   作者:蒾酒  
这篇文章主要介绍了springboot3解决跨域的几种方式,文中通过代码示例给大家介绍的非常详细,对大家的解决跨域有一定的帮助,需要的朋友可以参考下

1.前言

本文介绍了spring boot中三种解决跨域问题的方式,坚持看完相信对你有帮助。

2.何为跨域

跨域问题是指在 Web 开发中,一个网页的 JavaScript 代码通过 AJAX 请求后端服务器接口时,如果请求的目标地址与当前页面的地址不在同一个域(域名、端口或协议任何一项不同),就会产生跨域问题。这种情况下,根据浏览器的安全机制(同源策略)就会会限制页面的跨域请求,以防止恶意网站对其他网站的访问和操作,保护用户信息安全。

3.跨域问题出现特征

1.没有状态码信息

如果你看到某个请求似乎“失败了”,但并没有具体的HTTP状态码,这可能是因为浏览器出于安全原因阻止了对响应的访问。在开发者工具的网络(Network)面板中,这样的请求可能会被标记为“cancelled”或者没有显示状态码。

2.控制台报错

浏览器通常会在控制台(Console)中打印一条错误消息,说明因为CORS策略,请求被阻止了

4.方式一:使用 @CrossOrigin 注解

这是最直接简单的方式,可以精确控制所有接口

使用方法:在你的控制器类或者控制器方法上添加 @CrossOrigin 注解,可以精确控制某个控制器类、以及下面的某个方法的允许跨域的来源、允许的请求头、允许的请求方法等配置。

示例代码:

@RestController
@RequestMapping("/user")
@CrossOrigin(origins = "*")//允许所有来源的请求跨域
@Tag(name = "用户模块")
public class UserController {
    private final UserService userService;
 
    public UserController(UserService userService) {
        this.userService = userService;
    }
 
    @PostMapping("/login")
    @Operation(summary = "用户登录")
    public UserLoginVO login(@RequestBody @Validated UserLoginDTO userLoginDTO) {
        return userService.login(userLoginDTO);
    }
 
}

这种方式解决跨域需要在每个控制器上加注解,属于重复劳动对于不需要精确控制的场景属于重复劳动。可以看下下面方式

5.方式二:自定义 WebMvcConfigurer

通过实现 WebMvcConfigurer 接口来自定义 WebMvc 配置,并覆盖 addCorsMappings 方法以配置全局跨域规则。

示例代码:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
/**
 * @author mijiupro
 */
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**") // 对所有路径生效
                .allowedOrigins("*") //允许所有源地址
                // .allowedOrigins("https://mijiupro.com","https://mijiu.com ") // 允许的源地址(数组)
                .allowedMethods("GET", "POST", "PUT", "DELETE") // 允许的请求方法
                .allowedHeaders("*"); // 允许的请求头
    }
}

这种方式实现了全局的配置,但是无法细腻到控制某个方法

6.方式三:使用 Filter 进行跨域配置

创建一个跨域过滤器,在其中设置允许的跨域规则,并将该过滤器添加到 Spring Boot 的过滤器链中。

示例代码:

import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
 
import java.io.IOException;
 
/**
 * @author mijiupro
 */
@Component
public class CorsFilter implements Filter {
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // 将 ServletResponse 转换为 HttpServletResponse
        HttpServletResponse httpResponse = (HttpServletResponse) response;
 
        // 设置允许跨域请求的源地址
        httpResponse.setHeader("Access-Control-Allow-Origin", "https://mijiupro.com");
 
        // 设置允许的请求方法
        httpResponse.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
 
        // 设置允许的请求头
        httpResponse.setHeader("Access-Control-Allow-Headers", "*");
 
        // 继续执行 Filter 链
        chain.doFilter(request, response);
    }
}

7.最后

这三种spring boot中解决跨域的方式通常第二种跟第一种使用的最多,对于不需要细腻控制到某个接口方法的推荐使用第二种全局配置解决。

以上就是springboot3解决跨域的几种方式小结的详细内容,更多关于springboot3解决跨域的资料请关注脚本之家其它相关文章!

相关文章

  • 浅谈Mybatis #和$区别以及原理

    浅谈Mybatis #和$区别以及原理

    这篇文章主要介绍了浅谈Mybatis #和$区别以及原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Java枚举之EnumSet详解

    Java枚举之EnumSet详解

    这篇文章主要介绍了Java枚举之EnumSet详解,使用时进行与或运算,但是定义多了之后,会很乱、臃肿,编写容易出错,EnumSet可以实现类似的功能,且使用起来很简洁,需要的朋友可以参考下
    2023-12-12
  • Hutool开发利器MapProxy类使用技巧详解

    Hutool开发利器MapProxy类使用技巧详解

    这篇文章主要为大家介绍了Hutool开发利器MapProxy类使用技巧详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • java 各种数据类型的互相转换实例代码

    java 各种数据类型的互相转换实例代码

    这篇文章主要介绍了java 各种数据类型的互相转换实例代码,需要的朋友可以参考下
    2020-10-10
  • 基于Java ORM框架的使用详解

    基于Java ORM框架的使用详解

    本篇文章是对Java中ORM框架的使用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • Java数据结构之对象比较详解

    Java数据结构之对象比较详解

    这篇文章主要为大家详细介绍了Java中对象的比较、集合框架中PriorityQueue的比较方式以及PriorityQueue的模拟实现,感兴趣的可以了解一下
    2022-07-07
  • java虚拟机钩子关闭函数addShutdownHook的操作

    java虚拟机钩子关闭函数addShutdownHook的操作

    这篇文章主要介绍了java虚拟机钩子关闭函数addShutdownHook的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • SpringBoot拦截器的使用介绍

    SpringBoot拦截器的使用介绍

    大家好,本篇文章主要讲的是SpringBoot拦截器的使用介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • SpringBoot集成Quartz实现定时任务的方法

    SpringBoot集成Quartz实现定时任务的方法

    Quartz是一个定时任务框架,其他介绍网上也很详尽。这里要介绍一下Quartz里的几个非常核心的接口。通过实例代码给大家讲解SpringBoot集成Quartz实现定时任务的方法,感兴趣的朋友一起看看吧
    2020-05-05
  • 详解Java对象序列化为什么要使用SerialversionUID

    详解Java对象序列化为什么要使用SerialversionUID

    这篇文章主要介绍了详解Java对象序列化为什么要使用SerialversionUID,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11

最新评论