在Spring Boot中处理跨域请求(CORS, Cross-Origin Resource Sharing)通常有几种方法。跨域请求是指从一个域名的网页去请求另一个域名下的资源。为了安全起见,浏览器会阻止这种请求,除非服务器明确允许。
方法一:使用@CrossOrigin
注解
这是最简单的方法,直接在Controller类或方法上使用@CrossOrigin
注解来指定允许跨域的来源。例如:
@RestController
@CrossOrigin(origins = "http://example.com")
public class MyController {@GetMapping("/hello")public String hello() {return "Hello World";}
}
如果要对所有来源开放,可以将origins
属性设置为*
。
方法二:配置CORS全局设置
如果你需要更细粒度地控制跨域行为,或者希望整个应用都遵循相同的跨域策略,可以通过实现WebMvcConfigurer
接口并重写addCorsMappings
方法来全局配置CORS。
@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOrigins("http://example.com").allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS").allowedHeaders("*").allowCredentials(true).maxAge(3600);}
}
在这个例子中:
addMapping("/**")
表示对所有路径生效。allowedOrigins
指定了允许的源。allowedMethods
指定了允许的HTTP方法。allowedHeaders
指定了允许的头信息。allowCredentials
设置是否支持凭证(如cookies)。maxAge
设置预检请求的有效期,单位为秒。
方法三:通过过滤器实现CORS
对于更复杂的场景,可能需要通过实现过滤器(Filter)来处理跨域请求。创建一个实现了Filter
接口的类,并注册到Spring容器中。
@Component
public class CorsFilter implements Filter {@Overridepublic void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {HttpServletResponse response = (HttpServletResponse) res;response.setHeader("Access-Control-Allow-Origin", "*");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, authorization");if ("OPTIONS".equalsIgnoreCase(((HttpServletRequest) req).getMethod())) {response.setStatus(HttpServletResponse.SC_OK);} else {chain.doFilter(req, res);}}// 其他方法...
}
这种方法提供了最大的灵活性,但是也相对复杂一些。
选择哪种方式取决于你的具体需求。对于大多数简单的应用来说,使用@CrossOrigin
注解或全局配置就足够了。对于更复杂的需求,考虑使用过滤器来实现更精细的控制。