Access-Control-Allow-Origin
是一个 HTTP 响应头,用于控制跨域资源共享(CORS)。当浏览器发起跨域请求时,会检查服务器返回的响应头中是否包含 Access-Control-Allow-Origin
,如果包含且值允许当前请求的源,则请求可以成功通过。
Access-Control-Allow-Origin
可以有以下几种常见的值:
*
:表示允许所有源访问。http://example.com
,表示只允许该域名访问。http://example1.com, http://example2.com
,表示允许这些域名访问。在 Web 开发中,当需要在前端页面中通过 AJAX 请求访问不同源的后端 API 时,就需要使用 CORS 来解决跨域问题。
Access-Control-Allow-Origin
不工作以下是一个在 Spring Boot 中配置 CORS 的示例:
import org.springframework.context.annotation.Bean;
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 {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://example.com")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*")
.allowCredentials(true)
.maxAge(3600);
}
};
}
}
在这个示例中:
addMapping("/**")
表示对所有路径启用 CORS。allowedOrigins("http://example.com")
表示只允许 http://example.com
访问。allowedMethods("GET", "POST", "PUT", "DELETE")
表示允许的 HTTP 方法。allowedHeaders("*")
表示允许所有请求头。allowCredentials(true)
表示允许发送 Cookie。maxAge(3600)
表示预检请求的缓存时间。确保服务器能够正确处理 OPTIONS 请求。Spring Boot 默认会处理 OPTIONS 请求,但如果你有自定义的过滤器或拦截器,可能需要手动处理:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Configuration
public class CorsFilter {
@Bean
public OncePerRequestFilter corsFilter() {
return new OncePerRequestFilter() {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
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", "*");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Max-Age", "3600");
if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
response.setStatus(HttpServletResponse.SC_OK);
} else {
filterChain.doFilter(request, response);
}
}
};
}
}
在这个示例中,我们创建了一个自定义的过滤器来处理 CORS 相关的响应头,并且手动处理了 OPTIONS 请求。
通过以上配置和处理,应该可以解决 Access-Control-Allow-Origin
不工作的问题。
领取专属 10元无门槛券
手把手带您无忧上云