电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

基于SpringBoot解決CORS跨域的問題(@CrossOrigin)

瀏覽:12日期:2023-03-26 11:02:06
一、關(guān)于跨域介紹

在前后分離的架構(gòu)下,跨域問題難免會遇見比如,站點 http://domain-a.com 的某 HTML 頁面通過 的 src 請求 http://domain-b.com/image.jpg。

網(wǎng)絡(luò)上的許多頁面都會加載來自不同域的CSS樣式表,圖像和腳本等資源。

出于安全原因,瀏覽器限制從腳本內(nèi)發(fā)起的跨源HTTP請求。

例如,XMLHttpRequest和Fetch API遵循同源策略。

這意味著使用這些API的Web應(yīng)用程序只能從加載應(yīng)用程序的同一個域請求HTTP資源,除非使用CORS頭文件。

跨域的體現(xiàn),在于它的域名不同或者端口不同,但要注意以下的形式為非跨域模式

http://www.example.com/index.html ==> http://www.example.com/login.html

二、Spring Boot跨域(@CrossOrigin)

當然這里雖然指SpringBoot但是SpringMVC也是一樣的,要求在Spring4.2及以上的版本

1、@CrossOrigin使用場景要求

jdk1.8+

Spring4.2+

2、@CrossOrigin源碼解析(翻譯參考網(wǎng)絡(luò),文末列出參考地址)

@Target({ ElementType.METHOD, ElementType.TYPE })@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface CrossOrigin { String[] DEFAULT_ORIGINS = { '*' }; String[] DEFAULT_ALLOWED_HEADERS = { '*' }; boolean DEFAULT_ALLOW_CREDENTIALS = true; long DEFAULT_MAX_AGE = 1800; /** * 同origins屬性一樣 */ @AliasFor('origins') String[] value() default {}; /** * 所有支持域的集合,例如'http://domain1.com'。 * <p>這些值都顯示在請求頭中的Access-Control-Allow-Origin * '*'代表所有域的請求都支持 * <p>如果沒有定義,所有請求的域都支持 * @see #value */ @AliasFor('value') String[] origins() default {}; /** * 允許請求頭重的header,默認都支持 */ String[] allowedHeaders() default {}; /** * 響應(yīng)頭中允許訪問的header,默認為空 */ String[] exposedHeaders() default {}; /** * 請求支持的方法,例如'{RequestMethod.GET, RequestMethod.POST}'}。 * 默認支持RequestMapping中設(shè)置的方法 */ RequestMethod[] methods() default {}; /** * 是否允許cookie隨請求發(fā)送,使用時必須指定具體的域 */ String allowCredentials() default ''; /** * 預(yù)請求的結(jié)果的有效期,默認30分鐘 */ long maxAge() default -1;}3、@CrossOrigin使用

Spring Boot下的請求處理控制器

package com.example.demo.controller;import com.example.demo.domain.User;import com.example.demo.service.IUserFind;import org.springframework.web.bind.annotation.CrossOrigin;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;/** * @Title: UserController * @ProjectName demo * @Description: 請求處理控制器 * @author 淺然 * @date 2018/7/2022:18**/@RestController//實現(xiàn)跨域注解//origin='*'代表所有域名都可訪問//maxAge飛行前響應(yīng)的緩存持續(xù)時間的最大年齡,簡單來說就是Cookie的有效期 單位為秒//若maxAge是負數(shù),則代表為臨時Cookie,不會被持久化,Cookie信息保存在瀏覽器內(nèi)存中,瀏覽器關(guān)閉Cookie就消失@CrossOrigin(origins = '*',maxAge = 3600)public class UserController { @Resource private IUserFind userFind; @GetMapping('finduser') public User finduser(@RequestParam(value='id') Integer id){ //此處省略相應(yīng)代碼 }}

后臺返回的數(shù)據(jù)

基于SpringBoot解決CORS跨域的問題(@CrossOrigin)

前端跨域請求

