Spring Boot:如何解决跨域问题

相关标签:1.什么是域名解析及其工作原理
2. Alibaba Cloud DNS

Spring Boot 跨域问题简介

跨域问题的原因:浏览器出于安全考虑,限制对本站点以外资源的访问。

Spring Boot 跨域问题。跨域问题现象


被 CORS 策略阻止:请求的资源上不存在 Access-Control-Allow-Origin 头部信息
以上提示表示您正在访问的资源地址被 CORS 协议阻止,Header 中未找到 Access-Control-Allow-Origin 参数

跨域问题分析

跨域问题的原因:浏览器出于安全考虑,限制对本站点以外资源的访问。
例如,如果您有一个网站 127.0.0.1:8080/,并在上面挂了一个页面,那么在该页面中,您可以不受限制地访问本站点的资源,但如果访问其他站点(如 127.0.0.1:8081)的资源,则会受到限制。
注意:此处将协议、域名和端口都相同的视为同一站点。

Spring Boot 跨域问题。但带有 src 属性的标签不受此限制,如 img、script 等。
回顾历史,以前程序的前后端不分离,页面和请求接口在同一个域名和端口下。浏览器认为来自本站点的页面请求同一站点的接口,长期以来一直允许这样做。

Spring Boot 跨域问题。例如,127.0.0.1:8080/index.html 请求 127.0.0.1:8080/a/b/c/userList 接口,这是可以的
而现在前后端分离,页面和接口通常不在同一个程序中,因此不再被允许,会抛出异常。

Spring Boot 跨域问题。什么是源和跨域





源(origin)由协议、域名和端口号组成。

一个 URL 由协议、域名、端口和路径组成。如果两个 URL 的协议、域名和端口都相同,则为同源。否则,只要协议、域名、端口中有任意一项不同,即为跨域。
以 https://www.baidu.com/index.html 为例的跨域比较:

什么是同源策略?
同源策略是一种约定。它是浏览器最核心、最基本的安全功能。如果缺少同源策略,浏览器的正常功能可能会受到影响。可以说 Web 是建立在同源策略基础之上的,浏览器只是同源策略的一种实现。
同源策略又分为以下两种:
1.DOM 同源策略:禁止操作不同源的 DOM。主要场景是 iframe 跨域的情况,不同域名的 iframe 被限制互相访问。
2.XMLHttpRequest 同源策略:禁止使用 XHR 对象向不同源的服务器地址发起 HTTP 请求。
Spring Boot:跨域问题解决

1. Spring Boot 跨域问题。创建过滤器解决跨域

项目的前后端分别部署,因此需要解决跨域问题。我们使用 Cookie 存储用户登录信息,在 Spring 拦截器中控制权限。当权限不匹配时,直接返回固定的 JSON 结果给用户。用户登录时可以正常使用;当用户退出登录或令牌过期时,由于拦截器和跨域处理的顺序问题,会出现跨域异常。我们知道,一个 HTTP 请求先经过过滤器,然后到达 Servlet 后再由拦截器处理。如果将 CORS 配置放在过滤器中,就可以优先于权限拦截器执行。
@Configuration

public class CorsConfig {
@Bean
public CorsFilter corsFilter() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
corsConfiguration.setAllowCredentials(true);

UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
return new CorsFilter(urlBasedCorsConfigurationSource);
}
}

2. 基于 WebMvcConfigurerAdapter 配置加入 CORS 解决跨域

前端可以通过 JSONP 解决跨域,但 JSONP 只能发送 GET 请求,无法发送其他类型的请求,在 RESTful 风格的应用中非常局限,因此推荐在后端通过 CORS(Cross-Origin Resource Sharing,跨域资源共享)来解决跨域问题。这个方案并非 Spring Boot 独有,在传统的 SSM 框架中也可以使用 CORS 解决跨域问题,只不过以前是在 XML 文件中配置 CORS,现在可以通过实现 WebMvcConfigurer 接口并重写 addCorsMappings 方法来解决。
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowCredentials(true)
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.maxAge(3600);
}
}
3. Controller 配置 CORS
在 Controller 方法上配置 CORS,可以在 @RequestMapping 注解的处理方法上添加 @CrossOrigin 注解以启用 CORS(默认情况下 @CrossOrigin 允许所有来源和 @RequestMapping 注解中指定的 HTTP 方法):
@RestController _
@RequestMapping ( " / account" )
public class AccountController {
@CrossOrigin _
@ GetMapping ( "/ {id}" )
public Account retrieve ( @ PathVariable) Long id )
// ...
A
@ DeleteMapping ( "/ {id}" )
public void remove ( @PathVariable _ Long id ) {
// ...
}
}

其中 @CrossOrigin 的参数说明:
@CrossOrigin 表示允许所有 URL 访问该资源 @CrossOrigin ( origins = " http://127.0.0.1:8080")//表示仅允许该 URL 跨域访问此 Controller 代码说明:@CrossOrigin 这个注解使用起来很方便,可以用在方法上,也可以用在类上。如果不设置其 value 属性或 origins 属性,默认允许所有 URL/域名访问。
1.value 属性可以设置多个 URL。
2.origins 属性也可以设置多个 URL。
3.maxAge 属性指定预检请求的缓存有效期最大持续时间。
4.allowCredentials 属性表示是否可以发送和处理 Cookie。默认为 false
5.allowedHeaders 属性表示允许哪些请求头。
6.methods 属性表示允许的请求方法,默认为 GET、POST、HEAD。
@CrossOrigin 不生效的原因
1. Spring MVC 版本必须是 4.2 及以上才支持 @CrossOrigin

2. 并非 @CrossOrigin 没有解决跨域请求问题,而是不正确的请求导致无法获得预期响应,从而使浏览器提示跨域问题。
@CrossOrigin 注解在 Controller 注解上方,跨域问题仍然存在。其中一个解决方案是:
在 @RequestMapping 注解中未指定 GET 和 POST 方法。指定后问题得到解决。
类似代码如下:
@CrossOrigin _
@RestController _
public class person {

@RequestMapping ( method _ = RequestMethod.GET ) _ _
public String add ( ) {
// some code
}
}

相关文章

探索更多特惠

  1. 短信服务与邮件推送

    5万封邮件包低至1.99 USD起,120条短信仅需1.00 USD起

phone 联系我们
你好,我是AI助理。
可以解答问题、推荐解决方案等。