国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

vue+springboot實現項目的CORS跨域請求

2019-11-19 13:01:26
字體:
來源:轉載
供稿:網友

跨域資源共享CORS(Cross-origin Resource Sharing),是W3C的一個標準,允許瀏覽器向跨源的服務器發起XMLHttpRequest請求,克服ajax請求只能同源使用的限制。關于CORS的詳細解讀,可參考阮一峰大神的博客:跨域資源共享CORS詳解。本文為通過一個小demo對該博客中分析內容的一些驗證。

1.springboot+vue項目的構建和啟動

細節不在此贅述,任何簡單的springboot項目就可以,而前端vue項目只需用axios發ajax請求即可。

我的demo里填寫用戶名和密碼,然后點擊登錄按鈕向后臺發起登錄請求,js代碼如下:

methods:{     login:function() {      //var userParams = this.$qs.stringify(this.User);       /* var userParams = JSON.stringify(this.User);*/       this.$axios.post("http://localhost:8080/login",this.User).then(res=>{       alert(res.data);      });     }   }

后臺控制器部分,對登錄請求的處理:

/*CORS設置方法1:@CrossOrigin(origins = "http://localhost:8081", maxAge = 3600)*/  @RequestMapping(value="/login",method = RequestMethod.POST, produces = "application/json;charset=UTF-8" )  @ResponseBody  public String userlogin(@RequestBody JSONObject user) {		/*String name=request.getParameter("name");		String password=request.getParameter("password");*/		System.out.println("name: " + user.get("name"));		System.out.println("password: " + user.get("password"));		String name = (String) user.get("name");		String password = (String) user.get("password");  	if(name.equals("zsz") && password.equals("888888")){ 					return "login success!";		}else{			return "login failed";		}  }

后臺以8080端口啟動,前臺以8081啟動,此時無法跨域,瀏覽器控制臺會報錯:


2.springboot設置CORS

此處主要有兩種方法(但是貌似有其他博客還有更多種),在springboot中實現都比較簡單(反正springboot好像就是各種省事各種簡單)。

方法1:

@CrossOrigin(origins = "http://localhost:8081", maxAge = 3600)

直接在控制器方法前注解,設置可以跨域的源ip和端口,以及預檢有效期maxAge等參數。

方法2:

編寫配置類,配置全局的CORS設置。

@Configurationpublic class MyCorsConfig {		@Bean	public WebMvcConfigurer corsConfigurer(){	 return new WebMvcConfigurerAdapter() {      @Override      public void addCorsMappings(CorsRegistry registry) {        // 限制了路徑和域名的訪問        /*registry.addMapping("/api*").allowedOrigins("http://localhost:8081");*/       registry.addMapping("/**")        .allowedOrigins(ALL)        .allowedMethods(ALL)        .allowedHeaders(ALL)        .allowCredentials(true);      }    };	}		}

如果路徑配置成以上的 /**則對所有源路徑均接受跨域訪問,當然也可以配置更詳細的路徑。

這樣可以成功訪問后臺,瀏覽器中可以看到http請求和響應的結果如下圖:


3.CORS非簡單請求預檢請求的抓包驗證

根據阮一峰大神的博客所述,CORS簡單請求只發送一次請求,服務器設置支持CORS則會在響應內容中添加Acess-Control-Allow-Origin等字段,否則不添加,瀏覽器知道出錯,從而拋出異常;CORS非簡單請求時,會先進行一次預檢(preflight)請求,瀏覽器根據響應內容進行正式的XMLHttpRequest請求。

在我的demo中,我通過將http請求的 content-type 設置為application/json進行非簡單請求。此處要說明一下,axios默認情況下發送請求的格式是application/json而不是我之前用jQuery發送ajax請求的application/x-www-form-urlencoded, 而我之前用的另一種方法構造查詢字符串,最終發送請求的content-type會變為application/x-www-form-urlencoded。

var userParams = this.$qs.stringify(this.User)

前臺請求代碼如本文第一節中所示,在axios請求中直接傳入User對象即可。在后端不設置CORS的時候,控制器信息為:


協議內容為:


而設置了CORS,預檢請求結果為:

請求成功,并且在響應頭中添加了各種字段。

再次發起XHR請求后,結果為:


以上實驗驗證證明了兩種CORS請求的過程正如預期。希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 彭泽县| 屏东县| 亳州市| 吴堡县| 临汾市| 邯郸县| 洛阳市| 饶河县| 河北省| 淮南市| 微山县| 博乐市| 高碑店市| 灵璧县| 抚松县| 涞水县| 桃园市| 潼关县| 桃江县| 锦州市| 尚志市| 蒲江县| 新干县| 庐江县| 海丰县| 康乐县| 长白| 黑水县| 白沙| 高州市| 赫章县| 金阳县| 清流县| 林甸县| 银川市| 中方县| 诸暨市| 林周县| 南开区| 大理市| 苗栗市|