SpringBoot中解决如何跨域方案
跨域访问的限制是由浏览器的同源策略(Same-Origin Policy)引起的。同源策略是浏览器实现的一种安全机制,它限制一个页面中的脚本只能访问同一域中的资源,而不能直接访问其他域的资源。同源策略有助于防止恶意脚本窃取用户数据
一、跨域解释
跨域(Cross-Origin)指的是在浏览器中,一个网页的脚本试图访问不属于同一个域(domain)的页面的资源。域是由协议(如 http)、主机名(如 www.example.com)和端口号(如 :8080)组成的。如果这三者之一不同,就被认为是跨域。
以下是同源策略的一些限制:
-
协议不同: 例如,从
http://example.com
无法直接访问https://api.example.com
。 -
域名不同: 例如,从
http://example.com
无法直接访问http://api.example.org
。 -
端口号不同: 例如,从
http://example.com:8080
无法直接访问http://example.com:9090
。
为了允许跨域请求,服务端需要在响应中包含适当的跨域头。这些跨域头包括:?
-
Access-Control-Allow-Origin: 指定允许访问的域。可以是具体的域名,也可以是通配符
*
表示允许所有域的访问。 -
Access-Control-Allow-Methods: 指定允许的 HTTP 方法。例如,GET、POST、PUT 等。
-
Access-Control-Allow-Headers: 指定允许的 HTTP 头。用于支持自定义的请求头。
-
Access-Control-Allow-Credentials: 指定是否允许携带认证信息(如 Cookies)。如果设置为
true
,则允许;否则,禁止携带认证信息。 -
Access-Control-Expose-Headers: 指定哪些响应头暴露给浏览器。默认情况下,只有基本的头信息会被暴露。
-
Access-Control-Max-Age: 用于指定 preflight 请求的有效期,即在该时间段内,浏览器无需再次发起 preflight 请求。
二、SpringBoot中实现跨域?
?在 Spring Boot 中实现跨域资源共享(CORS),你可以使用 @CrossOrigin
注解、全局配置或者使用过滤器的方式。
1. @CrossOrigin
注解
你可以在控制器类或方法上使用 @CrossOrigin
注解来配置跨域访问
@RestController
@RequestMapping("/api")
public class MyController {
@CrossOrigin(origins = "http://allowed-origin.com")
@GetMapping("/example")
public ResponseEntity<String> getExample() {
// your code here
return ResponseEntity.ok("Hello, CORS!");
}
}
?上面的示例中,@CrossOrigin
注解将允许来自 http://allowed-origin.com
的跨域请求。
2. 全局配置
在 Spring Boot 中,你可以通过配置类来全局配置 CORS。创建一个类并继承 WebMvcConfigurerAdapter
(在 Spring Boot 2.x 中可以使用 WebMvcConfigurer
接口):
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("http://allowed-origin.com")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowCredentials(true)
.maxAge(3600);
}
}
?上面的示例中,addMapping
方法指定了允许跨域的路径,allowedOrigins
指定了允许的来源,allowedMethods
指定了允许的 HTTP 方法,allowCredentials
允许携带认证信息,maxAge
指定了预检请求的有效期。
3. 使用过滤器
创建一个过滤器,并配置在 Spring Boot 中:
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Component
@Order(1)
public class CorsFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse httpResponse = (HttpServletResponse) response;
HttpServletRequest httpRequest = (HttpServletRequest) request;
httpResponse.setHeader("Access-Control-Allow-Origin", "http://allowed-origin.com");
httpResponse.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
httpResponse.setHeader("Access-Control-Allow-Headers", "Content-Type");
httpResponse.setHeader("Access-Control-Allow-Credentials", "true");
httpResponse.setHeader("Access-Control-Max-Age", "3600");
chain.doFilter(request, response);
}
}
?上述代码中,CorsFilter
类实现了 Filter
接口,它将在每个请求上添加 CORS 头部信息。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!