has been blocked by CORS policy: Response to preflight request doesn‘t pass access control check

1、报错场景

可能你用postman或者apifox测试接口没有任何问题,但是前端一旦加入就报CORS跨域问题,甚至说本地联调都OK,但是部署到服务器上就出现跨域问题,其实过来过去还是因为请求的发起没有被后端允许。

报错如下:

Access to XMLHttpRequest at 'http://xxxx/xxxx-ui' 
from origin 'http://xxxx/xxxx/xxxx-server' has been blocked by CORS policy: 
Response to preflight request doesn't pass access control check: 
It does not have HTTP ok status.

2、报错原因及解决(默认Header参数的情况)

加个过滤器或者拦截器,把所有的请求响应都处理一下,根据场景不同,可能你只需要下面其中一种方式就能解决问题;

2.1、处理请求拦截

package xxx;

/**
 * 配置自定义拦截器
 */
@Configuration
@Slf4j
public class InterceptorConfig implements WebMvcConfigurer {

	public void addInterceptors(InterceptorRegistry registry) {
		// 拦截所有请求
		registry.addInterceptor(globalInterceptor()).addPathPatterns("/**");
		log.info("系统拦截器初始化完成");
	}
	
	@Bean
	public GlobalInterceptor globalInterceptor() {
		return new GlobalInterceptor();
	}

	// 拦截器跨域配置
	@Override
	public void addCorsMappings(CorsRegistry registry) {
		// 跨域路径
		CorsRegistration cors = registry.addMapping("/**");
		// 可访问的外部域
		cors.allowedOrigins("*");
		// 支持跨域用户凭证
		//cors.allowCredentials(true);
		//cors.allowedOriginPatterns("*");
		// 设置 header 能携带的信息
		cors.allowedHeaders("*");
		// 支持跨域的请求方法
		cors.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS");
		// 设置跨域过期时间,单位为秒
		cors.maxAge(3600);
	}

	// 简写形式
//	@Override
//	public void addCorsMappings(CorsRegistry registry) {
//		registry.addMapping("/**")
//				.allowedOrigins("*")
//				//.allowCredentials(true)
//				//.allowedOriginPatterns("*")
//				.allowedHeaders("*")
//				.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
//				.maxAge(3600);
//	}

}

2.2、处理响应过滤

package xxx;

@Order(1)
@WebFilter(filterName = "corsFilter", urlPatterns = {"/*"})
public class CORSFilter implements Filter{

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化CORS过滤器...");
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        response.setHeader("Access-Control-Allow-Origin", "*"); //  这里最好明确的写允许的域名
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "Content-Type,Access-Token,Authorization,ybg,x_access_token");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
        System.out.println("销毁CORS过滤器.");
    }
}

3、报错原因及解决(自定义Header参数的情况)

如果是自定义Header参数的话,前端发起ajax请求后,浏览器首先会发起一个预检请求(OPTIONS),然后才是业务请求,所以在预检请求的时候浏览器就已经输出跨域报错了,因此针对自定义Header需要把这个预检请求排除掉;

package xxx;

/**
 * 过滤器
 */
@Slf4j
public class GlobalInterceptor implements HandlerInterceptor {
	
	//...
	
	/**
	 * 拦截所有请求,校验url和token
	 */
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		//加上校验放行
		if(request.getMethod().equals("OPTIONS")){
			return true;
		}else{
			///
		}
		return false;
	}
	
	//...
}
  • 13
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
此插件为跨域插件,打开后可跨域访问接口,旧版浏览器可直接拖到扩展程序中安装,新版浏览器需要将扩展名修改成rar并解压,然后点击“加载已解压的扩展程序”安装。 ======================插件概述谷歌译文====================== 轻松将(Access-Control-Allow-Origin:*)规则添加到响应标头。 允许CORS:通过Access-Control-Allow-Origin,您可以轻松地在Web应用程序中执行跨域Ajax请求。 只需激活插件并执行请求。默认情况下(在JavaScript API中),CORS或跨源资源共享在现代浏览器中被阻止。安装此加载项将使您可以解除阻止此功能。请注意,将插件添加到浏览器后,默认情况下它处于非活动状态(工具栏图标为灰色C字母)。如果要激活加载项,请按一次工具栏图标。图标将变为橙色的C字母。 ======================插件概述谷歌译文====================== ========================插件概述原文======================== Easily add (Access-Control-Allow-Origin: *) rule to the response header. Allow CORS: Access-Control-Allow-Origin lets you easily perform cross-domain Ajax requests in web applications. Simply activate the add-on and perform the request. CORS or Cross Origin Resource Sharing is blocked in modern browsers by default (in JavaScript APIs). Installing this add-on will allow you to unblock this feature. Please note that, when the add-on is added to your browser, it is in-active by default (toolbar icon is grey C letter). If you want to activate the add-on, please press on the toolbar icon once. The icon will turn to orange C letter. ========================插件概述原文========================

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cgv3

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值