<!DOCTYPE html><html> <head> <meta charset='utf-8' /> <title>demo</title> <script type='text/javascript' src='http://www.hdgsjgj.cn/bcjs/js/jquery-3.3.1.min.js' ></script> </head> <body> <input type='button' value='測試' onclick='ajaxloding()' /> <div id='usermessage'></div> <script> var getdata=0; function ajaxloding(){ $.ajax({ async:false, type:'get', url:'http://localhost:8080/api/finduser?id=1', contentType: 'application/x-www-form-urlencoded', dataType: 'json', data: {}, success:function(result){ getdata=result.name }, error: function (errorMsg) {//請求失敗時執(zhí)行該函數(shù)alert('請求數(shù)據(jù)失敗!'); } }); $('#usermessage').text(getdata) } </script> </body></html>

這樣就解決了跨域問題,獲取了后臺的數(shù)據(jù)

基于SpringBoot解決CORS跨域的問題(@CrossOrigin)

參考

跨域 HTTP 請求

補充:springboot的@CrossOrigin('*')跨域仍然失效

項目中偶爾遇到即使加了@CrossOrigin跨域失敗:

第一次遇到時間有限沒解決:前端直接添加跨域處理。

jQuery.support.cors = true;

后續(xù)第二次遇到該問題,作為后端不能讓前端解決跨域問題。

debug詳細查找原因:發(fā)現(xiàn)在自定義攔截器返回失敗,跨域失敗。

明白該問題:需要以下知識。

(mvc攔截器的鏈路模式)

(Cors攔截器加載)

(自定義的攔截器加載)

(攔截器的加載順序)

因為攔截器是鏈路模式:CrossOrigin也是攔截器在自定義攔截器之后。所以在自定義攔截器失敗后,處理

跨域的攔截器未處理,造成跨域失敗。

解決該問題的辦法:

添加filter ,因為Filter優(yōu)先于攔截器執(zhí)行,所以自己創(chuàng)建的攔截器不會影響跨域處理。

@Configurationpublic class CorsConfig { @Bean public CorsFilter corsFilter() { CorsConfiguration config = new CorsConfiguration(); config.addAllowedOrigin('*'); config.setAllowCredentials(true); config.addAllowedMethod('*'); config.addAllowedHeader('*'); UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource(); configSource.registerCorsConfiguration('/**', config); return new CorsFilter(configSource); }}

二:springboot升級到2.2.0,在新版本的springmvc中,把cors攔截添加到了攔截器的第一位,所以不會有該問題。

如果允許可以直接升級springboot或mvc版本。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。如有錯誤或未考慮完全的地方,望不吝賜教。

標簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 天然鹅卵石滤料厂家-锰砂滤料-石英砂滤料-巩义东枫净水 | HV全空气系统_杭州暖通公司—杭州斯培尔冷暖设备有限公司 | 锤式粉碎机,医药粉碎机,锥式粉碎机-无锡市迪麦森机械制造有限公司 | 辐射色度计-字符亮度测试-反射式膜厚仪-苏州瑞格谱光电科技有限公司 | 【MBA备考网】-2024年工商管理硕士MBA院校/报考条件/培训/考试科目/提前面试/考试/学费-MBA备考网 | 郑州巴特熔体泵有限公司专业的熔体泵,熔体齿轮泵与换网器生产厂家 | 减速机电机一体机_带电机减速器一套_德国BOSERL电动机与减速箱生产厂家 | 武汉画册印刷厂家-企业画册印刷-画册设计印刷制作-宣传画册印刷公司 - 武汉泽雅印刷厂 | 上海办公室设计_办公楼,写字楼装修_办公室装修公司-匠御设计 | 企小优-企业数字化转型服务商_网络推广_网络推广公司 | 非甲烷总烃分析仪|环控百科| 企业彩铃制作_移动、联通、电信集团彩铃上传开通_彩铃定制_商务彩铃管理平台-集团彩铃网 | 北京亦庄厂房出租_经开区产业园招商信息平台 | 上海APP开发-APP制作-APP定制开发-上海APP开发制作公司-咏熠科技 | 一点车讯-汽车网站,每天一点最新车讯! | 氧化铁红厂家-淄博宗昂化工 | 回转支承-转盘轴承-回转驱动生产厂家-洛阳隆达轴承有限公司 | 冻干机(冷冻干燥机)_小型|实验型|食品真空冷冻干燥机-松源 | 重庆监控_电子围栏设备安装公司_门禁停车场管理系统-劲浪科技公司 | 工业冷却塔维修厂家_方形不锈钢工业凉水塔维修改造方案-广东康明节能空调有限公司 | 磁力加热搅拌器-多工位|大功率|数显恒温磁力搅拌器-司乐仪器官网 | 小威小说网 - 新小威小说网 - 小威小说网小说搜索引擎 | 钢绞线万能材料试验机-全自动恒应力两用机-混凝土恒应力压力试验机-北京科达京威科技发展有限公司 | 荣事达手推洗地机_洗地机厂家_驾驶式扫地机_工业清洁设备 | 济南展厅设计施工_数字化展厅策划设计施工公司_山东锐尚文化传播有限公司 | 包装机_厂家_价格-山东包装机有限公司 | 100_150_200_250_300_350_400公斤压力空气压缩机-舰艇航天配套厂家 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | 沉降天平_沉降粒度仪_液体比重仪-上海方瑞仪器有限公司 | 灌装封尾机_胶水灌装机_软管灌装封尾机_无锡和博自动化机械制造有限公司 | 液氮罐(生物液氮罐)百科-无锡爱思科 | 丁基胶边来料加工,医用活塞边角料加工,异戊二烯橡胶边来料加工-河北盛唐橡胶制品有限公司 | 伸缩节_伸缩器_传力接头_伸缩接头_巩义市联通管道厂 | 深圳VI设计-画册设计-LOGO设计-包装设计-品牌策划公司-[智睿画册设计公司] | 数字展示在线_数字展示行业门户网站 | 泰来华顿液氮罐,美国MVE液氮罐,自增压液氮罐,定制液氮生物容器,进口杜瓦瓶-上海京灿精密机械有限公司 | 旋振筛|圆形摇摆筛|直线振动筛|滚筒筛|压榨机|河南天众机械设备有限公司 | 分子精馏/精馏设备生产厂家-分子蒸馏工艺实验-新诺舜尧(天津)化工设备有限公司 | 半容积式换热器_北京浮动盘管换热器厂家|北京亿丰上达 | 平面钻,法兰钻,三维钻-山东兴田阳光智能装备股份有限公司 | 吉林污水处理公司,长春工业污水处理设备,净水设备-长春易洁环保科技有限公司 |