SpringBoot08-跨域访问

x33g5p2x  于2021-03-14 发布在 其他  
字(1.3k)|赞(0)|评价(0)|浏览(309)

CORS简介

  • 做WEB开发,特别是前后端分离之后,跨域就是一个不可避免的问题,解决方案也比较多,如jsonp,iframe等,这里我们要说的是CORS
  • 许多人还没意识到当前几乎所有的浏览器都可通过名为 跨域资源共享(Cross-Origin Resource Sharing) 的协议支持ajax跨域调用。对一个简单的请求,没有自定义头部,要么使用GET,要么使用POST,它的主体是text/plain,请求用一个名叫Orgin的额外的头部发送。Origin头部包含请求页面的头部(协议,域名,端口),这样服务器可以很容易的决定它是否应该提供响应。
  • CORS支持的浏览器有:
    • Chrome 3+
    • Firefox 3.5+
    • Opera 12+
    • Safari 4+
    • Internet Explorer 8+

CORS 并不是Spring Boot的功能,而是SpringMVC4.2以后开始的

CORS与JSONP比较:

  1. JSONP 只能实现 GET 请求,而 CORS 支持所有类型的 HTTP 请求。
  2. 使用 CORS,开发者可以使用普通的 XMLHttpRequest 发起请求和获得数据,比起 JSONP 有更好的
    错误处理。
  3. JSONP 主要被老的浏览器支持,它们往往不支持 CORS,而绝大多数现代浏览器都已经支持了 CORS

全局控制方案

/**
 * 全局跨域访问
 * @author LiuYin
 */
@Configuration
@EnableWebMvc
public class CorsConfiguration extends WebMvcConfigurerAdapter {

	@Override
	public void addCorsMappings(CorsRegistry registry) {
		// 这个是比较完整的实例
		registry.addMapping("/api/**")
		.allowedOrigins("http://luyou.com")
		.allowedMethods("PUT","GET")
		.allowedHeaders("header1","header2","header3")
		.exposedHeaders("headr5","header4")
		.allowCredentials(false)
		.maxAge(3600);
		
		// 一般默认也可以这样
		registry.addMapping("/api/**")
		.allowedOrigins("http://luyou.com");
	}
	
}

局部控制方案(注解)

@PostMapping("/save")
@CrossOrigin(origins = "http://luyou.com")
public long save(User user){
	return userService.save(user);
}

@CrossOrigin也可以注解在类上

注意:必须明确RequestMethod,如GET、POST

相关文章