13:SpringBoot跨域解决方案-Java Spring

简介: 13:SpringBoot跨域解决方案-Java Spring

13.1 CorsFilter

SpringBoot设置CORS的的本质都是通过设置响应头信息来告诉前端该请求是否支持跨域

CorsFilter是一种通用解决方案,用于将跨域资源共享 (CORS) 支持适配到 Java Web 应用程序。

过滤器CorsFilter为第三方组件,可以插入到任何标准的 Java Servlet 容器中,以处理对驻留在服务器上的Servlet、JSP 和 HTML 文件的跨站点请求

参考:CORS Filter

依赖引入

<dependency>
  <groupId>com.thetransactioncompany</groupId>
  <artifactId>cors-filter</artifactId>
  <version>[ version ]</version>
</dependency>

配置类

提供一个自定义的 @Configuration 配置类,自定义 CorsFilter 过滤器,添加映射路径和具体的 CORS 配置路径

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 CorsFilterConfiguration {
    @Bean
    public CorsFilter corsFilter() {
        //1.添加CORS配置信息
        CorsConfiguration configuration = new CorsConfiguration();
        //允许所有源请求跨域,* 表示不限制
        configuration.addAllowedOrigin("*");
    //跨域请求默认不包含Cookie,设置为true可以包含Cookie
        configuration.setAllowCredentials(true);
        //允许所有方法跨域,或者设置请求方式GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
        configuration.addAllowedMethod("*");
        //允许所有原始请求头信息
        configuration.addAllowedHeader("*");
      //允许暴露哪些头信息,为了安全问题不能设置成*,否则会报错:throw new IllegalArgumentException("'*' is not a valid exposed header value");
        configuration.addExposedHeader("");
        //设置请求有效时间
        configuration.setMaxAge(3600L);
        //2.添加映射路径,即允许对方可以访问本应用下的哪些请求接口,/** 表示所有请求
        UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
        configSource.registerCorsConfiguration("/**", config);
        //3.返回新的CorsFilter.
        return new CorsFilter(configSource);
    }
}

13.2 @CrossOrigin

@CrossOrigin注解表示局部跨域,可以用在类或者方法上

SpringMVC在4.2以上版本才支持@CrossOrigin

maxAge:准备响应前的缓存持续的最大时间(以秒为单位)。

import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/account")
public class TestController {
  //origins表示允许的域,用在控制器方法上,表示该方法都允许跨域
    @CrossOrigin(origins = "*")
    @GetMapping("test")
    public String test() {
        return "success";
    }
}
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
//maxAge表示准备响应前的缓存持续的最大时间,单位为秒,用在控制器类上,表示该类的所有方法都允许跨域
@CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/account")
public class TestController {
    @GetMapping("test")
    public String test() {
        return "success";
    }
}

13.3 WebMvcConfigurer

实现 WebMvcConfigurer全局跨域),重写 addCorsMappings 方法设置跨域映射

addMapping 配置可以被跨域的路径,可以任意配置,可以具体到直接请求路径。

allowedMethods:允许所有的请求方法访问该跨域资源服务器,如:POST、GET、PUT、DELETE等。 allowedOrigins:允许所有的请求域名访问我们的跨域资源,可以固定单条或者多条内容,


如:“http://www.aaa.com”,只有该域名可以访问我们的跨域资源。 allowedHeaders:允许所有的请求header访问,可以自定义设置任意请求头信息。

@Configuration
public class CorsConfig implements WebMvcConfigurer {
  @Override
  public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/**")
    //允许所有源请求跨域,* 表示不限制
    .allowedOrigins("*")
        //允许所有原始请求头信息
    .allowedHeaders("*")
    //允许所有方法跨域,或者设置请求方式GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
    .allowedMethods("GET", "POST", "DELETE", "PUT", "OPTIONS", "HEAD")
    //允许包含Cookie
    .allowCredentials(true)
      //允许暴露哪些头信息,为了安全问题不能设置成*
    //.exposedHeaders();
    .maxAge(3600);
  }
}


目录
相关文章
|
6天前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
基于开源框架Spring AI Alibaba快速构建Java应用
|
14天前
|
前端开发 Java 数据库连接
Spring 框架:Java 开发者的春天
Spring 框架是一个功能强大的开源框架,主要用于简化 Java 企业级应用的开发,由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立,并由Pivotal团队维护。
36 1
Spring 框架:Java 开发者的春天
|
4天前
|
Java API Apache
|
6天前
|
监控 前端开发 Java
Java SpringBoot –性能分析与调优
Java SpringBoot –性能分析与调优
|
14天前
|
Java 数据库连接 开发者
Spring 框架:Java 开发者的春天
【10月更文挑战第27天】Spring 框架由 Rod Johnson 在 2002 年创建,旨在解决 Java 企业级开发中的复杂性问题。它通过控制反转(IOC)和面向切面的编程(AOP)等核心机制,提供了轻量级的容器和丰富的功能,支持 Web 开发、数据访问等领域,显著提高了开发效率和应用的可维护性。Spring 拥有强大的社区支持和丰富的生态系统,是 Java 开发不可或缺的工具。
|
9天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
14天前
|
JSON Java Maven
实现Java Spring Boot FCM推送教程
本指南介绍了如何在Spring Boot项目中集成Firebase云消息服务(FCM),包括创建项目、添加依赖、配置服务账户密钥、编写推送服务类以及发送消息等步骤,帮助开发者快速实现推送通知功能。
31 2
|
18天前
|
存储 人工智能 Java
将 Spring AI 与 LLM 结合使用以生成 Java 测试
AIDocumentLibraryChat 项目通过 GitHub URL 为指定的 Java 类生成测试代码,支持 granite-code 和 deepseek-coder-v2 模型。项目包括控制器、服务和配置,能处理源代码解析、依赖加载及测试代码生成,旨在评估 LLM 对开发测试的支持能力。
29 1
|
12天前
|
缓存 Java 程序员
Java|SpringBoot 项目开发时,让 FreeMarker 文件编辑后自动更新
在开发过程中,FreeMarker 文件编辑后,每次都需要重启应用才能看到效果,效率非常低下。通过一些配置后,可以让它们免重启自动更新。
20 0
|
JSON Java 数据安全/隐私保护
springboot解决跨域问题
项目中前后端分离部署,所以需要解决跨域的问题
279 0