SpringBoot中解决如何跨域方案

2023-12-13 11:15:31

跨域访问的限制是由浏览器的同源策略(Same-Origin Policy)引起的。同源策略是浏览器实现的一种安全机制,它限制一个页面中的脚本只能访问同一域中的资源,而不能直接访问其他域的资源。同源策略有助于防止恶意脚本窃取用户数据

一、跨域解释

跨域(Cross-Origin)指的是在浏览器中,一个网页的脚本试图访问不属于同一个域(domain)的页面的资源。域是由协议(如 http)、主机名(如 www.example.com)和端口号(如 :8080)组成的。如果这三者之一不同,就被认为是跨域。

以下是同源策略的一些限制:

  1. 协议不同: 例如,从 http://example.com 无法直接访问 https://api.example.com

  2. 域名不同: 例如,从 http://example.com 无法直接访问 http://api.example.org

  3. 端口号不同: 例如,从 http://example.com:8080 无法直接访问 http://example.com:9090

为了允许跨域请求,服务端需要在响应中包含适当的跨域头。这些跨域头包括:?

  • Access-Control-Allow-Origin: 指定允许访问的域。可以是具体的域名,也可以是通配符 * 表示允许所有域的访问。

  • Access-Control-Allow-Methods: 指定允许的 HTTP 方法。例如,GET、POST、PUT 等。

  • Access-Control-Allow-Headers: 指定允许的 HTTP 头。用于支持自定义的请求头。

  • Access-Control-Allow-Credentials: 指定是否允许携带认证信息(如 Cookies)。如果设置为 true,则允许;否则,禁止携带认证信息。

  • Access-Control-Expose-Headers: 指定哪些响应头暴露给浏览器。默认情况下,只有基本的头信息会被暴露。

  • Access-Control-Max-Age: 用于指定 preflight 请求的有效期,即在该时间段内,浏览器无需再次发起 preflight 请求。

二、SpringBoot中实现跨域?

?在 Spring Boot 中实现跨域资源共享(CORS),你可以使用 @CrossOrigin 注解、全局配置或者使用过滤器的方式。

1. @CrossOrigin 注解

你可以在控制器类或方法上使用 @CrossOrigin 注解来配置跨域访问

@RestController
@RequestMapping("/api")
public class MyController {

    @CrossOrigin(origins = "http://allowed-origin.com")
    @GetMapping("/example")
    public ResponseEntity<String> getExample() {
        // your code here
        return ResponseEntity.ok("Hello, CORS!");
    }
}

?上面的示例中,@CrossOrigin 注解将允许来自 http://allowed-origin.com 的跨域请求。

2. 全局配置

在 Spring Boot 中,你可以通过配置类来全局配置 CORS。创建一个类并继承 WebMvcConfigurerAdapter(在 Spring Boot 2.x 中可以使用 WebMvcConfigurer 接口):

@Configuration
public class CorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**")
                .allowedOrigins("http://allowed-origin.com")
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowCredentials(true)
                .maxAge(3600);
    }
}

?上面的示例中,addMapping 方法指定了允许跨域的路径,allowedOrigins 指定了允许的来源,allowedMethods 指定了允许的 HTTP 方法,allowCredentials 允许携带认证信息,maxAge 指定了预检请求的有效期。

3. 使用过滤器

创建一个过滤器,并配置在 Spring Boot 中:

import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Component
@Order(1)
public class CorsFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        HttpServletRequest httpRequest = (HttpServletRequest) request;

        httpResponse.setHeader("Access-Control-Allow-Origin", "http://allowed-origin.com");
        httpResponse.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
        httpResponse.setHeader("Access-Control-Allow-Headers", "Content-Type");
        httpResponse.setHeader("Access-Control-Allow-Credentials", "true");
        httpResponse.setHeader("Access-Control-Max-Age", "3600");

        chain.doFilter(request, response);
    }
}

?上述代码中,CorsFilter 类实现了 Filter 接口,它将在每个请求上添加 CORS 头部信息。

文章来源:https://blog.csdn.net/TreeShu321/article/details/134959357
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。