@CrossOrigin 多系统跨域业务场景使用案例

@CrossOrigin 注解用于启用跨源请求(CORS)。CORS 是一种机制,它允许不同源的前端应用(例如,位于不同域名的 Web 应用)访问你的后端 API。

注解结构设计

在这里插入图片描述

业务场景:

例如你正在开发一个开放的 API,允许第三方开发者使用你的服务。这些开发者可能会从他们自己的网站向你的 API 发送请求。由于浏览器的同源策略,如果 API 服务器没有正确配置 CORS,前端应用将无法成功调用你的 API。

1. 单个控制器或方法的 CORS 配置:
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://xopencode.com") // 允许指定域名的前端应用访问
public class OpenApiController {

    @GetMapping("/api/data")
    public Data getData() {
        // 返回 API 数据
        return new Data(...);
    }
}

在这个例子中,只有 http://example.com 这个域名的前端应用可以访问 /api/data 路径下的资源。

2. 全局 CORS 配置:
import org.springframework.context.annotation.Bean;
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("/api/**") // 应用于 /api/ 下的所有路径
                .allowedOrigins("http://xopencode.com", "https://anotherdomain.com") // 允许多个域名
                .allowedMethods("GET", "POST", "PUT", "DELETE") // 允许的方法
                .allowedHeaders("*") // 允许的头
                .allowCredentials(true) // 允许携带凭证
                .maxAge(3600); // 预检请求的缓存时间
    }
}

在这个全局配置中,我们为所有 /api/ 路径下的请求设置了 CORS 规则,允许来自 http://example.comhttps://anotherdomain.com 的请求,并允许使用 GET、POST、PUT 和 DELETE 方法。

3. 处理预检请求:

当浏览器自动发送 OPTIONS 请求(预检请求)时,服务器需要正确响应这些请求以告知浏览器允许的 HTTP 方法。

@Controller
public class PreFlightController {

    @CrossOrigin
    @RequestMapping(method = RequestMethod.OPTIONS)
    public ResponseEntity<?> handlePreFlightRequest(HttpServletResponse response) {
        return ResponseEntity.ok().header("Access-Control-Allow-Origin", "*")
                .header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE")
                .header("Access-Control-Allow-Headers", "Content-Type, X-Custom-Header")
                .allowCredentials(true)
                .build();
    }
}
4. 测试 CORS:
  • 前端开发者将使用 http://xopencode.comhttps://anotherdomain.com 作为前端应用的域名,向你的 API 发送请求。
  • 当他们发送请求时,浏览器会先发送一个 OPTIONS 请求进行预检。
  • 服务器通过 @CrossOrigin 注解或全局 CORS 配置,返回允许的 HTTP 方法和头信息。
  • 浏览器随后会根据预检请求的响应决定是否允许实际的请求。

总结:

  • @CrossOrigin 注解允许开发者明确地指定哪些源可以访问他们的 API,从而提高了应用程序的安全性。
  • 它简化了 CORS 配置,使得开发者可以轻松地为特定的控制器或方法启用跨源请求。
  • 使用 @CrossOrigin 注解可以提高 API 的可用性,使其能够被多个前端应用安全地访问。
  • 18
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Solomon_肖哥弹架构

你的欣赏就是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值