@CrossOrigin注解解决跨域问题
·
一、什么是@CrossOrigin
@CrossOrigin 是 Spring Framework 提供的一个注解,用于在 REST 控制器中轻松启用跨源资源共享(CORS)。CORS 是一种安全机制,由浏览器实现,用于限制一个域上的网页与另一个域上的资源进行交互的能力。这种限制有助于防止恶意脚本从一个站点访问另一个站点的数据。
二、什么是跨域
当一个网站尝试从不同域名(或端口、协议)请求数据时,浏览器会阻止这种请求,这是一种安全措施。例如,如果一个网站运行在 example.com 上,并尝试从 api.example.org 获取数据,那么默认情况下,这种请求会被浏览器阻止。
跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制。
所谓同源是指,域名,协议,端口均相同,举个栗子:
- http://www.123.com/index.html 调用 http://www.123.com/server.PHP (非跨域)
- http://123.com/index.html 调用http://456.com/server.php (主域名不同:123/456,跨域)
- http://www.abc.123.com/index.html 调用 http://www.def.123.com/server.php(子域名不同:abc/def,跨域)
- http://www.123.com:8080/index.html调用http://www.123.com:8081/server.php(端口不同:8080/8081,跨域)
- http://www.123.com/index.html 调用 https://www.123.com/server.php(协议不同:http/https,跨域)
三、@CrossOrigin注解是干什么用的
@CrossOrigin是一个Java注解,用于指示浏览器允许跨域请求资源。在Web应用程序中,如果JavaScript代码试图从一个域名获取来自不同域名的资源,这将会触发浏览器的同源策略,从而导致浏览器阻止跨域请求。使用@CrossOrigin注解可以允许浏览器绕过同源策略,从而允许跨域请求。
@CrossOrigin注解可以用于类级别或方法级别,如果用于类级别,将适用于整个类中的所有方法。它接受一些参数,包括:
- origins:指示允许跨域请求的来源。默认情况下,它是"*",表示允许来自任何来源的跨域请求。
- methods:指示允许的HTTP方法。默认情况下,它包括GET、HEAD和POST。
- maxAge:指示浏览器可以缓存预检请求的时间(以秒为单位)。
- allowedHeaders:指示允许的请求头。
- exposedHeaders:指示可以访问响应头的列表。
总之,使用@CrossOrigin注解可以解决跨域请求的问题,使得Web应用程序能够更灵活地使用跨域资源。
四、用法
在controller层接口上加上@CrossOrigin注解即可。
@RestController
public class MyController {
// 允许所有来源的 GET 请求
@CrossOrigin(origins = "*", allowedHeaders = "*", methods = RequestMethod.GET)
@GetMapping("/public")
public String getPublicResource() {
return "This is a public resource";
}
// 允许 example.com 的 POST 请求,并且允许携带凭证
@CrossOrigin(origins = "http://example.com", allowCredentials = "true")
@PostMapping("/private")
public String getPrivateResource() {
return "This is a private resource";
}
}
配置全局 CORS 支持
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*")
.allowCredentials(false)
.maxAge(3600);
}
}
更多推荐

所有评论(0)