应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

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

  昨天(第4天),我们实现了第一个APIecho,并通过httpie成功调用。今天我们来尝试一下用浏览器来调用是否还能成功调通?答案是否定的。原因就是我们今天要学习的浏览器同源策略导致的,同时引出了CORS实现跨域访问。本文主要内容包括:CORS同源策略支持CORS跨域访问预检请求PreflightRequest
  浏览器调用API的尝试
  先来回顾一下,在day4文章的实例中,我们已经通过httpie成功的调用了echo接口,如下图:
  非浏览器成功调用
  下面我们来写个JavaScript脚本,通过浏览器来调用echo接口。
  直接运行HTML文件调用接口
  新建一个html文件,代码如下:!DOCTYPEhtmlhtmllangenheadmetacharsetUTF8metahttpequivXUACompatiblecontentIEedgemetanameviewportcontentwidthdevicewidth,initialscale1。0titleDocumenttitleheadbodybuttononclickcallEcho()callapiutilechobuttonbodyhtml
  保存后,双击用浏览器打开该HTML,点击按钮即可触发调用echo接口,调用结果如下:
  执行失败,报被CORS策略阻塞
  通过HTTP服务器调用接口
  下面是VUE代码,添加到VUE项目中,执行yarndev命令运行,点击按钮,触发调用echo接口。templateelbuttontypeprimaryclickcallApiEcho调用apiutilechoelbuttontemplate
  这种方式运行是有HTTP服务器的,调用的结果如下图,它更清晰的指出了源域IP:
  执行失败,报被CORS策略拒绝
  跨域(CORS)和同源策略(SOP)
  CORS:CrossOriginResourceSharing,俗称跨域,全称跨域资源共享,是每个WEB项目开发人员,不管是前端还是后端,都会遇到的问题。
  跨域问题是浏览器为了安全才有的,使用其它客户端工具,比如httpie、curl等都没有该问题。
  Web浏览器实现了一种被称为同源策略的安全机制,防止网页在不同域中访问资源,包括API;而CORS提供了一种安全的方式,允许一个域(源域,用origin表示)调用另一个域中的资源,即允许在一个域下运行的web应用程序访问另一个域。
  SOP:SameOriginPolicy,同源策略。同源是指协议、域名和端口都相同,任何一个不相同都不算同源。
  跨域请求和响应
  CORSRequest有两类:simplerequests和preflightrequests,浏览器自己会决定使用哪种请求,无需我们人为的干预。我们需要了解该机制即可。简单请求Simplerequests(GET,POST,HEAD)
  当请求满足下面条件时,浏览器将该请求视为simple请求:
  (1)使用GET、POST或HEAD请求
  (2)使用CORSsafelistedheader
  (3)使用ContentTypeheader值为applicationxwwwwformurlencoded、multipartformdata或textplain
  (4)没有在任何XMLHttpRequestUpload对象上注册事件侦听器
  (5)请求中未使用ReadableStream对象
  满足这些条件的请求,则被允许继续正常执行,不会被阻止,并且在返回响应时检查AccessControlAllowOriginheader。预检请求Preflightrequests(OPTIONS)
  如果不是simplerequest,浏览器将使用HTTPOPTIONS方法自动发出预检请求。预检请求用于确定服务端确切的CORS能力,判断服务端是否理解预期的CORS协议。如果OPTIONS调用的结果指示无法请求,则不会再发起对服务端的实际请求。
  预检请求将请求模式设置为OPTIONS,并设置一组header来描述接下来的请求:
  (1)AccessControlRequestMethod:请求的预期方法(如GET、POST)
  (2)AccessControlRequestHeaders:将随请求一起发送的自定义header的名称
  (3)Origin:currentorigin
  预检请求举例:curliXOPTIONSlocalhost:3031apiechoHAccessControlRequestMethod:GETHAccessControlRequestHeaders:ContentType,AcceptHOrigin:http:localhost:3030
  这个例子表示,客户端向服务端询问:我想向从http:localhost:3030向http:localhost:3031apiecho发起一个Get请求,该请求包含ContentType,Acceptheader,是否可以?
  服务器判断后,在响应中包含一些类似AccessControl的header,以指示是否允许随后的请求。这些header有如下几种:
  (1)AccessControlAllowOrigin:表示允许发请求的源,表示允许所有源访问
  (2)AccessControlAllowMethods:允许的HTTPmethods,以逗号分隔
  (3)AccessControlAllowHeaders:允许发送的customheaders,以逗号分隔
  (4)AccessControlMaxAge:preflightrequest预请求响应结果的缓存时长,在这段时长内,再次调用该接口不用进行预请求调用。
  一个preflight请求的Response可能是像下面这样的:HTTP1。1204NoContentAccessControlAllowOrigin:AccessControlAllowMethods:GET,HEAD,PUT,PATCH,POST,DELETEVary:AccessControlRequestHeadersAccessControlAllowHeaders:ContentType,AcceptContentLength:0Date:Fri,05Apr202311:41:08GMTConnection:keepalive
  看到这里,是不是已经明白为什么在浏览器调试工具网络窗口中经常看到发出一次请求,有两条log的原因了吧?
  一次调用显示两条log
  对的,没错就是因为其中一条是预检请求,另外一条才是真实请求。
  后端跨域的实现添加跨域配置
  后端跨域配置
  添加CorsConfig。java文件,代码如下。importorg。springframework。context。annotation。Configuration;importorg。springframework。web。servlet。config。annotation。CorsRegistry;importorg。springframework。web。servlet。config。annotation。WebMvcConfigurer;ConfigurationpublicclassCorsConfigimplementsWebMvcConfigurer{OverridepublicvoidaddCorsMappings(CorsRegistryregistry){registry。addMapping()WhenallowCredentialsistrue,allowedOriginscannotcontainthespecialvaluesincethatcannotbesetontheAccessControlAllowOriginresponseheader。Toallowcredentialstoasetoforigins,listthemexplicitlyorconsiderusingallowedOriginPatternsinstead。。allowedOrigins()。allowedOriginPatterns()。allowedMethods(GET,POST,DELETE)。allowedHeaders()restfulapi是无状态的,无需缓存cookie等信息。allowCredentials(true)AccessControlMaxAgeheader表明预检请求响应的有效时间。在有效时间内,浏览器无须为同一请求再次发起预检请求。请注意,浏览器自身维护了一个最大有效时间,如果该首部字段的值超过了最大有效时间,将不会生效。在预检中,浏览器发送的头中包含有HTTP方法和真实请求中会用到的头。也就是说对于同样的请求,在maxage规定的时间内就不用再次通过预检了,就可以直接请求了,单位s。maxAge(1800);}}跨域调用
  支持跨域之后,我们再分别用httpie和浏览器来调用echo接口看看有什变化。
  跨域前后httpie调用结果对比
  跨域前后chrome调用结果对比
  从上面实践可以看到,支持跨域后,浏览器能成功调用echo接口了。
  预检请求(PreflightRequest)实战
  最后我们再来增加一个delete接口,来亲自见识一下预检请求。
  从上面的解释,我们知道预检请求不能是GET,POST这种请求,而我们已有的echo接口是一个POST请求,所以需要新增一个符合条件的接口,这里我们增加一个HTTPDELETE接口来演示。
  增加delete接口添加接口
  增加一个新的Controller,并添加delete接口,采用DeleteMapping表示使用HTTPDELETE方法来请求。importcom。example。springdemo。dto。ProductQueryDto;importcom。example。springdemo。model。Result;importorg。springframework。web。bind。annotation。;RestControllerRequestMapping(apiproduct)publicclassProductController{DeleteMapping(delete)publicResultStringdelete(RequestBodyProductQueryDtoparam){System。out。printf(〔product〕〔del〕s,param。getId());ResultStringresnewResult();returnres。setData(param。getId());}}
  增加ProductQueryDto,用于接口传参。这里大家先不用去管什么是DTO,什么是Model,后面的分享会逐一说明的。importlombok。Getter;importlombok。Setter;GetterSetterpublicclassProductQueryDto{privateStringid;}添加调用delete接口的JavaScript代码buttononclickcallDeleteProduct()callapiproductdeletebutton运行并调用delete接口
  一次调用,有两条log
  点击这两条数据,查看两次调用的请求头和请求响应,对比如下图:
  预检请求和真正请求的对比
  小结,今天掌握了浏览器的同源策略SOP,实现跨域访问CORS的方法,学习了预检请求PreflightRequest和SimpleRequest,自己定义了一个符合需要PreflightRequest的接口,通过代码亲自做了实践。

