跨域
首先,跨域是浏览器的同源策略,其实对于接口来讲,有请求就有响应,也就是说即便是跨域,正确的响应已经给到了浏览器,浏览器如果发现是跨域了,就会对响应做校验,看看是否有允许跨域的设置,(请求头设置跨域字段),如果有就把响应给到请求,如果没有则丢弃掉该响应,这就是浏览器的同源策略
浏览器发送请求有几种方式,**我常用第5种,比较方便,一个注解搞定**
(1)、<sript src="url"/>、<a/>、<image/>等标签,该请求不存在跨域问题
(2)、ajax请求,ajax请求是存在跨域问题的
跨域常用的解决方式:
(1)jsonp,所谓jsonp就是把ajax请求的方式转为标签请求,也就是<sript src="url"/>这种方式,因为标签请求不存在跨域问题,但该方式只有一个Url,也就是只支持路径拼接传参,只能支持GET请求
(2)nginx转发,浏览器到nginx也是跨域的,可以只在Nginx配置跨域就行了
(3)过滤器,过滤器方式设置请求的响应头信息,
public class SimpleCORSFilter implements Filter{
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
chain.doFilter(req, res);
}
}
(4)springboot同源策略
@Configuration
public class CorsConfig {
@Bean
public CorsFilter corsFilter() {
final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
final CorsConfiguration corsConfiguration = new CorsConfiguration();
/*是否允许请求带有验证信息*/
corsConfiguration.setAllowCredentials(true);
/*允许访问的客户端域名*/
corsConfiguration.addAllowedOrigin("*");
/*允许服务端访问的客户端请求头*/
corsConfiguration.addAllowedHeader("*");
/*允许访问的方法名,GET POST等*/
corsConfiguration.addAllowedMethod("*");
urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
return new CorsFilter(urlBasedCorsConfigurationSource);
}
}
(5)、@CrossOrigin注解
上面几种方式都是粗粒度的,springmvc提供了这样的注解,可以添加在controller类上,也可以添加到方法上,但注意,方法必须使用rest风格注解,比如@GetMapping或者指定请求方式:@RequestMapping(method = “POST”)
该注解有很多参数值可设置,默认全部请求