一般后台有两种方式可以防止跨域问题。
1.通过使用CrossOrigin注解
2.使用一个CrossOriginConfig的配置类。
我比较喜欢使用第一种,比较简单。但是有一天发现即使使用了@CrossOrigin注解,依然总是报跨域请求的问题。这是为什么呢?
前置知识:
浏览器在需要发送一些特殊的请求的时候(content-type为application/json,put,delete请求等),会提前发送一个preflight request称为预检请求。如果预检请求发现后台服务器不支持跨域或者不支持某些特殊的请求方式的时候,就不会发送真正的请求了,这个时候就会出现“provisional Headers are shown”这种错误,意思就是展示了临时的响应头,而没有真正的发送过请求。
那么如题,我这个问题是如何产生的呢,正是由于我有一个拦截器,它拦截到了浏览器发出的预检请求(OPTIONS方法)。但是OPTIONS的预检请求通常都不会携带任何的数据,这个时候就很有可能被拦截器所拦截,也就导致预检请求拿不到它所需要的服务器是否支持跨域啊,服务器支持哪些请求方式的信息,从而导致不会发送真正的请求了,也就出现了上面所说的"provisional Headers are shown"这种错误的出现了,解决方式有两种。
1.不使用@CrossOrigin注解,而是使用CrossOriginConfig,通过一个filter来解决跨域。
2.在拦截器里面对OPTIONS方法进行放行,让预检请求能够获取到它所需要的服务器是否支持跨域,支持哪些请求方式等信息。