范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

如何快速学习Java系列之跨域(CORS)请求(day5)

  昨天(第 4 天),我们实现了第一个 API  —— echo ,并通过 httpie  成功调用。今天我们来尝试一下用浏览器来调用是否还能成功调通?答案是否定的。原因就是我们今天要学习的 浏览器同源策略  导致的,同时引出了 CORS  实现跨域访问 。本文主要内容包括:CORS 同源策略支持 CORS  跨域访问预检请求 Preflight Request
  浏览器调用 API 的尝试
  先来回顾一下,在 day 4  文章的实例中,我们已经通过 httpie  成功的调用了 echo  接口,如下图:
  非浏览器成功调用
  下面我们来写个 JavaScript  脚本,通过浏览器来调用 echo  接口。
  直接运行 HTML 文件调用接口
  新建一个 html  文件,代码如下:              Document          
  保存后,双击用浏览器打开该 HTML ,点击按钮即可触发调用 echo  接口,调用结果如下:
  执行失败,报被 CORS 策略阻塞
  通过 HTTP 服务器调用接口
  下面是 VUE  代码,添加到 VUE  项目中,执行 yarn -dev  命令运行,点击按钮,触发调用 echo  接口。  
  这种方式运行是有 HTTP  服务器的,调用的结果如下图,它更清晰的指出了源域 IP :
  执行失败,报被 CORS 策略拒绝
  跨域(CORS)和同源策略(SOP)
  CORS :Cross Origin Resource Sharing , 俗称"跨域 ",全称"跨域资源共享 ",是每个 WEB  项目开发人员,不管是前端还是后端,都会遇到的问题。
  跨域问题是浏览器为了安全才有的,使用其它客户端工具,比如 httpie 、curl  等都没有该问题。
  Web  浏览器实现了一种被称为"同源策略 "的安全机制,防止网页在不同域中访问资源,包括 API ;而 CORS  提供了一种安全的方式,允许一个域(源域,用 origin  表示)调用另一个域中的资源,即允许在一个域下运行的 web  应用程序访问另一个域。
  SOP :Same Origin Policy , 同源策略 。同源 是指协议、域名和端口都相同,任何一个不相同都不算同源 。
  跨域请求和响应
  CORS Request  有两类:"simple" requests  和 "preflight" requests ,浏览器自己会决定使用哪种请求,无需我们人为的干预。我们需要了解该机制即可。简单请求 Simple requests  (GET, POST, HEAD )
  当请求满足下面条件时,浏览器将该请求视为"simple "请求:
  (1)使用 GET 、POST  或 HEAD  请求
  (2)使用 CORS safe-listed header
  (3)使用 Content-Type header  值为 application /x-wwww-form-urlencoded 、multipart /form-data  或 text /plain
  (4)没有在任何 XMLHttpRequestUpload  对象上注册事件侦听器
  (5)请求中未使用 ReadableStream  对象
  满足这些条件的请求,则被允许继续正常执行,不会被阻止,并且在返回响应时检查 Access-Control-Allow-Origin  header 。预检请求 Preflight requests  (OPTIONS )
  如果不是"simple" request ,浏览器将使用 HTTP  OPTIONS  方法自动发出预检请求 。 预检请求用于确定服务端确切的 CORS  能力,判断服务端是否理解预期的 CORS  协议。 如果 OPTIONS  调用的结果指示无法请求,则不会再发起对服务端的实际请求。
  预检请求将请求模式设置为 OPTIONS ,并设置一组 header  来描述接下来的请求:
  (1)Access-Control-Request-Method :请求的预期方法(如 GET、 POST )
  (2)Access-Control-Request-Headers :将随请求一起发送的自定义 header  的名称
  (3)Origin :current origin
  预检请求举例:curl -i -X OPTIONS localhost:3031/api/echo  -H "Access-Control-Request-Method: GET"  -H "Access-Control-Request-Headers: Content-Type, Accept"  -H "Origin: http://localhost:3030"
  这个例子表示,客户端向服务端询问:我想向从 http://localhost:3030  向 http://localhost:3031 /api/echo 发起一个 Get  请求,该请求包含 "Content-Type , Accept " header ,是否可以?
  服务器判断后,在响应中包含一些类似 Access-Control-*  的 header ,以指示是否允许随后的请求。 这些 header  有如下几种:
  (1)Access-Control-Allow-Origin : 表示允许发请求的源, "*" 表示允许所有源访问
  (2)Access-Control-Allow-Methods : 允许的 HTTP methods ,以逗号分隔
  (3)Access-Control-Allow-Headers : 允许发送的 custom headers ,以逗号分隔
  (4)Access-Control-Max-Age : preflight request  预请求响应结果的缓存时长,在这段时长内,再次调用该接口不用进行预请求调用。
  一个 preflight  请求的 Response  可能是像下面这样的:HTTP/1.1 204 No Content Access-Control-Allow-Origin: * Access-Control-Allow-Methods: GET,HEAD,PUT,PATCH,POST,DELETE Vary: Access-Control-Request-Headers Access-Control-Allow-Headers: Content-Type, Accept Content-Length: 0 Date: Fri, 05 Apr 2023 11:41:08 GMT Connection: keep-alive
  看到这里,是不是已经明白为什么在浏览器调试工具"网络"窗口中经常看到发出一次请求,有两条 log 的原因了吧?
  一次调用显示两条 log
  对的,没错就是因为其中一条是预检请求 ,另外一条才是真实请求 。
  后端跨域的实现添加跨域配置
  后端跨域配置
  添加 CorsConfig.java 文件,代码如下。import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;  @Configuration public class CorsConfig implements WebMvcConfigurer {     @Override     public void addCorsMappings(CorsRegistry registry) {         registry.addMapping("/**")                 // When allowCredentials is true, allowedOrigins cannot contain the special value "*" since that cannot be set on the "Access-Control-Allow-Origin" response header.                 // To allow credentials to a set of origins, list them explicitly or consider using "allowedOriginPatterns" instead.                 .allowedOrigins("*")                 //.allowedOriginPatterns("*")                 .allowedMethods("GET", "POST", "DELETE")                 .allowedHeaders("*")                 // restful api 是无状态的,无需缓存 cookie 等信息                 //.allowCredentials(true)                 // Access-Control-Max-Age header 表明预检请求响应的有效时间。在有效时间内,浏览器无须为同一请求再次发起预检请求。                 // 请注意,浏览器自身维护了一个最大有效时间,如果该首部字段的值超过了最大有效时间,将不会生效。                 // 在预检中,浏览器发送的头中包含有 HTTP 方法和真实请求中会用到的头。                 // 也就是说对于同样的请求,在 max-age 规定的时间内就不用再次通过预检了,就可以直接请求了,单位s                 .maxAge(1800);     } }跨域调用
  支持跨域之后,我们再分别用 httpie  和 浏览器来调用 echo  接口看看有什变化。
  跨域前后 httpie 调用结果对比
  跨域前后 chrome 调用结果对比
  从上面实践可以看到,支持跨域后,浏览器能成功调用 echo  接口了。
  预检请求(Preflight Request)实战
  最后我们再来增加一个 delete  接口,来亲自见识一下"预检请求 "。
  从上面的解释,我们知道预检请求不能是 GET ,POST  这种请求,而我们已有的 echo  接口是一个 POST  请求,所以需要新增一个符合条件的接口,这里我们增加一个 HTTP  DELETE  接口来演示。
  增加 delete 接口添加接口
  增加一个新的 Controller ,并添加 delete  接口,采用 @DeleteMapping  表示使用 HTTP  DELETE  方法来请求。import com.example.springdemo.dto.ProductQueryDto; import com.example.springdemo.model.Result; import org.springframework.web.bind.annotation.*;  @RestController @RequestMapping("api/product") public class ProductController {     @DeleteMapping("delete")     public Result delete(@RequestBody ProductQueryDto param) {         System.out.printf("[product][del] %s ", param.getId());         Result res = new Result<>();         return res.setData(param.getId());     } }
  增加 ProductQueryDto ,用于接口传参。这里大家先不用去管什么是 DTO ,什么是 Model ,后面的分享会逐一说明的。import lombok.Getter; import lombok.Setter;  @Getter @Setter public class ProductQueryDto {     private String id; }添加调用 delete 接口的 JavaScript 代码   运行并调用 delete 接口
  一次调用,有两条log
  点击这两条数据,查看两次调用的请求头和请求响应,对比如下图:
  预检请求和真正请求的对比
  小结,今天掌握了浏览器的同源策略 SOP,实现跨域访问 CORS 的方法,学习了预检请求 Preflight Request 和 Simple Request,自己定义了一个符合需要 Preflight Request 的接口,通过代码亲自做了实践。

清朝对边疆地区治理情况民族观念相关的国内研究有哪些?1。有关清朝民族观念和边疆民族政策的研究总体而言,学术界对华夷之辨从产生发展到演变的总体脉络,尤其是华夷观念在清代的演变,有着基本一致的认识,认为清代华夷之辨主要经历了两个历史阶段论清朝前期赋税法律改革一清代赋税法律的基本结构1清代赋税改革的时代背景税收是一个国家的基石所在,古往今来,人们都在为如何建立一套高效的征税体制而进行探索,有识之士想到了法律,用法律来保证税收的征收,这一40岁刘翔夫妇当丁克?养2条小狗,为其扎辫子被吐槽,思想很前卫刘翔和姚明是近些年来中国体育中影响力极高的运动员之一,他们在各自的领域都有些着卓越的成就,姚明也被誉为是中国高度,当年他在NBA赛场重新树立了东方巨人的形象,他的幽默努力谦逊等性格暖!同曦美丽老板娘夜访外援宿舍,送皮特森阿丘尔福字旺旺大礼包1月28日消息,日前,南京同曦男篮更新了官方社媒,美丽的老板娘杨总来到了两位外援皮特森和阿丘尔的宿舍,给他们送上了新年大礼包,十分贴心!老板娘首先来到了小后卫皮特森的房间,为他送上吊打八方的金朝灭亡史,比靖康之耻还惨曾经吊打蒙古,灭辽,推翻北宋王朝,和岳飞对着刚的金王朝到底有多牛,为何仅存119年,最后是被谁所灭。为何结局那么惨,我们一起来盘点金朝的前世今生。金王朝一直生活在我国现在的东北地区后宫专权,19岁皇帝暴毙,仅1月的女婴竟被隐瞒性别推上皇帝宝座公元528年3月31日,年仅19岁的北魏孝明帝元诩暴毙,出生仅1月的元姑娘被祖母胡灵太后拥立为帝,继承大统,并大赦天下。说起我国历史上第一位女皇帝,大家第一时间都会想到唐朝女皇武则江西广昌舞桥灯贺新春来源人民网江西频道舞桥灯贺新春舞桥灯贺新春舞桥灯贺新春舞桥灯贺新春2023年1月24日晚,江西省抚州市广昌县举行盛大的文化过大年旅游迎新春塘坊桥灯展演活动,村民们舞着由120节板凳朱虹让古代书院活起来的江西思路江西古代书院在中国书院史上独领风骚,对我国古代教育和学术文化的发展以及书院建筑体系的完善发挥了重要作用。书院文化是赣文化的典型代表,不断加强对书院文化的保护研究利用工作,发掘其当代究竟什么是成周?成周是否等于京师?近日,有网友就成周所处为何地一事发生争论。原因是双方都认为成周就是京师,或者是京师的所在地,争得成周,就为自己的家乡争得了西周的建都史。要弄清这个问题,我们首先要弄清什么是成周。成1004年,某大头兵在河南意外射出一支弩箭,成功为北宋续命百余年公元1004年初,时值大辽统和22年,北宋景德元年,宋辽这一对冤家再一次相互向对方拉满了弓弦,战争可谓一触即发。宋辽对峙图。(本文由头条作者泊东原创)为防止辽兵铁骑南下,北宋王朝速我们的东坡我们讲丨苏轼潇湘竹石图北宋视频加载中以专家讲作家讲文艺家讲新闻主播讲网络达人讲等方式推动三苏文化认知传播传承。文物简介苏轼潇湘竹石图北宋苏轼是我们中国历史上难得一遇的全能型人才,北宋四大书法家的苏黄米蔡,他
年薪12万,努力10年才120万,努力20年才240万,天天累死累活生活意义何在?够了够了,千万不要抱怨。看你的格定在哪里,你的能力是套在哪一包,你的商局形势怎么样,除了你所奋斗的此处,其它的同行业,又是怎样的?按中国的薪层阶级,你可以算是决对不是老大,也不算很新生儿眼屎多又黄,擦完马上又有了,到底是为什么?你好!我是眼科医生枫姐,很高兴有机会为您回答。一般而言新生儿眼屎多主要有以下几种原因普通结膜炎眼屎是黄色的又多,一般考虑细菌感染引起的。很多时候家里人担心宝宝会着凉,家里温度都会比为什么越来越多的人觉得德云社相声不如以前好听了?那确实是这样,可能是盛名之下江南才尽,没有创新,全部是老套路而造成的。相声演员也要与时俱进,时时创新,思想僵化肯定会淘汰的。五环之歌能唱多久呢?那种並无多少内涵的相声长久不了,刚一一加手机是杂牌手机吗?对于一加这个品牌,如果你认为是杂牌,那就有大大的误解了,在2021年6月16日,一加刘作虎(一加创始人)发内部信一加将成OPPO旗下独立品牌。在全新的OPPOFindN折叠屏上,也炒股用手机和用电脑有什么区别?我基本不要电脑,更不用说几个屏幕的那种了。1,你不是短线高手,要电脑何用?2,技术好,要电脑何用?3,专职炒股的人或许需要电脑,因为他成天没事做!反正本人查看一只个股只花几分钟时间宜昌和恩施,哪个更值得去?各有千秋。1。宜昌,古代时候称为夷陵,因水至此而夷,山至此而陵而得名。宜昌位于长江中游和上游的分界处,沿江而上,经三峡可达巴蜀之地,顺江而下,可抵沪宁之境宜昌市区则坐落于三峡东口,每年那么多的师范毕业生,而每年也都招录很多新教师,为什么教师还是不够用?这个问题的出现,其实是由学校实情和政府政策所产生的。现在小中大各级学校内,教师退休,人才流动,教师请假等等现象普遍存在。具体来说有如下几种情况各级各类学校内,都存在一部分老教师到龄别克君威1。5T精英版,14万能入手吗?别克君威1。5T精英版14万绝对值得入手,但是否能找到车源不能保证,而且这一价格理想的选择并不是君威。君威1。5T是一台没有明显不足主打舒适性的运动型轿车,这种看似矛盾的定位与价格个人存普洱茶是怎样一种体验?说说身边2006年左右以几十万购入普洱茶,存放现在还是一文不值的故事。2006年前后可以说是普洱茶近代历史上的高光时刻。因为炒家遍地开花,在当时还没有电子支付的手段下,很多炒家都是绵阳有什么地方适合穷游?都说绵阳风景美,那么有哪些地方适合人们穷游呢?1平武虎牙大峡谷路线绵阳市区(乘车)平武(乘车)虎牙。此后,可由高山铺,途经涮涮水,轻装登山,观一线天景观大龙口瀑布。涮涮水的大龙口瀑很多人反映新电表转得比较快?是这样吗?感觉是这样的,费用好像比没换表前翻倍,听到的借口说是现在的表比以前的灵敏,以前的老表在使用的电器功率比较小的时候不会转,而现在的电表哪怕是很小的功率也会运转,细想一下,这个说法也是