前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Boot解决跨域问题的技术方案及代码示例

Spring Boot解决跨域问题的技术方案及代码示例

作者头像
用户7353950
发布2024-05-20 15:36:03
2060
发布2024-05-20 15:36:03
举报
文章被收录于专栏:IT技术订阅IT技术订阅
Spring Boot 应用程序中的跨域问题主要是由于浏览器的同源策略(Same-Origin Policy)所导致的。同源策略是浏览器的一个核心安全模型,规定了一个源(由协议、域名、端口号三部分组成)加载的文档或脚本,在没有明确授权的情况下,不允许与来自不同源的网页进行交互,例如发送Ajax请求、读取DOM内容等。

产生原因:

当前端应用(如SPA应用或移动Hybrid应用中的Web视图)通过JavaScript发起HTTP请求到与当前页面所在源不同的服务器时,就涉及到了跨域。例如,前端应用部署在 `http://app.example.com` ,但尝试访问位于 `http://api.example.net` 的API服务,由于协议、域名或端口至少有一项不同,浏览器会按照同源策略阻止这种跨域请求,除非服务器明确表明允许这样的跨域访问。

在Spring Boot项目中解决跨域问题可以通过多种方式实现,以下是其中几种常见且实用的方法,以及相应的代码示例:

1. 使用 `@CrossOrigin` 注解

局部跨域配置:在单个控制器类或方法上使用 `@CrossOrigin` 注解来启用跨域。

import org.springframework.web.bind.annotation.CrossOrigin;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RestController;

@RestController

@CrossOrigin(origins = "http://example.com", maxAge = 3600)

public class MyController {

@GetMapping("/api/data")

public String getData() {

return "Hello, Cross-Origin!";

}

}

这里,`@CrossOrigin` 注解允许来自 `http://example.com` 的跨域请求,并设置了预检请求(OPTIONS)的缓存时间为3600秒。

2. 全局跨域配置

全局跨域过滤器:通过实现 `CorsFilter` 或者在配置类中定义一个Bean来全局允许跨域。

import org.springframework.boot.web.servlet.FilterRegistrationBean;

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 CorsConfig {

@Bean

public FilterRegistrationBean<CorsFilter> corsFilter() {

UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();

CorsConfiguration config = new CorsConfiguration();

// 允许所有来源

config.setAllowedOrigins(Arrays.asList("*"));

// 允许的请求头

config.addAllowedHeader("*");

// 允许的请求方法

config.addAllowedMethod("*");

// 预检请求的缓存时间(可选,默认1800秒)

config.setMaxAge(3600L);

source.registerCorsConfiguration("/**", config);

FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean<>(new CorsFilter(source));

bean.setOrder(Ordered.HIGHEST_PRECEDENCE);

return bean;

}

}

在这个例子中,我们创建了一个全局的CorsFilter,允许所有来源进行跨域访问,并允许所有请求头和方法。

3. 通过WebMvcConfigurer接口扩展

配置类方式:如果你希望以更细粒度的方式来控制跨域策略,可以在一个实现了 `WebMvcConfigurer` 接口的配置类中重写其跨域相关方法。

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 WebConfig implements WebMvcConfigurer {

@Override

public void addCorsMappings(CorsRegistry registry) {

registry.addMapping("/**")

.allowedOrigins("*")

.allowedMethods("*")

.allowedHeaders("*")

.allowCredentials(true)

.maxAge(3600);

}

}

这里的 `addCorsMappings` 方法用于全局配置跨域策略,同样允许所有来源、方法、请求头,并且允许携带凭证(cookies)进行跨域请求。

以上都是针对Spring Boot项目的跨域解决方案及其对应的代码示例。在实际应用中,根据安全性和项目需求调整具体的跨域策略,如仅允许特定域名、特定HTTP方法等。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT技术订阅 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档