WebMvcConfigurer是SpringMVC框架提供的一个配置接口,通过它我们可以修改SpringMVC底层的行为,比如拦截器、消息转换器、静态资源处理等。在此基础上,我们也可以用WebMvcConfigurer来实现跨域资源共享(CORS)的配置。
一、跨域资源共享
所谓跨域资源共享,就是在一个域名下的网页去请求另一个域名下的资源,这个请求是跨域请求。浏览器禁止跨域请求,所以需要通过一些方式来解决这个问题。使用CORS是最常见的方式之一。
二、用WebMvcConfigurer来配置CORS
WebMvcConfigurer提供了addCorsMappings方法,来实现CORS的配置。下面是一个简单的例子:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedOrigins("*");
}
}
以上代码配置了所有的路由都可以跨域请求,allowedOrigins方法接受一个String数组,指定允许请求的域名,如果传入’*'则表示对所有域名允许请求。
三、CORS的详细配置
- 允许的请求方法
默认情况下,CORS只允许发送GET、POST和HEAD请求。如果需要允许其他类型的请求,可以使用allowedMethods方法:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("http://localhost:8080")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
}
}
以上代码配置了/api路径下所有的请求都可以跨域请求,允许的方法包括GET、POST、PUT、DELETE和OPTIONS。
- 允许的请求头
默认情况下,CORS只允许发送一些基本的请求头,如Content-Type、Accept和Authorization等。如果需要自定义请求头,需要使用allowedHeaders方法:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("http://localhost:8080")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowedHeaders("Authorization", "Content-Type", "Accept")
}
}
以上代码配置了允许发送的自定义请求头,包括Authorization、Content-Type和Accept。
- 暴露的响应头
除了请求头,浏览器还会过滤掉一些响应头,如Set-Cookie和Authorization等,这样是为了保障用户安全。如果需要暴露一些特定的响应头给客户端,需要使用exposedHeaders方法:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("http://localhost:8080")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowedHeaders("Authorization", "Content-Type", "Accept")
.exposedHeaders("Authorization")
}
}
以上代码配置了将Authorization响应头暴露给客户端。如果不指定exposedHeaders,默认情况下不会将响应头暴露给客户端。
四、总结
通过WebMvcConfigurer配置跨域可以很方便地将CORS配置到SpringMVC应用中。在实际开发中,应该根据实际情况来灵活配置,以保障数据的安全性。