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);
  }
}


目录
相关文章
|
8月前
|
前端开发 Java 应用服务中间件
《深入理解Spring》 Spring Boot——约定优于配置的革命者
Spring Boot基于“约定优于配置”理念,通过自动配置、起步依赖、嵌入式容器和Actuator四大特性,简化Spring应用的开发与部署,提升效率,降低门槛,成为现代Java开发的事实标准。
|
8月前
|
前端开发 Java 微服务
《深入理解Spring》:Spring、Spring MVC与Spring Boot的深度解析
Spring Framework是Java生态的基石,提供IoC、AOP等核心功能;Spring MVC基于其构建,实现Web层MVC架构;Spring Boot则通过自动配置和内嵌服务器,极大简化了开发与部署。三者层层演进,Spring Boot并非替代,而是对前者的高效封装与增强,适用于微服务与快速开发,而深入理解Spring Framework有助于更好驾驭整体技术栈。
|
8月前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
8月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
767 2
|
8月前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
744 8
|
9月前
|
安全 Java 应用服务中间件
Spring Boot + Java 21:内存减少 60%,启动速度提高 30% — 零代码
通过调整三个JVM和Spring Boot配置开关,无需重写代码即可显著优化Java应用性能:内存减少60%,启动速度提升30%。适用于所有在JVM上运行API的生产团队,低成本实现高效能。
1093 3
|
9月前
|
人工智能 Java 机器人
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
Spring AI Alibaba集成Ollama,基于Java构建本地大模型应用,支持流式对话、knife4j接口可视化,实现高隐私、免API密钥的离线AI服务。
7225 2
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
存储 JSON Java
950 0
|
9月前
|
人工智能 Java 开发者
【Spring】原理解析:Spring Boot 自动配置
Spring Boot通过“约定优于配置”的设计理念,自动检测项目依赖并根据这些依赖自动装配相应的Bean,从而解放开发者从繁琐的配置工作中解脱出来,专注于业务逻辑实现。
2964 0