日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

AJAX跨域問題解決方案詳解

瀏覽:312日期:2022-06-12 09:04:53
目錄
  • 1.前言
  • 2.解決方案
    • 2.1 設置響應頭
    • 2.2 jsonp
      • 2.2.1 前端代碼
      • 2.2.2 后端代碼
    • 2.3 使用jQuery封裝的jsonp
      • 2.4 代理機制(httpclient)
        • 2.4.1 前端代碼
        • 2.4.2 代理Servlet代碼
        • 2.4.3 目標Servlet代碼
        • 2.4.4 圖示
      • 2.5 nginx反向代理

      1.前言

      跨域簡單的說,就是從一個域名的網頁去訪問另一個域名網頁的資源。

      通過超鏈接或者form表單提交或者window.location.href的方式進行跨域是不存在問題的。但在一個域名的網頁中的一段js代碼發送ajax請求去訪問另一個域名中的資源,由于同源策略的存在導致無法跨域訪問,那么ajax就存在這種跨域問題。

      關于同源問題,我們判斷同源從三個要素著手:協議、域名、端口號。

      如果協議一致,域名一致,端口號一致,三個要素都一致,才是同源,其它一律都是不同源

      接下來我們來談談ajax中存在的跨域問題如何解決。

      2.解決方案

      下面例子都是部署在兩個服務器上,html代碼是a服務器上的內容,servlet是b服務器上的內容。

      2.1 設置響應頭

      這個比較簡單,只需要在跨域訪問資源的Servlet中添加代碼:

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

      2.2 jsonp

      jsonp是一種類AJAX的請求機制,同樣可以完成局部刷新的效果。但是jsonp只支持GET請求方式。

      2.2.1 前端代碼

      <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>jsonp跨域</title></head><body><!-- 下面一行的代碼效果是和下面22-28行的代碼一樣的 --><!--<script type="text/javascript" src="http://localhost:8081/b/jsonp2?fun=sayHello"></script>--><script type="text/javascript">  // data是一個json:{"username" : "lucy"}  function sayHello(data){     document.getElementById("mydiv").innerHTML = data.username  }  window.onload = () => {    document.getElementById("btn").onclick = () => {      // 加載script元素      // 創建script元素對象      const htmlScriptElement = document.createElement("script");      // 設置script的type屬性      htmlScriptElement.type = "text/javascript"      // 設置script的src屬性      htmlScriptElement.src = "http://localhost:8081/b/jsonp2?fun=sayHello"      // 將script對象添加到body標簽中(這一步就是加載script)      document.getElementsByTagName("body")[0].appendChild(htmlScriptElement)    }  }</script><button id="btn">jsonp解決跨域問題,達到ajax局部刷新的效果</button><div id="mydiv"></div></body></html>

      2.2.2 后端代碼

      package com.bjpowernode.b.web.servlet;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("/jsonp2")public class JSONPServlet2 extends HttpServlet {    @Override    protected void doGet(HttpServletRequest request, HttpServletResponse response)    throws ServletException, IOException {// 獲取函數名String fun = request.getParameter("fun");// 響應一段js代碼response.getWriter().print(fun + "({\"username\" : \"lucy\"})");    }}

      2.3 使用jQuery封裝的jsonp

      jQuery中的jsonp其實就是我們上面代碼的高度封裝,底層原理完全相同。

      核心代碼:

      $.ajax({    type : "GET",    url : "跨域的url",    dataType : "jsonp", // 指定數據類型    jsonp : "fun", // 指定參數名(不設置的時候,默認是:"callback")    jsonpCallback : "sayHello" // 指定回調函數的名字							   // (不設置的時候,jQuery會自動生成一個隨機的回調函數,    						   //并且這個回調函數還會自動調用success的回調函數。)})

      后端代碼同上。

      2.4 代理機制(httpclient)

      使用Java程序發送get/post請求這里有兩種方案:

      • 第一種方案:使用JDK內置的API(java.net.URL…),這些API是可以發送HTTP請求的。
      • 第二種方案:使用第三方的開源組件,比如:apache的httpclient組件。(httpclient組件是開源免費的,可以直接用)

      這里我們說第二種方案。

      2.4.1 前端代碼

      <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>使用代理機制完成ajax跨域訪問</title></head><body><script type="text/javascript">    // ES6當中的有一個新語法:箭頭函數。    window.onload = () => {document.getElementById("btn").onclick = () => {    // 發送ajax請求    // 1.創建核心對象    const xmlHttpRequest = new XMLHttpRequest(); // const可以聲明變量。(可以自己研究一下:var let const聲明變量時有什么區別)    // 2.注冊回調函數    xmlHttpRequest.onreadystatechange = () => {if (xmlHttpRequest.readyState == 4) {    // 這里也可以使用區間的方式,因為狀態碼是200~299都是正常響應結束。    if (xmlHttpRequest.status >= 200 && xmlHttpRequest.status < 300) {document.getElementById("mydiv").innerHTML = xmlHttpRequest.responseText    }}    }    // 3.開啟通道    xmlHttpRequest.open("GET", "/a/proxy", true)    // 4.發送請求    xmlHttpRequest.send()}    }</script><button id="btn">使用代理機制解決ajax跨域訪問</button><div id="mydiv"></div></body></html>

      2.4.2 代理Servlet代碼

      這一部分的代碼基本上都是模板套用,改改具體參數就好了。

      package com.bjpowernode.javaweb.servlet;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.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClients;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;@WebServlet("/proxy")public class ProxyServlet extends HttpServlet {    @Override    protected void doGet(HttpServletRequest request, HttpServletResponse response)    throws ServletException, IOException {// 通過httpclient組件,發送HTTP GET請求,訪問 TargetServletHttpGet httpGet = new HttpGet("http://localhost:8081/b/target");httpGet.setHeader("Content-Type", "application/x-www-form-urlencoded");CloseableHttpClient httpClient = HttpClients.createDefault();HttpResponse resp = httpClient.execute(httpGet);HttpEntity entity = resp.getEntity();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);}reader.close();httpClient.close();// b站點響應回來的數據response.getWriter().print(responseSB);    }}

      2.4.3 目標Servlet代碼

      package com.bjpowernode.b.web.servlet;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("/target")public class TargetServlet extends HttpServlet {    @Override    protected void doGet(HttpServletRequest request, HttpServletResponse response)    throws ServletException, IOException {// 響應一個json字符串。response.getWriter().print("{\"username\":\"jackson\"}");    }}

      2.4.4 圖示

      2.5 nginx反向代理

      nginx反向代理中也是使用了這種代理機制來完成AJAX的跨域,實現起來非常簡單,只要修改一個nginx的配置即可。這個再說。

      到此這篇關于AJAX跨域問題解決方案詳解的文章就介紹到這了,更多相關AJAX跨域內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

      標簽: Ajax
      相關文章:
      日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
      国产精东传媒成人av电影| 久久久久99| 日韩av自拍| 亚洲在线国产日韩欧美| 久久久男人天堂| 亚洲欧美综合| 国产不卡av一区二区| 亚洲色图国产| 国产黄色一区| 日韩1区2区3区| 99亚洲视频| 日韩不卡视频在线观看| 国产精品nxnn| 久久国产生活片100| 欧美一级精品| 国产中文欧美日韩在线 | 亚洲经典在线| 精品视频在线一区二区在线| 欧美日韩一二| 免费一区二区视频| 色黄视频在线观看| 一区二区三区视频免费观看| 97国产成人高清在线观看| 欧美国产视频| 国产高清精品二区| 亚洲91久久| 综合精品一区| 欧美亚洲一级| 欧美xxxx性| 久久亚洲视频| 国产精品久久久久久av公交车| 国产精品亚洲综合久久| 国产免费av国片精品草莓男男| 日本免费一区二区三区四区| 91精品国产调教在线观看| 久久国产影院| 国产综合亚洲精品一区二| 国产欧美在线| 美女网站视频一区| 香蕉久久夜色精品国产| 视频一区视频二区中文| 樱桃成人精品视频在线播放| 久久天堂精品| 另类亚洲自拍| 日韩国产欧美在线视频| 亚洲精品系列| 日韩精品免费一区二区夜夜嗨| 久久国产麻豆精品| 男人天堂欧美日韩| 国产精品日韩久久久| 欧美日韩四区| 亚洲精品亚洲人成在线观看| 日本天堂一区| 免费观看亚洲天堂| 激情婷婷久久| 中文字幕av一区二区三区人| 在线看片国产福利你懂的| 免费欧美一区| 蜜臀av免费一区二区三区| 欧美另类专区| 久久只有精品| 一本一道久久a久久精品蜜桃| 日韩中文字幕不卡| 久久五月天小说| 久久精品伊人| 国产成人精品一区二区三区在线| 成人看片网站| 日韩高清成人在线| 国产精品视频一区视频二区| 免费在线观看成人| 国产亚洲精aa在线看| 欧美日韩一区二区三区视频播放| 久久99偷拍| 日韩在线观看不卡| 日韩精品视频中文字幕| 国产精品视频一区视频二区| 狠狠久久伊人中文字幕| 国产suv精品一区二区四区视频 | 天堂va蜜桃一区二区三区| 伊人久久婷婷| 日韩精品免费视频人成| 亚洲不卡系列| 国产网站在线| 亚洲三级av| 国产精品毛片一区二区在线看| 日本免费新一区视频| 黑丝一区二区| 亚州av一区| 欧美日韩一二三四| 91成人小视频| 亚洲日产国产精品| 国产精品伦一区二区| 久久美女精品| 蜜臀久久99精品久久久久久9| 久久精品国产亚洲一区二区三区| 国产麻豆久久| 中文一区一区三区免费在线观 | 首页国产欧美久久| re久久精品视频| 一区二区三区网站| 欧美日本不卡高清| 中文在线中文资源| 亚洲aa在线| 91av一区| 丁香婷婷久久| 中文无码日韩欧| 久久精品国产成人一区二区三区| 狠狠久久伊人| 国产精品扒开腿做爽爽爽软件| 日本免费久久| 欧美交a欧美精品喷水| 99精品综合| 精品一区二区男人吃奶| 欧美日韩va| 国产九九精品| 国产乱子精品一区二区在线观看| 丝袜诱惑制服诱惑色一区在线观看 | 国产精品毛片在线看| 日韩综合在线| 福利视频一区| 人人草在线视频| 91精品国产自产在线观看永久∴ | 精品国产乱码| 精品欧美视频| 久久av在线| 欧美国产中文高清| av不卡在线| 91嫩草亚洲精品| 国产精品一区2区3区| 欧美日本精品| 国产精品久久| 每日更新成人在线视频| 在线看片不卡| se01亚洲视频| 免费视频一区二区三区在线观看| 亚洲尤物在线| 久久国产欧美| 精品香蕉视频| 久久午夜视频| 免费人成精品欧美精品| 欧美一级鲁丝片| 亚欧成人精品| 亚洲综合在线电影| 亚洲综合精品四区| 噜噜噜躁狠狠躁狠狠精品视频| 欧美国产精品| 五月天激情综合网| 国产日韩欧美一区二区三区| 欧美交a欧美精品喷水| 欧美精品激情| 久久97视频| 99久久久久| 视频一区二区国产| 国产日韩免费| 欧美资源在线| 人人香蕉久久| 国产精品一二| 香蕉久久99| 热久久久久久久| 国产精品黄网站| 色综合www| 在线成人直播| 国产亚洲毛片| 你懂的国产精品永久在线| 中文字幕av一区二区三区人| 在线一区二区三区视频| 精品国产一区二| 日韩精品免费观看视频| 亚洲高清av| 久久激情综合网| 精品久久久久中文字幕小说| 日韩一区三区| 蜜桃久久精品一区二区| 日韩中文字幕1| 激情六月综合| 日韩久久视频| 日韩高清不卡一区| 国产精品白丝久久av网站| 欧美日韩一区二区综合 | 亚洲一级黄色| 亚洲一区有码| 亚洲欧美日韩一区在线观看| 麻豆高清免费国产一区| 亚洲综合小说| 婷婷五月色综合香五月| 亚洲在线免费| 日韩美女一区二区三区在线观看| 狂野欧美性猛交xxxx| 日本国产精品| 国产视频一区二区在线播放| 人在线成免费视频| 久久中文字幕一区二区三区| 日韩精品久久久久久久软件91| 色偷偷色偷偷色偷偷在线视频| 美女在线视频一区| 国产亚洲午夜| 精品视频久久| 亚洲无线观看| 亚洲精品97| 视频福利一区|