日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

AJAX跨域访问(不同域之间相互访问)

發布時間:2024/1/1 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AJAX跨域访问(不同域之间相互访问) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 一、跨域:
  • 二、同源策略:
  • 三、解決Ajax跨域問題的方案:
    • 方案一:設置響應頭
    • 方案二:jsonp
    • 方案三:jQuery封裝jsonp
    • 方案四:代理機制(httpclient)
    • 方案五:nginx反向代理

一、跨域:

  • 跨域是指從一個域名的網頁去請求另一個域名的資源。比如從百度(https://baidu.com)頁面去請求京東(https://www.jd.com)的資源。
  • 通過超鏈接或者form表單提交或者超鏈接的方式進行跨域是不存在問題的。但在一個域名的網頁中的一段js代碼發送ajax請求去訪問另一個域名中的資源,由于同源策略的存在導致無法跨域訪問,那么ajax就存在這種跨域問題。
  • 有一些情況下,我們是需要使用ajax進行跨域訪問的。比如某公司的A頁面(8080:a.bjpowernode.com)有可能需要獲取B頁面(8081:b.bjpowernode.com)。

二、同源策略:

  • 同源策略是指一段腳本只能讀取來自同一來源的窗口和文檔的屬性同源就是協議(http)、域名(localhost)和端口(8080)都相同
  • Ajax無法跨域:http://localhost:8080/這個域名中的文件不能訪問http://localhost:8081/這個域名中的內容。但是form表單和超鏈接可以。
  • 同源策略有什么用?如果你剛剛在網銀輸入賬號密碼,查看了自己還有1萬塊錢,緊接著訪問一些非法的網站,這個網站可以訪問剛剛的網銀站點,并且獲取賬號密碼,那后果可想而知。所以,從安全的角度來講,同源策略是有利于保護網站信息的

三、解決Ajax跨域問題的方案:

方案一:設置響應頭

在被訪問的servlet中加入下述代碼表示允許該域名訪問我(該servlet)。

response.setHeader("Access-Control-Allow-Origin", "http://localhost:8080"); // 允許某個域名訪問我response.setHeader("Access-Control-Allow-Origin", "*"); // 允許所有域名訪問我

方案二:jsonp

  • jsonp:json with padding(帶填充的json)
  • jsonp不是ajax請求,但是可以完成局部刷新的效果,并且可以解決跨域問題。
  • 注意:jsonp解決跨域的時候,只支持GET請求。不支持post請求。
  • 原理:script標簽的src屬性值可以是URL,作用是訪問某個servlet,后端servlet響應該請求并返回一個字符串到標簽中,瀏覽器接收到這個字符串后,會自動將字符串當做JS代碼執行。
    如果后端響應的字符串是一段JS代碼的字符串,那么就能實現JS的一系列操作,例如使用innerHTML方法動態生成標簽的值、調用前端創建的函數等,類似ajax異步刷新。
  • 例子:用戶點擊按鈕后從后端接收數據展示到前端。這里后端接收的數據是一個前端早已寫好的函數。
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>jsonp跨域問題</title> </head> <body><script type="text/javascript">function dosome(myjson){//這是我們自己寫的函數,一會后端返回的JS代碼是fun(json),然后調用我們這個函數給div標簽內容賦值document.getElementById("mydiv").innerHTML = myjson.name;}window.onload =() => {//箭頭函數document.getElementById("btn").onclick = () =>{//箭頭函數,點擊按鈕創建一個<script>標簽var myscript = document.createElement("script");//創建元素對象myscript.type = "text/javascript";//給對象設置type屬性myscript.src = "http://localhost:8081/a/servlet01?fun=dosome";//給對象設置src屬性,這里要加fun=dosome,這是get屬性向后端傳送數據的方法,目的是告訴后端我們自己寫的函數名,方便后端使用我們前端自己寫的函數document.getElementsByTagName("body")[0].appendChild(myscript);//將script標簽添加到body中}}</script><button id="btn">解決ajax跨域問題</button><div id="mydiv"></div> </body> </html> import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse;import java.io.IOException; @WebServlet("/servlet01") public class Servlets extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html");//獲取前端發送過來的函數名String fun = request.getParameter("fun");response.getWriter().print(fun+"({\"name\":\"zhangsan\"})");//返回的事一個JS代碼:fun(json對象)} }

方案三:jQuery封裝jsonp

  • jQuery中的jsonp其實就是我們方案2的高度封裝,底層原理完全相同。
  • 核心代碼://看似是ajax請求,實際上不是ajax請求。$.ajax({type : "GET",url : "跨域的url",//不需要傳函數名了,函數名默認傳的是&jsonp屬性的值=jsonpCallback屬性的值。dataType : "jsonp", // 指定數據類型,這里是重點!!區分ajax和jsonp的依據jsonp : "fun", // 指定參數名(不設置的時候,默認是:"callback")jsonpCallback : "sayHello" // 這里的函數就是我們自定義的函數// (不設置的時候,jQuery會自動生成一個隨機的回調函數,//并且這個回調函數還會自動調用success的回調函數。所以如果不設置這個屬性則必須設置success屬性)})

方案四:代理機制(httpclient)

  • 我們知道1號服務器不能使用異步ajax直接訪問二號服務器,所以我們可以1號服務器訪問本服務器的servlet,然后本服務器的servlet去訪問2號服務器的servlet。
  • 使用Java程序怎么去發送get/post請求呢?【GET和POST請求就是HTTP請求。】
    • 第一種方案:使用JDK內置的API(java.net.URL…),這些API是可以發送HTTP請求的。
    • 第二種方案:使用第三方的開源組件,比如:apache的httpclient組件。(httpclient組件是開源免費的,可以直接用)
  • 在java程序中,使用httpclient組件可以發送http請求。
    • 對于httpclient組件的代碼,大家目前可以不進行深入的研究,可以從網上直接搜。然后粘貼過來,改一改,看看能不能完成發送get和post請求。
    • 使用httpclient組件,需要先將這個組件相關的jar包引入到項目當中。
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>代理跨域問題</title> </head> <body> <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript">$(function () {$("#btn").click(function () {$.ajax({type : "get",url : "/b/zhuan",async : true,dataType:"json",success : function(json) {$("#mydiv").html(json.name);}})})}) </script> <button id="btn">解決ajax跨域問題</button> <div id="mydiv"></div> </body> </html> import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; @WebServlet("/zhuan") public class Zhongzhuan extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 使用java代碼去發送HTTP get請求// 目標地址//String url = "https://www.baidu.com";String url = "http://localhost:8081/a/servlet02";HttpGet httpGet = new HttpGet(url);// 設置類型 "application/x-www-form-urlencoded" "application/json"httpGet.setHeader("Content-Type", "application/x-www-form-urlencoded");//System.out.println("調用URL: " + httpGet.getURI());// httpClient實例化CloseableHttpClient httpClient = HttpClients.createDefault();// 執行請求并獲取返回HttpResponse response1 = httpClient.execute(httpGet);HttpEntity entity = response1.getEntity();//System.out.println("返回狀態碼:" + response.getStatusLine());// 顯示結果BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8"));String line = null;StringBuffer responseSB = new StringBuffer();while ((line = reader.readLine()) != null) {responseSB.append(line);}response.getWriter().print(responseSB);//System.out.println("服務器響應的數據:" + responseSB);reader.close();httpClient.close();} } import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse;import java.io.IOException; @WebServlet("/servlet02") public class Servlet2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html");response.getWriter().print("{\"name\":\"zhangsan\"}");//返回的事一個JS代碼:fun(json對象)} }

方案五:nginx反向代理

  • nginx反向代理中也是使用了這種代理機制來完成AJAX的跨域,實現起來非常簡單,只要修改一個nginx的配置即可。具體細節老師沒講。

總結

以上是生活随笔為你收集整理的AJAX跨域访问(不同域之间相互访问)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。