昨天的項目碰到個比較棘手的問題。前端發(fā)送ajax請求時,總會在真實請求前多一次請求方法為OPTIONS的請求,而且該請求返回403,導(dǎo)致真實請求失敗。后來查閱資料,大致了解了產(chǎn)生該問題的原因及原理,即跨域預(yù)檢。本文只給出解決方法,不再詳述原理,詳細可見簡單跨域請求和帶預(yù)檢的跨域請求
解決方法也是比較簡單,主要是開啟后臺的options的驗證即可。作者使用spirngboot的項目,主要通過攔截器攔截當前的options請求,開啟options驗證。
public class CorsInterceptor implements HandlerInterceptor {
private static final String OPTIONS = "OPTIONS";
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) {
//跨域預(yù)檢
if (OPTIONS.equals(request.getMethod())) {
response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Allow-Methods", "*");
response.addHeader("Access-Control-Allow-Headers", "*");
// 有效期,在24小時內(nèi),該請求無需再發(fā)送預(yù)檢請求
response.addHeader("Access-Control-Max-Age", String.valueOf(24 * 60 * 60));
}
return true;
}
}
springboot添加攔截器
@Configuration
public class GlobalConfiguration implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new CorsInterceptor()).addPathPatterns("/**");
}
}
以上,即可完成因為跨域預(yù)檢導(dǎo)致的請求失敗的問題。