java跨域問題的處理(js跨域問題怎麼解決)

本文目錄一覽:

同源策略與跨域問題解決

如果兩個頁面的協議,埠(如果有指定)和域名都相同,則兩個頁面具有相同的 源 。

舉個例子:

下表給出了相對 同源檢測的示例:

由同源策略導致的的AJAX請求失敗

例如:頁面路徑為:

後台介面地址為:

產生的結果:

此即為跨域請求失敗

CORS是一個W3C標準,全稱是”跨域資源共享”(Cross-origin resource sharing)。它允許瀏覽器向跨源伺服器,發出 XMLHttpRequest 請求,從而克服了AJAX只能 同源 使用的限制。

在此之前,需要知道 簡單請求、複雜請求

簡單請求:

某些請求不會觸發 CORS 預檢請求 。本文稱這樣的請求為「簡單請求」,請注意,該術語並不屬於 Fetch (其中定義了 CORS)規範。若請求滿足所有下述條件,則該請求可視為「簡單請求」:

複雜請求:

與前述簡單請求不同,「需預檢的請求」要求必須首先使用 OPTIONS 方法發起一個預檢請求到伺服器,以獲知伺服器是否允許該實際請求。”預檢請求「的使用,可以避免跨域請求對伺服器的用戶數據產生未預期的影響。當請求滿足下述任一條件時,即應首先發送預檢請求:

若需要跨域,則需要在請求頭裡添加 Origin 欄位

請求至後台若符合後台請求規則則可成功請求,並且後台會返回相應的規則

當請求為複雜請求時,瀏覽器會在請求前先發送一個 OPTIONS 請求

OPTIONS 是一個預檢請求,與簡單請求不同的是它會額外攜帶兩個參數: Access-Control-Request-Method :該次請求的請求方式 Access-Control-Request-Headers :該次請求的自定義請求頭欄位

OPTIONS 發送至後台若後台成功響應,則繼續發送複雜請求,若響應失敗則不會發送複雜請求

繼續發送複雜請求

(1)、OPTIONS不會攜帶body若後台方法上使用@RequestBody註解,則會報錯:

例如:

此時需要在@RequestBody後添加參數required=false,允許body為空

即可解決該問題

(2)、OPTIONS請求不應被過多的發送,因為它也是一個http請求也會佔用一部分資源,相應的一種解決方法

在響應中添加緩存欄位,以減少OPTIONS請求

(1)、在Java web工程中加如下列過濾器即可

(2)、在nginx中配置

使用反向代理工具解決跨域問題:如 Nginx 、 node.js

以Nginx為例:

在Nginx的配置文件中加入:

啟動Nginx再以

地址訪問頁面

訪問後台介面

發現可正常請求

上述以

地址訪問頁面

訪問後台介面

的方式遵循了,瀏覽器的同源策略自然不存在跨域

Nginx代理了頁面請求和介面請求,所以頁面請求和介面請求都在Nginx源內由Nginx去完成頁面請求和介面的請求即: 內

所以瀏覽器訪問頁面和介面都是以 來進行訪問的,滿足了同源策略自然不存在跨域之說

圖解:

跨域:

Nginx代理,滿足同源策略

Nginx反向代理其實是一種欺騙瀏覽器的方法

[1] 瀏覽器同源政策及其規避方法

[2] XMLHttpRequest Level 2 使用指南

[3] 跨域資源共享 CORS 詳解

[4] HTTP訪問控制(CORS)

Ajax 跨域問題及其解決方案

主流的 前後端分離模式 下,當前端調用後台介面時,由於是在非同一個域下的請求,從而會引發 瀏覽器 的自我安全保護機制,最終結果是 介面成功請求並響應 ,但 前端不能正常處理該返回數據 。

因此,當 同時滿足 以下三個條件的情況下,就會出現跨域問題:

想要徹底解決跨域問題,只需要破壞以上三個條件的任一即可:

添加瀏覽器啟動參數: chrome –disable-web-security ,但是極不推薦這種解決方式。

Jsonp,全稱 JSON with Padding ,一種非官方的協議,而是一種約定;前端通過向後台發送 script 類型請求解決跨域,此時介面響應的 application/javascript 類型的數據會作為 callback 函數的參數進行處理。

所以,後台也需要做相應的處理。以 Java 為例,添加如下配置即可:

綜上, jsonp 請求存在以下幾個弊端:

用 Nginx 或 Apache 來代理調用方的請求( 客戶端變更為相對路徑請求,而非絕對路徑 ),此時對於瀏覽器來說,由於請求是同源的,因此就不存在跨域問題。

以 Java 應用為例,添加如下全局配置:

如果只想針對某個類下的介面,或者是某個具體的介面配置允許跨域,只需要在相應的地方添加註解 @CrossOrigin 即可。

如果配置了 nginx 作為代理伺服器,那麼只需要為 nginx 添加支持跨域請求即可:

Q1:瀏覽器在執行跨域請求時,是先執行後判斷,還是先判斷後執行?

A1:都有可能,這需要根據所發送的請求是 簡單請求 還是 非簡單請求 來判斷;如果是非簡單請求,瀏覽器每次在執行真正的請求之前,還會先發送一個 options 請求方式的預檢命令【 可設定緩存時長,取消每次請求都要預檢,提高效率,參考上面的服務端配置 】。關於兩種請求的區分及定義,參考下圖說明:

Q2:如果是允許帶( 被調用方 ) cookie 的跨域請求,此時服務端同樣配置為 Access-Control-Allow-Origin 等於 * ,前端是否還可以請求成功?

