跨域資源共享(CORS)是前后端分離項(xiàng)目很常見(jiàn)的問(wèn)題,本文主要是介紹在Springboot項(xiàng)目中通過(guò)cors協(xié)議解決跨域問(wèn)題
CORS協(xié)議
CORS是一個(gè)W3C標(biāo)準(zhǔn),全稱是"跨域資源共享"(Cross-origin resource sharing)。
它允許瀏覽器向跨源服務(wù)器,發(fā)出XMLHttpRequest請(qǐng)求,從而克服了AJAX只能同源使用的限制。
解決方案
1.基于WebMvcConfigurerAdapter配置加入Cors的跨域
通過(guò)實(shí)現(xiàn)WebMvcConfigurer接口中的addCorsMappings方法來(lái)實(shí)現(xiàn)跨域
/**
* 跨域配置類
*/
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")//*表示允許任何域名使用
.allowCredentials(true)
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS", "HEAD")
.maxAge(3600);
}
}
- addMapping:配置可以被跨域的路徑,可以任意配置
- allowedOrigins:* 代表允許所有的請(qǐng)求域名訪問(wèn)我們的跨域資源
- allowCredentials:響應(yīng)頭表示是否可以將請(qǐng)求的響應(yīng)暴露給頁(yè)面
- allowedMethods:允許所有的請(qǐng)求header訪問(wèn),可以自定義設(shè)置任意請(qǐng)求頭信息
- maxAge:配置客戶端緩存預(yù)檢請(qǐng)求的響應(yīng)時(shí)間(單位為秒)
2.采用過(guò)濾器(filter)的方式
@Component
public class CorsFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletResponse res = (HttpServletResponse) response;
res.addHeader("Access-Control-Allow-Credentials", "true");
res.addHeader("Access-Control-Allow-Origin", "*");
res.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, HEAD");
res.setHeader("Access-Control-Allow-Headers", "access-control-allow-origin, authority, content-type, version-info, X-Requested-With");
chain.doFilter(request, response);
}
public void init(FilterConfig filterConfig) {}
public void destroy() {}
}
Spring官方文檔學(xué)習(xí)地址:https://spring.io/blog/2015/06/08/cors-support-in-spring-framework