iPhone15Ultra最新爆料,极限拉扯,果粉惊呆了一直以来,苹果iPhone都堪称智能机标杆,凭借高颜值外观,流畅的IOS系统,积累了庞大的用户群,虽然安卓手机厂商极力追赶,但从用户体验来看,还有很大差距。从iPhone销量也……商丘古城,厚重归德我在一个阳光明媚,冬日暖阳四射的日子,走进了商丘,走进了这片深沉的土地,真实地领略俯拾皆是的人文历史,厚重文化。用心灵去触摸中原历史的厚重,用眼睛去凝视豫东沃土的生机。古……羊了个羊狂赚10个亿?别扯了那个魔性游戏《羊了个羊》又双叒叕上热搜了!这次的热搜是羊了个羊背后公司现清仓式分红。图片来源:微博热搜榜有关媒体的表述是这样的:图片来源:爱企查乍……我的这十年吕建英教师的幸福幸福,一个多么美好的字眼,每一个人都在拼命地获取幸福。但是幸福是什么?不同的人有不同的回答。商人说:堆积如山的金子是我的幸福。政客说:至高无上的权利是我的幸福。教师说:实现孩子……1199元起!荣耀畅玩40Plus明日开售整天追剧无压力【手机中国新闻】荣耀旗下产品线划分为Magic系列、数字系列、X系列三大主线,畅玩系列手机将专门针对线上市常10月20日,荣耀发布畅玩40Plus新机,售价1199元起,将于1……60年,中尼因珠峰归属权陷入僵局,被毛主席一招化解主权问题从来不是一个可以讨论的问题,我国外交上一直信奉这样的一句话,那么,对于主权,我国可以认真到什么程度呢?上个世纪六十年代,珠穆朗玛峰的主权归属问题,我们就可以看出端倪。……北斗系统每日定位量破1000亿次,导航比美国GPS更精准,达想想如果导航系统不完善,智能手机没有普及,我们过去外出的时候是有多不方便!需要认得很多路口,或者在路口放慢车速仔细辨认方向,可就算如此,我们还是总会走错路口,在路上浪费很多时间……秋初食梨正当时养生之道现代医学认为,梨对高血压、心脏病、便秘、头昏、失眠多梦等病症,有良好的辅助治疗作用。同时,对肝炎、肝硬化患者来说,更是良好的保健食品。夏末秋初多吃梨适合于气管炎患……美妆类直播文案训练四欢迎进入直播间的姐妹们,我是某某,我是一个有多年经验的资深影视工作者,本职工作呢,是在影视公司上班,在直播上是一个小白,开直播呢,主要的原因就是,平时经常会有朋友找我分享一些美……杀疯了!一个网站搞定全网学习资源平时大家都是怎么找资源的,靠百度?那你可就OUT了!〔机智〕今天给大家介绍一个堪称良心宝藏〔灵光一闪〕的聚合资源搜索引擎,这里有取之不尽的学习资源奈斯搜索想学什么直……贵州牛人发明智能钓鱼机器,鱼上钩自动起竿,获无数钓友称赞我国贵州有位牛人叫周全斌,他发明了一台智能钓鱼机器,鱼咬钩时会发出警报自动起竿,即使离开钓位也不用担心鱼脱钩逃跑,非常适合野钓,就连清华教授也对他的发明赞叹不已。那么,这……博格巴无缘世界杯,楚阿梅尼会是德尚的救命稻草吗?对于保罗博格巴来说,参加世界杯的最后一丝希望被一次普通的拉伸被扼杀了,一种残酷的疼痛痉挛着刺入他的腿部,使得他的世界杯之梦彻底破碎。等待他的是另一个令人恼火的休养期,而且……
王者变青铜是谁把5G消息干成没消息说到5G,相信现在大家都一定不再陌生了。随着三大运营商5G建设的发展,如今5G的网络覆盖越来越广,身边用上5G的人也越来越多了。而市面上销售的智能手机也基本都是已5G手机……关于警惕0。001USDT转账新型同尾地址诈骗近期币圈上出现一种通过转账诱导诈骗的新型手法,若您的账户最近有收到过莫名的0、0。01、0。001等数额的充值,请您务必需要加强警惕,保护好个人资产安全。诈骗流程:骗子通……大S幸福肥来得太猛!婚后首次露面穿T恤聚会不修边幅,大肚腩抢气温逐渐在上升当中,女性穿衣也开始变得越来越单薄,作为生活中的必备单品,T恤可以说扮演了一个很好的角色,先不说T恤时尚与否,至少在耐穿程度上,T恤还是很不错的,经典百搭还不会出……浪姐正式改名乘风破浪,曝李玟签约加盟,王心凌已在备战3月13日,《乘风破浪的姐姐》正式改名《乘风破浪》,并同时开启了大众评审的报名方式,也就是说第三季真的来了!关于改名原因,网友认为可能跟相关调整有关,虽然没有了姐姐略显遗……暗悄悄,我们的地球又长了一岁一本新的科普书,给你最好的新年礼文章转载自科学人文在线地球是演化的,它有生命,它经历了出生、成长和成熟的过程;岩石就像骨骼和肌肉,组成和支撑了地球的格架和躯体;地层就像史书,能告诉我们地球的生长和演化历……68岁赵雅芝分享以油养肤,适合二三十岁的女人,看看不亏以油养肤这个方法最近这几年是真的火!这样火热的方法说实话我也试过而且效果还是蛮好的呢今天就跟着赵雅芝说的方法来给你们分享一下1、热敷打开毛孔毛孔打开之后……爆大冷!张本智和30近段时间,日乒联赛正在进行中,最新一场对决是东京俱乐部VS冈山俱乐部。由于两支球队的当家球星分别是日乒天才张本智和与前国乒老将郝帅,这场比赛也吸引了很多国内乒乓球爱好者的关注。……最上镜小姐韦唯复出,献唱北京冬奥会,58岁近照气质犹存不减当近日,女歌手、作曲人、国家一级演员韦唯引发关注。关于韦唯时隔八年复出献唱北京冬奥会更是登上了各大热搜榜。对于韦唯的复出,可以说超乎了太多人的预期,不少粉丝也是直呼难以置信八年后……李小冉夫妇走机场,她穿卫衣配白帽好显嫩,老公背包拿衣服像助理在秋冬这样的季节里,总有一些单品是我们百搭不厌的存在,它们不仅好驾驭好搭配,而且还很容易塑造出各种各样的风格。最近天气也逐渐变暖了起来,所以像卫衣这种单品就到了大展身手的时刻了……真实!哈登通过体检,2换5交易达成,大胡子取关篮网队,关注费北京时间2月13日消息,据NBA名记报道,篮网队和费城的2换5大交易已经正式完成,哈登和米尔萨普成为费城一员,而西蒙斯和小库里、德拉蒙德等待为篮网队出战。今天,篮网队和费……央视名嘴拷问韩聪隋文静会不会在一起?文静反问韩聪单不单身冬奥会花滑双人滑冠军韩聪隋文静,受到了冰雪迷们的喜爱,一个大大咧咧,一个成熟稳重,两个人在场上实力不俗,在场下也非常幽默风趣,很多人最关心的是两个人会不会在一起?01央视……长征八号火箭发射,酷狗让我们的歌声上太空文羊城晚报全媒体记者沈钊图受访者提供普通人的歌声,也能被太空听见!2022年2月27日11时6分,长征八号遥二运载火箭在中国文昌航天发射场成功发射,并以1箭2……
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网