A2:不可以,此時要將 Access-Control-Allow-Origin 指定為 調用方 具體的域【 可以先取得調用方的域再動態配置,這樣就不存在多個域請求的限制問題 】,並且添加配置 Access-Control-Allow-Credentials 為 true 。

java跨域怎麼解決

這個問題的回答很多的吧。。

一個是用jsonp的方式

另一種就是在java代碼里介面那裡加上

response.addHeader(“Access-Control-Allow-Origin”, “*”);

response.addHeader(“Access-Control-Allow-Methods”, “GET, POST, PUT, DELETE, OPTIONS”);

response.setHeader(“Access-Control-Allow-Headers”, “x-requested-with”);

java為什麼會有跨域問題

前言

相信大家在寫前端腳本的時候經常會遇到發送數據到後台的情況,但是由於瀏覽器的限制,不同域名之間的數據是不能互相訪問的,那前端怎麼和後端如何進行數據之間的交換呢?

JavaScript由於安全性方面的考慮,不允許頁面跨域調用其他頁面的對象,那麼問題來了,什麼是跨域問題?

答:這是由於瀏覽器同源策略的限制,現在所有支持JavaScript的瀏覽器都使用了這個策略。那麼什麼是同源呢?所謂的同源是指三個方面「相同」:

域名相同

協議相同

埠相同

下面就舉幾個例子來幫助更好的理解同源策略。

URL

說明

是否允許通信

 

   同一域名    允許  

 

   不同域名    不允許  

   同一域名不同埠    不允許  

 

   同一域名不同協議    不允許  

在JAVA中處理跨域問題,通常有以下兩種常用的解決方法。

第一種解決方法

後台代碼在被請求的Servlet中添加Header設置:

response.setHeader(“Access-Control-Allow-Origin”, “*”);

PrintWriter out =null;

try

{

out = response.getWriter();

} catch (IOException e)

{

// TODO Auto-generated catch block

e.printStackTrace();

}

out.print(“{‘status’:’ok’}”);

out.flush();

out.close();

Access-Control-Allow-Origin這個Header在W3C標準里用來檢查該跨域請求是否可以被通過,如果值為*則表明當前頁面可以跨域訪問。默認的情況下是不允許的。

在前端JS中需要向Servlet發出請求,請求代碼如下所示:

$.ajax({

url: “your url”,

type:”get or post”,

dataType:”json”,

data:{

….

},

success:function(data){

}

第二種解決方法

通過jsonp跨域請求的方式。JSONP和JSON雖然只有一個字母的區別,但是他們完全就是兩回事,很多人很容易把他們搞混。JSON是一種數據交換的格式,而JSONP則是一種非官方跨域數據交互協議。

首先來說一下前端JS是怎麼發送請求。代碼如下所示:

$.ajax({

url:”your url”,

type:”get or post”,

async:false,

dataType : “jsonp”,

//服務端用於接收callback調用的function名的參數

jsonp:”callbackparam”,

//callback的function名稱

jsonpCallback:”success_jsonpCallback”,

success:function(data){

console.log(data);

},

error:function(data){

console.log(data);

}

});

這裡的callbackparam和success_jsonpCallback可以理解為發送的data數據的鍵值對,可以自定義,但是callbackparam需要和後台約定好參數名稱,因為後台需要獲取到這個參數裡面的值(即success_jsonpCallback)。

下面,最重要的來了,後台怎麼樣獲取和返回數據呢。代碼如下所示:

PrintWriter out =null;

String callback=req.getParameter(“callbackparam”);

String json=callback+”({‘status’:’ok’})”;

try

{

out = resp.getWriter();

} catch (IOException e)

{

// TODO Auto-generated catch block

e.printStackTrace();

}

out.print(json);

out.flush();

out.close();

首先需要獲取參數名為callbackparam的值,這裡獲取到的值就是「success_jsonpCallback」。然後將這個值加上一對小括弧。小括弧里放入你需要返回的數據內容,比如這裡我返回一個JSON對象。當然你也可以返回其他對象,比如只返回一個字元串類型數據也可以。最後前端JS返回的數據就是這樣的:

success_jsonpCallback({‘status’:’ok’})

瀏覽器會自動解析為json對象,這時候你只需要在success回調函數中直接用data.status就可以了。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/283121.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-22 08:07
下一篇 2024-12-22 08:07

相關推薦

  • JS Proxy(array)用法介紹

    JS Proxy(array)可以說是ES6中非常重要的一個特性,它可以代理一個數組,監聽數據變化並進行攔截、處理。在實際開發中,使用Proxy(array)可以方便地實現數據的監…

    編程 2025-04-29
  • Python官網中文版:解決你的編程問題

    Python是一種高級編程語言,它可以用於Web開發、科學計算、人工智慧等領域。Python官網中文版提供了全面的資源和教程,可以幫助你入門學習和進一步提高編程技能。 一、Pyth…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java Bean載入過程

    Java Bean載入過程涉及到類載入器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean載入的過程。 一、類載入器 類載入器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • 如何解決WPS保存提示會導致宏不可用的問題

    如果您使用過WPS,可能會碰到在保存的時候提示「文件中含有宏,保存將導致宏不可用」的問題。這個問題是因為WPS在默認情況下不允許保存帶有宏的文件,為了解決這個問題,本篇文章將從多個…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字元串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字元串中是否存在多個指定字元: 一、字元串遍歷 字元串是Java編程中非常重要的一種數據類型。要判斷字元串中是否存在多個指定字元…

    編程 2025-04-29

發表回復

登錄後才能評論