spring boot3 解决跨域几种方式

在Spring Boot 3中,解决跨域请求(CORS,Cross-Origin Resource Sharing)的问题主要有以下几种方式:

1. 使用@CrossOrigin注解

你可以直接在Controller类或者具体的请求处理方法上使用@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", methods = {RequestMethod.GET, RequestMethod.POST})  
public class MyController {  
  
    @GetMapping("/myEndpoint")  
    public String myEndpoint() {  
        return "Hello, CORS!";  
    }  
}

在这个例子中,@CrossOrigin注解被添加到了控制器类上,表示这个控制器下的所有方法都允许来自http://example.com的GET和POST请求。你也可以将注解添加到特定的方法上,以对该方法应用CORS配置。

2. 全局配置CORS

如果你希望全局配置CORS,而不是在每个Controller或方法上单独配置,你可以创建一个配置类来实现WebMvcConfigurer接口,并重写addCorsMappings方法。

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 CorsConfig implements WebMvcConfigurer {  
  
    @Override  
    public void addCorsMappings(CorsRegistry registry) {  
        // 添加映射路径  
        registry.addMapping("/**")  
                .allowedOrigins("*") // 允许哪些域的请求,星号代表允许所有  
                .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE") // 允许的方法  
                .allowedHeaders("*") // 允许的头部设置  
                .allowCredentials(true) // 是否发送cookie  
                .maxAge(168000); // 预检间隔时间  
    }  
}

在这个配置中,addMapping("/**")表示对所有的路径都应用CORS配置。allowedOrigins("*")表示允许所有来源的访问,这在生产环境中可能不是最佳实践,通常你会指定具体的域名。allowedMethods定义了允许的HTTP方法,allowedHeaders定义了允许的HTTP头部,allowCredentials(true)表示是否允许携带凭证(cookies, HTTP认证及客户端SSL证明等),maxAge则用于设置预检请求的有效期。

3. 使用Filter实现CORS

你也可以通过实现Filter接口来自定义CORS处理逻辑。

import javax.servlet.*;  
import javax.servlet.http.HttpServletResponse;  
import java.io.IOException;  
  
public class SimpleCorsFilter implements Filter {  
  
    @Override  
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)  
            throws IOException, ServletException {  
        HttpServletResponse response = (HttpServletResponse) res;  
        response.setHeader("Access-Control-Allow-Origin", "http://example.com");  
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");  
        response.setHeader("Access-Control-Max-Age", "3600");  
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with");  
        chain.doFilter(req, res);  
    }  
  
    @Override  
    public void init(FilterConfig filterConfig) {}  
  
    @Override  
    public void destroy() {}  
}

然后需要在配置类中注册这个Filter。

import org.springframework.boot.web.servlet.FilterRegistrationBean;  
import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configuration;  
  
@Configuration  
public class FilterConfig {  
  
    @Bean  
    public FilterRegistrationBean<SimpleCorsFilter> corsFilter() {  
        FilterRegistrationBean<SimpleCorsFilter> registrationBean = new FilterRegistrationBean<>();  
        registrationBean.setFilter(new SimpleCorsFilter());  
        registrationBean.addUrlPatterns("/*");  
        return registrationBean;  
    }  
}

4. 使用拦截器(Interceptor)

如果需要更复杂的CORS逻辑,你可以创建一个拦截器来处理CORS请求。拦截器允许你在请求处理之前或之后添加逻辑。

import org.springframework.web.servlet.HandlerInterceptor;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
  
public class CorsInterceptor implements HandlerInterceptor {  
  
    @Override  
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {  
        response.setHeader("Access-Control-Allow-Origin", "http://example.com");  
        response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");  
        response.setHeader("Access-Control-Allow-Headers", "*");  
        // 其他CORS相关的响应头设置  
        return true;  
    }  
}

然后,你需要在配置类中注册这个拦截器: 

import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.context.annotation.Configuration;  
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;  
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;  
  
@Configuration  
public class WebConfig implements WebMvcConfigurer {  
  
    @Autowired  
    private CorsInterceptor corsInterceptor;  
  
    @Override  
    public void addInterceptors(InterceptorRegistry registry) {  
        registry.addInterceptor(corsInterceptor).addPathPatterns("/**");  
    }  
}
  • 当设置allowedHeaders("*")时,实际上浏览器会发送实际请求头而不是*。出于安全考虑,最好明确指定允许的头部。
  • 在生产环境中,确保不要过于宽松地配置CORS,只允许必要的源和方法。
  • 如果你的应用部署在代理服务器后面(如Nginx或Apache),可能还需要在代理服务器上配置CORS。

相关推荐

  1. spring boot3 解决方式

    2024-03-27 06:48:06       44 阅读
  2. 解决方法

    2024-03-27 06:48:06       38 阅读
  3. 问题解决方法

    2024-03-27 06:48:06       27 阅读
  4. SpringBoot解决的三解决方案

    2024-03-27 06:48:06       31 阅读
  5. 方式?(详解)

    2024-03-27 06:48:06       43 阅读
  6. Spring Boot解决问题的3方案

    2024-03-27 06:48:06       49 阅读
  7. SpringBoot中实现常用方式

    2024-03-27 06:48:06       54 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-27 06:48:06       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-27 06:48:06       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-27 06:48:06       82 阅读
  4. Python语言-面向对象

    2024-03-27 06:48:06       91 阅读

热门阅读

  1. caffe | undefined reference to google protobuf

    2024-03-27 06:48:06       40 阅读
  2. Flink SQL填坑记3:两个kafka数据关联查询

    2024-03-27 06:48:06       35 阅读
  3. react native hooks 如何避免重复请求

    2024-03-27 06:48:06       34 阅读
  4. AI绘画自动生成器平台有哪些

    2024-03-27 06:48:06       41 阅读
  5. python数据解析xpath

    2024-03-27 06:48:06       41 阅读
  6. 微信小程序 第四节课

    2024-03-27 06:48:06       42 阅读
  7. pytorch中的torch.hub.load()

    2024-03-27 06:48:06       45 阅读
  8. 09 mybatis 注解

    2024-03-27 06:48:06       35 阅读
  9. PgMP考试费用是多少?收费标准详细解析!

    2024-03-27 06:48:06       104 阅读
  10. 1969. 数组元素的最小非零乘积

    2024-03-27 06:48:06       41 阅读
  11. QT学习之UDP

    2024-03-27 06:48:06       42 阅读
  12. spring缓存通用配置

    2024-03-27 06:48:06       43 阅读
  13. sqlite删除数据表

    2024-03-27 06:48:06       40 阅读