当前位置: 面试刷题>> Spring Boot 如何处理跨域请求(CORS)?


在Spring Boot中处理跨域请求(CORS)是一个常见的需求,特别是在构建前后端分离的应用时。CORS(跨源资源共享)是一种机制,它使用额外的HTTP头部来告诉浏览器让运行在一个origin(域)上的web应用被准许访问来自不同源服务器上的指定的资源。作为一个高级程序员,在处理Spring Boot应用中的CORS时,你需要理解其背后的原理以及如何在Spring框架中高效地实现它。

理解CORS原理

CORS通过几个HTTP头部来实现跨域访问控制,主要包括:

  • Access-Control-Allow-Origin:指示哪些源可以访问资源。
  • Access-Control-Allow-Methods:指明实际请求所允许使用的HTTP方法。
  • Access-Control-Allow-Headers:服务器允许请求中携带的除了简单的请求头(如AcceptAccept-LanguageContent-LanguageContent-Type等)之外的其他头信息字段。
  • Access-Control-Expose-Headers:服务器允许暴露给脚本的响应头。
  • Access-Control-Max-Age:表示预检请求的结果(即是否允许跨域请求)能够被缓存多久。

在Spring Boot中配置CORS

在Spring Boot中,有几种方式可以配置CORS:

  1. 全局CORS配置: 通过实现WebMvcConfigurer接口并重写addCorsMappings方法,可以在Spring MVC应用中全局配置CORS。

    @Configuration
    public class CorsConfig implements WebMvcConfigurer {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**") // 匹配所有请求
                    .allowedOrigins("http://example.com") // 允许来自http://example.com的请求
                    .allowedMethods("GET", "POST", "PUT", "DELETE") // 允许的HTTP方法
                    .allowedHeaders("*") // 允许所有的头部
                    .allowCredentials(true) // 允许发送Cookie
                    .maxAge(3600); // 预检请求的结果缓存3600秒
        }
    }
    

    这种方式适用于大多数情况,尤其是当你的应用需要允许来自多个源的跨域请求时。

  2. 控制器级别的CORS配置: 如果你的CORS策略比较复杂,或者只需要在某些特定的控制器或方法上应用CORS,可以使用@CrossOrigin注解。

    @RestController
    @RequestMapping("/api")
    @CrossOrigin(origins = "http://example.com", methods = {RequestMethod.GET, RequestMethod.POST})
    public class MyController {
        // 控制器方法
    }
    

    或者,你也可以在方法级别上使用@CrossOrigin注解来覆盖类级别的设置。

  3. 自定义CORS过滤器: 对于更复杂的场景,你可能需要编写自定义的CORS过滤器。这允许你更细致地控制CORS行为,包括根据请求的不同部分动态调整CORS策略。

    @Component
    public class CustomCorsFilter implements Filter {
    
        @Override
        public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
                throws IOException, ServletException {
    
            HttpServletResponse response = (HttpServletResponse) res;
            HttpServletRequest request = (HttpServletRequest) req;
    
            // 根据请求动态设置CORS策略
            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");
    
            if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
                response.setStatus(HttpServletResponse.SC_OK);
            } else {
                chain.doFilter(req, res);
            }
        }
    
        // 其他方法...
    }
    

    注意,自定义过滤器需要注册到Spring的过滤器链中,这通常通过实现FilterRegistrationBean来完成。

结论

作为高级程序员,在处理Spring Boot应用中的CORS时,你应该能够评估不同场景的需求,并选择合适的策略来配置CORS。无论是全局配置、控制器级别的注解还是自定义过滤器,每种方法都有其适用场景和优缺点。通过深入理解CORS的工作原理和Spring Boot提供的灵活配置选项,你可以有效地解决跨域问题,确保应用的安全性和可访问性。在实际项目中,结合使用这些方法可以构建出既安全又高效的跨域访问策略。在码小课网站中,你也可以找到更多关于Spring Boot和CORS的深入教程和示例代码,帮助你更好地掌握这些技术。

推荐面试题