在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 {
@Override
public 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 {
@Override
public 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
注解或全局配置就足够了。对于更复杂的需求,考虑使用过滤器来实现更精细的控制。