• <menu id="usemi"></menu>
  • 您好,歡迎來到賦能網!

    ajax跨域方法?

    賦能網 2023-07-19 194

    Ajax 是一種獨立于 Web 服務器軟件的瀏覽器技術,Ajax不需要任何瀏覽器插件,但需要用戶允許javascript在瀏覽器上執行,那ajax為什么不能跨域?下面來我們就來給大家講解一下。

    ajax為什么不能跨域?ajax解決跨域問題方法?

    解決方式1:響應頭添加Header允許訪問

    跨域資源共享(CORS)Cross-Origin Resource Sharing

    這個跨域訪問的解決方案的安全基礎是基于"Javascript無法控制該HTTP頭"

    它需要通過目標域返回的HTTP頭來授權是否允許跨域訪問。

    response.addHeader(‘Access-Control-Allow-Origin:*’);//允許所有來源訪問
    response.addHeader(‘Access-Control-Allow-Method:POST,GET’);//允許訪問的方式

    ajax為什么不能跨域?ajax解決跨域問題方法.png

    解決方式2:jsonp 只支持get請求不支持post請求

    用法:

    ①dataType改為jsonp 

    ②jsonp : "jsonpCallback"————發送到后端實際為http://a.a.com/a/FromServlet?userName=644064&jsonpCallback=jQueryxxx

    ③后端獲取get請求中的jsonpCallback 

    ④構造回調結構


    $.ajax(
    {
        type: "GET"
        , async: false
        , url: "http://a.a.com/a/FromServlet?userName=644064"
        , dataType: "jsonp", //數據類型為jsonp
        jsonp: "jsonpCallback", //服務端用于接收callback調用的function名的參數
        success: function (data)
        {
            alert(data["userName"]);
        }
        , error: function ()
        {
            alert('fail');
        }
    });
    //后端
    String jsonpCallback = request.getParameter("jsonpCallback");
    //構造回調函數格式jsonpCallback(數據)
    resp.getWriter()
        .println(jsonpCallback + "(" + jsonObject.toJSonString() + ")");

    解決方式3:httpClient內部轉發

    實現原理很簡單,若想在B站點中通過Ajax訪問A站點獲取結果,固然有ajax跨域問題,但在B站點中訪問B站點獲取結果,不存在跨域問題,這種方式實際上是在B站點中ajax請求訪問B站點的HttpClient,再通過HttpClient轉發請求獲取A站點的數據結果。但這種方式產生了兩次請求,效率低,但內部請求,抓包工具無法分析,安全。

    $.ajax(
    {
        type: "GET"
        , async: false
        , url: "http://b.b.com:8080/B/FromAjaxservlet?userName=644064"
        , dataType: "json"
        , success: function (data)
        {
            alert(data["userName"]);
        }
        , error: function ()
        {
            alert('fail');
        }
    });
    @WebServlet("/FromAjaxservlet")
    public class FromAjaxservlet extends HttpServlet
    {
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
        {
            try
            {
                //創建默認連接
                CloseableHttpClient httpClient = HttpClients.createDefault();
                //創建HttpGet對象,處理get請求,轉發到A站點
                HttpGet httpGet = new HttpGet("http://a.a.com:8080/A/FromServlet?userName=" + req.getParameter("userName"));
                //執行
                CloseableHttpResponse response = httpClient.execute(httpGet);
                int code = response.getStatusLine()
                    .getStatusCode();
                //獲取狀態
                System.out.println("http請求結果為:" + code);
                if (code == 200)
                {
                    //獲取A站點返回的結果
                    String result = EntityUtils.toString(response.getEntity());
                    System.out.println(result);
                    //把結果返回給B站點
                    resp.getWriter()
                        .print(result);
                }
                response.close();
                httpClient.close();
            }
            catch (Exception e)
            {}
        }
    }

    解決方式4:使用nginx搭建企業級接口網關方式

    www.a.a.com不能直接請求www.b.b.com的內容,可以通過nginx,根據同域名,但項目名不同進行區分。什么意思呢?這么說可能有點抽象。假設我們公司域名叫www.nginxtest.com

    當我們需要訪問www.a.a.com通過www.pennylanechimneycaps.com/A訪問,并通過nginx轉發到www.a.a.com

    當我們需要訪問www.b.b.com通過www.funengwang.com/B訪問,并通過nginx轉發到www.a.a.com

    我們訪問公司的域名時,是"同源"的,只是項目名不同,此時項目名的作用只是為了區分,方便轉發。如果你還不理解的話,先看看我是怎么進行配置的:

    server
    {
        listen 80;
        server_name www.pennylanechimneycaps.com;
        location / A
        {
            proxy_pass http: //a.a.com:81;
                index index.html index.htm;
        }
        location / B
        {
            proxy_pass http: //b.b.com:81;
                index index.html index.htm;
        }
    }

    我們訪問以www.funengwang.com開頭且端口為80的網址,nginx將會進行攔截匹配,若項目名為A,則分發到a.a.com:81。實際上就是通過"同源"的域名,不同的項目名進行區分,通過nginx攔截匹配,轉發到對應的網址。整個過程,兩次請求,第一次請求nginx服務器,第二次nginx服務器通過攔截匹配分發到對應的網址。

    Ajax不能跨域我們可以使用以上這種方法去解決,實現不同的域之間相互請求資源。最后大家如果想要了解更多其他工具教程知識,敬請關注java相關欄目。

    本文鏈接:

    本文章“ajax跨域方法?”已幫助 194 人

    免責聲明:本信息由用戶發布,本站不承擔本信息引起的任何交易及知識產權侵權的法律責任!

    本文由賦能網 整理發布。了解更多培訓機構》培訓課程》學習資訊》課程優惠》課程開班》學校地址等機構信息,可以留下您的聯系方式,讓課程老師跟你詳細解答:
    咨詢熱線:4008-569-579

    如果本頁不是您要找的課程,您也可以百度查找一下:
    姚洪楼的网络自留地 – 小河悠悠,记忆如水;冷处偏佳,别有根芽
  • <menu id="usemi"></menu>
  • <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>