当前位置:首页 > 每日看点 > 正文内容

为什么使用postman发送请求时不会有跨域问题?

卡卷网1年前 (2024-12-08)每日看点209

我是大明哥,一个专注 「死磕 Java」 的硬核程序员。

因为跨域是浏览器行为!!!!!浏览器行为!!!!浏览器行为!!!!

大明哥来详细讲讲跨域问题以及在 Spring Boot 中的解决方案。

什么是跨域问题

跨域是指浏览器的同源策略限制了网页向其他域发送请求的行为。同源策略要求协议、域名、端口号必须一致。例如:

  • http://skjava.com:80https://``skjava``.com:80 不同源(协议不同)。
  • http://``skjava``.com:80http://``skjava``.com:8080 不同源(端口不同)。
  • http://``skjava``.comhttp://api.``skjava``.com 不同源(域名不同)

当浏览器检测到跨域请求时,会自动触发 CORS(跨域资源共享,Cross-Origin Resource Sharing)检查。如果服务器没有正确设置 CORS 相关的响应头,浏览器会拦截请求,并报出跨域错误。

CORS 机制的工作方式

CORS 的核心在于浏览器与服务器之间通过 HTTP 头进行协商。具体过程如下:

简单请求

简单请求是指满足以下条件的 HTTP 请求:

  • 使用方法为 GETPOSTHEAD
  • 请求头只能包含以下字段:AcceptAccept-LanguageContent-LanguageContent-Type(仅限值为 application/x-www-form-urlencodedmultipart/form-datatext/plain)。

对于简单请求,浏览器直接发出请求,但需要服务器在响应头中返回:

Access-Control-Allow-Origin: http://localhost:3000

预检请求

当请求不满足简单请求的条件(如使用了复杂的请求头或方法),浏览器会先发送一个 OPTIONS 请求进行预检,确认服务器是否允许跨域。例如:

浏览器发出的预检请求:

OPTIONS /api/data HTTP/1.1 Origin: http://localhost:3000 Access-Control-Request-Method: POST Access-Control-Request-Headers: Content-Type

服务器返回的预检响应:

HTTP/1.1 200 OK Access-Control-Allow-Origin: http://localhost:3000 Access-Control-Allow-Methods: GET, POST, PUT, DELETE Access-Control-Allow-Headers: Content-Type Access-Control-Allow-Credentials: true

Spring Boot 如何解决跨域问题

使用 @CrossOrigin 注解

使用 @CrossOrigin 来标注某些方法允许跨域访问。例如:

@RestController @RequestMapping("/skjava") public class MyController { @GetMapping("/getSkjavaInfo") @CrossOrigin(origins = "http://localhost:3000") // 指定允许跨域的来源 public String getSkjavaInfo() { return "Hello, Cross-Origin!"; } }

origins 参数用于指定允许的来源,可以是具体的域名(如 http://skjava.com:80,表示只允许指定域名跨域)或通配符(*,表示所有域名都可以跨域访问)。但是它只适用于那些特定的接口部分放开跨域。

全局配置 CORS

有些情况我们需要全局允许跨域,这个时候我们就需要全局配置跨域了,如下:

@Configuration public class CorsConfig implements WebMvcConpr { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") // 匹配所有请求路径 .allowedOrigins("http://localhost:3000") // 允许的来源 .allowedMethods("GET", "POST", "PUT", "DELETE") // 允许的请求方法 .allowedHeaders("*") // 允许的请求头 .allowCredentials(true); // 允许发送 Cookie } }

配置过滤器

在更加复杂的场景下,我们可能需要对请求头、响应头等进行更加细粒度的控制,此时我们就可以创建一个过滤器来实现:

@Component public class CorsFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { HttpServletResponse httpResponse = (HttpServletResponse) response; httpResponse.setHeader("Access-Control-Allow-Origin", "http://localhost:3000"); httpResponse.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE"); httpResponse.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization"); httpResponse.setHeader("Access-Control-Allow-Credentials", "true"); chain.doFilter(request, response); } }

这种方式自由度比较高,但是实现难度比较大,复杂性高,比较适合那些复杂的需求场景。

浏览器的 CORS 是一种客户端安全保护机制,在实际开发中我们应该避免全局放开跨域,防止安全问题。

求一键三连:点赞、分享、收藏

点赞对我真的非常重要!在线求赞,加个关注我会非常感激!@大明哥

扫描二维码推送至手机访问。

版权声明:本文由卡卷网发布,如需转载请注明出处。

本文链接:https://www.kajuan.net/ttnews/2024/12/3513.html

分享给朋友:

相关文章

普通人一部手机用多久?

普通人一部手机用多久?

各位知友,你们的现在的手机用了多久了呢?回看国外分析机构TechInsights的报告,目前大家的用机周期是越来越长了,在国内,也达到了「40个月」,就是很多人至少三年半才会换一次手机。仔细想想,不对呀,现在新机不是一直出吗?为什么大家都不...

知乎创作收益高吗?

知乎创作收益高吗?

高啊,主要是大多数人不知道怎么做。(这是以前写的,请看到最后)我之前就是傻傻写问答,文章,结果一毛钱收益没有。知乎上收益高的主要有盐选,好物推荐,致知计划,付费咨询。1、盐选吧,是写故事,小说类的天堂,还有就是大咖们的地盘了,难度高。2、好...

想要在双 11 换一台全面无短板的新手机,有没有「闭眼买」的机型推荐?

想要在双 11 换一台全面无短板的新手机,有没有「闭眼买」的机型推荐?

最近一个月各大手机厂商的旗舰机扎堆发布,不知道大家看爽了没?这一代的性能续航大提升,最低 3599 元就能买到,同时老款也有不小的降幅,今年双 11 算是相当适合换手机的节点了!这次,小黑就给大家推荐双 11 期间值得购买的手机...150...

无人机真的是中国领先吗?

无人机真的是中国领先吗?

巧了这是。捡到了一台大疆。应该是别人飞丢的。在草丛中泡过水,轴承锈死,电池鼓涨已,经没有维修价值了。但作为玩电子的,免不了要把它解剖,研究一番。那么,我们看看它的国产化率能有多少吧。图片说话:解释一下吧。图一,高通 美国图二,MPS: 美国...

下一个风口最可能是什么?

下一个风口最可能是什么?

肯定是一带一路了,国内没什么卷的空间了,现在国家正在给一带一路的第三世界国家建设基础设施,等交通打通之后,就是通信打通,通信打通就是贸易打通,未来我建议大家重仓小语种,阿拉伯语最值得学(也有其他小语种自己去查一带一路国家),将来去其他国家随...

如何进行 Elasticsearch 调优实践?

如何进行 Elasticsearch 调优实践?

面试官心理分析这个问题是肯定要问的,说白了,就是看你有没有实际干过 es,因为啥?其实 es 性能并没有你想象中那么好的。很多时候数据量大了,特别是有几亿条数据的时候,可能你会懵逼的发现,跑个搜索怎么一下 5~10s ,坑爹了。第一次搜索的...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。