色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何解決跨域問題

科技綠洲 ? 來源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-10-09 16:07 ? 次閱讀

如何解決跨域問題?首先我們需要知道什么是跨域,跨域指的是瀏覽器不能執(zhí)行其它網(wǎng)站的腳本,它是由瀏覽器的同源策略造成的,是瀏覽器對JavaScript 施加的安全限制。

1、同源策略

根據(jù)百度百科 同源策略它是由 Netscape 提出的一個安全策略,它是瀏覽器最核心也是最基本的安全功能,如果缺少同源策略,則瀏覽器的正常功能可能都會受到影響,現(xiàn)在所有支持JavaScript的瀏覽器都會使用這個策略。

所謂同源指的是:

協(xié)議、域名、端口號都相同,只要有一個不相同,那么都是非同源。

圖片

瀏覽器在執(zhí)行腳本的時候,都會檢查這個腳本屬于哪個頁面,即檢查是否同源,只有同源的腳本才會被執(zhí)行;而非同源的腳本在請求數(shù)據(jù)的時候,瀏覽器會報一個異常,提示拒絕訪問。

①、http://www.123.com/index.html 調(diào)用 http://www.123.com/welcome.jsp 協(xié)議、域名、端口號都相同,同源。

②、https://www.123.com/index.html 調(diào)用 http://www.123.com/welcome.jsp 協(xié)議不同,非同源。

③、http://www.123.com:8080/index.html 調(diào)用 http://www.123.com:8081/welcome.jsp 端口不同,非同源。

④、http://www.123.com/index.html 調(diào)用 http://www.456.com/welcome.jsp 域名不同,非同源。

⑤、http://localhost:8080/index.html 調(diào)用 http://127.0.0.1:8080/welcom.jsp 雖然localhost等同于 127.0.0.1 但是也是非同源的。

同源策略限制的情況:

1、Cookie、LocalStorage 和 IndexDB 無法讀取

2、DOM 和 Js對象無法獲得

3、AJAX 請求不能發(fā)送

注意:對于像 img、iframe、script 等標(biāo)簽的 src 屬性是特例,它們是可以訪問非同源網(wǎng)站的資源的。

2、跨域?qū)嵗菔?/h3>

圖片

我們創(chuàng)建了兩個 web 項目JavaWeb01 和 JavaWeb02 分別部署在tomcat1和Tomcat2上,這兩個 Tomcat 的端口號設(shè)置是不一樣的,一個是 8080,一個是8081,所以這兩個項目構(gòu)成了非同源。那么我們從客戶端(瀏覽器)輸入訪問部署在 Tomcat2 上的項目 JavaWeb2,然后在該項目中通過 ajax 去請求部署在 Tomcat1 上的項目數(shù)據(jù),能夠訪問的到呢?

①、在 JavaWeb02 項目中,有一個 jsp 文件,我們通過在瀏覽器訪問該 JSP 文件去獲取 JavaWeb01 項目中的數(shù)據(jù)

< %@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8" isELIgnored="false"% >
< %
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
            + path;
% >
< !DOCTYPE html >
< head >
    < title >Title< /title >
< /head >
< script type="text/javascript" src="< %=basePath% >/js/jquery-3.3.1.min.js" >< /script >
< script type="text/javascript" >
    $(document).ready(function(){
        $.ajax({
            type:"get",
            async:false,
            url:"http://localhost:8080/JavaWeb01/getPassWordByUserNameServlet?userName=Tom",
            dataType:"json",
            success:function (data) {
                alert(data['passWord']);
            },
            error:function () {
                alert("error");
            }

        });
    })

< /script >
< body >

< /body >
< /html >

通過ajax 訪問

url:"http://localhost:8080/JavaWeb01/getPassWordByUserNameServlet?userName=Tom"

去獲取 JavaWeb01 項目中的數(shù)據(jù)。

②、在 JavaWeb01 項目中,創(chuàng)建一個 getPassWordByUserNameServlet 請求的 Servlet

package com.ys.servlet;

import com.alibaba.fastjson.JSONObject;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Create by YSOcean
 */
@WebServlet("/getPassWordByUserNameServlet")
public class UserServlet extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String userName = req.getParameter("userName");
        String passWord = null;
        if(userName != null){
            passWord = "123";
        }
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("passWord",passWord);
        resp.getWriter().println(jsonObject.toJSONString());
    }
}

③、在瀏覽器中輸入 http://localhost:8081/JavaWeb02/index.jsp 鏈接,去調(diào)用該頁面的 ajax 函數(shù)

圖片

瀏覽器給我們返回了一個錯誤,這就是瀏覽器同源策略導(dǎo)致的跨域訪問會報錯。那么該如何解決呢?

3、跨域解決辦法

①、response 添加 header 我們在 Servlet 請求返回時添加如下代碼:

//*表示支持所有網(wǎng)站訪問,也可以額外配置相應(yīng)網(wǎng)站
resp.setHeader("Access-Control-Allow-Origin", "*");

請求結(jié)果如下:

圖片

②、JSONP 方式 首先我們要修改 index.jsp 頁面的 ajax 請求:

$.ajax({
            type:"get",
            async:false,
            url:"http://localhost:8080/JavaWeb01/getPassWordByUserNameServlet?userName=Tom",
            dataType:"jsonp",//數(shù)據(jù)類型為jsonp
            jsonp:"backFunction",//服務(wù)端用于接收callBack調(diào)用的function名的參數(shù)
            success:function (data) {
                alert(data["passWord"]);
            },
            error:function () {
                alert("error");
            }

        });

注意:我們修改了 dataType 的數(shù)據(jù)類型為 jsonp,并且新增了 jsop 屬性值為 “backFunction”。

接著在 JavaWeb01 項目的 Servlet 中進行如下修改:

@WebServlet("/getPassWordByUserNameServlet")
public class UserServlet extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String userName = req.getParameter("userName");
        String passWord = null;
        if(userName != null){
            passWord = "123";
        }
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("passWord",passWord);
        //1、第一種方法:*表示支持所有網(wǎng)站訪問,也可以額外配置相應(yīng)網(wǎng)站
        //resp.setHeader("Access-Control-Allow-Origin", "*");

        //2、第二種方法:jsonp
        String backFunction = req.getParameter("backFunction");
        resp.getWriter().println(backFunction+"("+jsonObject.toJSONString()+")");

        //resp.getWriter().println(jsonObject.toJSONString());
    }
}

結(jié)果就不截圖了,下面講講這種方式的原理。

1、在同源策略下,在某個服務(wù)器下的頁面是無法獲取到該服務(wù)器以外的數(shù)據(jù)的,即一般的ajax是不能進行跨域請求的。但 img、iframe 、script等標(biāo)簽是個例外,這些標(biāo)簽可以通過src屬性請求到其他服務(wù)器上的數(shù)據(jù)。利用 script標(biāo)簽的開放策略,我們可以實現(xiàn)跨域請求數(shù)據(jù),當(dāng)然這需要服務(wù)器端的配合。Jquery中ajax 的核心是通過 XmlHttpRequest獲取非本頁內(nèi)容,而jsonp的核心則是動態(tài)添加 標(biāo)簽來調(diào)用服務(wù)器提供的 js腳本。

2、當(dāng)我們正常地請求一個JSON數(shù)據(jù)的時候,服務(wù)端返回的是一串 JSON類型的數(shù)據(jù),而我們使用 JSONP模式來請求數(shù)據(jù)的時候服務(wù)端返回的是一段可執(zhí)行的 JavaScript代碼。因為jsonp 跨域的原理就是用的動態(tài)加載 script的src ,所以我們只能把參數(shù)通過 url的方式傳遞,所以jsonp的 type類型只能是get !

我們可以看上面的請求,瀏覽器按 F12 顯示如下:

我們將這段路徑單獨復(fù)制出來:

http://localhost:8080/JavaWeb01/getPassWordByUserNameServlet?userName=Tom&backFunction=jQuery33107285685756141047_1532791502227&_=1532791502228

再看 Preview 頁:

也就是說對于上面的JSONP 請求,其實jQuery會轉(zhuǎn)化為:

< script type="text/javascript" 
         src="http://localhost:8080/JavaWeb01/getPassWordByUserNameServlet?userName=Tom&backFunction=jQuery33107285685756141047_1532791502227&_=1532791502228" >
< /script >

然后動態(tài)的去加載該 script 標(biāo)簽的 src 屬性。

③、HttpClient 請求轉(zhuǎn)發(fā) 這種方式客戶端是向 JavaWeb02 項目發(fā)送請求,而不是上面的向 JavaWeb01 發(fā)送請求,然后在 JavaWeb02 的后臺通過 HttpClient 將請求發(fā)送到 JavaWeb01,得到數(shù)據(jù)后返回。這種方式相當(dāng)于繞過瀏覽器的同源機制,直接通過后端進行轉(zhuǎn)發(fā)。

index.jsp 的ajax請求如下:

$.ajax({
            type:"get",
            async:false,
            url:"http://localhost:8081/JavaWeb02/ToGetPassWordServlet?userName=Tom",
            dataType:"json",
            success:function (data) {
                alert(data['passWord']);
            },
            error:function () {
                alert("error");
            }

        });

注意我們是在 JavaWeb02 項目下的index.jsp 發(fā)送請求,請求路徑也是 JavaWeb02 下的 Servlet。

package com.ys.servlet;

import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Create by YSOcean
 */
@WebServlet("/ToGetPassWordServlet")
public class ToGetPassWordServlet extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //獲取用戶名
        String userName = req.getParameter("userName");
        CloseableHttpClient httpClient = HttpClients.createDefault();
        //創(chuàng)建get請求
        HttpGet hget = new HttpGet("http://localhost:8080/JavaWeb01/getPassWordByUserNameServlet?userName="+userName);
        CloseableHttpResponse httpResponse = httpClient.execute(hget);
        int code = httpResponse.getStatusLine().getStatusCode();
        if(code == 200){
            String result = EntityUtils.toString(httpResponse.getEntity());
            resp.getWriter().print(result);
        }
        httpResponse.close();
        httpClient.close();

    }
}

④、nginx 轉(zhuǎn)發(fā) 原理很簡單:

圖片

利用nginx反向代理,將請求分發(fā)到部署到相應(yīng)項目的tomcat服務(wù)器,當(dāng)然也不存在跨域問題。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 端口
    +關(guān)注

    關(guān)注

    4

    文章

    993

    瀏覽量

    32388
  • 瀏覽器
    +關(guān)注

    關(guān)注

    1

    文章

    1038

    瀏覽量

    35736
  • javascript
    +關(guān)注

    關(guān)注

    0

    文章

    525

    瀏覽量

    54125
  • 腳本
    +關(guān)注

    關(guān)注

    1

    文章

    395

    瀏覽量

    15049
收藏 人收藏

    評論

    相關(guān)推薦

    MDO4000系列混合分析儀應(yīng)用之分析介紹

    了創(chuàng)新的概念-分析,利用分析,可以發(fā)現(xiàn)傳統(tǒng)手段無法發(fā)現(xiàn)的嵌入式射頻系統(tǒng)以及數(shù)字射頻系統(tǒng)的疑難雜癥。 MDO4000 系列混合分析儀
    發(fā)表于 07-19 07:02

    采用Nginx的反向代理解決

    40Nginx的反向代理功能解決問題
    發(fā)表于 10-10 10:58

    ajax如何克服

    如何克服ajax
    發(fā)表于 04-30 13:25

    請問如何解決Vue加入withCredentials后無法進行請求?

    Vue加入withCredentials后無法進行請求
    發(fā)表于 11-06 06:39

    如何處理好FPGA設(shè)計中時鐘間的數(shù)據(jù)

    時鐘處理是FPGA設(shè)計中經(jīng)常遇到的問題,而如何處理好時鐘間的數(shù)據(jù),可以說是每個FPGA初學(xué)者的必修課。如果是還是在校的學(xué)生,時鐘
    發(fā)表于 07-29 06:19

    如何處理好時鐘間的數(shù)據(jù)呢

    時鐘處理是什么意思?如何處理好時鐘間的數(shù)據(jù)呢?有哪幾種時鐘處理的方法呢?
    發(fā)表于 11-01 07:44

    FPGA時鐘處理簡介

    (10)FPGA時鐘處理1.1 目錄1)目錄2)FPGA簡介3)Verilog HDL簡介4)FPGA時鐘處理5)結(jié)語1.2 FPGA簡介FPGA(Field Programm
    發(fā)表于 02-23 07:47

    看看Stream信號里是如何做時鐘握手的

    邏輯出身的農(nóng)民工兄弟在面試時總難以避免“時鐘”的拷問,在諸多時鐘的方法里,握手是一種常見的方式,而Stream作為一種天然的握手信號,不妨看看它里面是如做
    發(fā)表于 07-07 17:25

    cdc路徑方案幫您解決時鐘難題

    這一章介紹一下CDC也就是時鐘可能存在的一些問題以及基本的時鐘處理方法。時鐘的問題主
    的頭像 發(fā)表于 11-30 06:29 ?7339次閱讀
    cdc路徑方案幫您解決<b class='flag-5'>跨</b>時鐘<b class='flag-5'>域</b>難題

    何解決異步FIFO時鐘亞穩(wěn)態(tài)問題?

    時鐘的問題:前一篇已經(jīng)提到要通過比較讀寫指針來判斷產(chǎn)生讀空和寫滿信號,但是讀指針是屬于讀時鐘的,寫指針是屬于寫時鐘的,而異步FIFO的讀寫時鐘
    的頭像 發(fā)表于 09-05 14:29 ?6148次閱讀

    中國聯(lián)通推出了全國一體化的服務(wù)及產(chǎn)品

    中國聯(lián)通依托特有的全國集中系統(tǒng)優(yōu)勢,針對外出務(wù)工人員、學(xué)生、候鳥族、差旅族等流動頻繁的人口群體對服務(wù)的需求痛點,推出全國一體化的服務(wù)及
    發(fā)表于 12-05 09:25 ?4133次閱讀

    關(guān)于時鐘的詳細解答

    每一個做數(shù)字邏輯的都繞不開時鐘處理,談一談SpinalHDL里用于時鐘處理的一些手段方法。
    的頭像 發(fā)表于 04-27 10:52 ?4407次閱讀
    關(guān)于<b class='flag-5'>跨</b>時鐘<b class='flag-5'>域</b>的詳細解答

    時鐘電路設(shè)計總結(jié)

    時鐘操作包括同步時鐘操作和異步時鐘操作。
    的頭像 發(fā)表于 05-18 09:18 ?831次閱讀
    <b class='flag-5'>跨</b>時鐘<b class='flag-5'>域</b>電路設(shè)計總結(jié)

    FPGA時鐘處理方法(一)

    時鐘是FPGA設(shè)計中最容易出錯的設(shè)計模塊,而且一旦時鐘出現(xiàn)問題,定位排查會非常困難,因為時鐘
    的頭像 發(fā)表于 05-25 15:06 ?2170次閱讀
    FPGA<b class='flag-5'>跨</b>時鐘<b class='flag-5'>域</b>處理方法(一)

    FPGA時鐘處理方法(二)

    上一篇文章已經(jīng)講過了單bit時鐘的處理方法,這次解說一下多bit的時鐘方法。
    的頭像 發(fā)表于 05-25 15:07 ?1130次閱讀
    FPGA<b class='flag-5'>跨</b>時鐘<b class='flag-5'>域</b>處理方法(二)
    主站蜘蛛池模板: 台湾佬综合娱乐网 | 同桌上课把奶露出来给我玩 | 忘忧草高清 | 富婆夜店找黑人猛男BD在线 | 原神美女被超污app 御姐被吸奶 | 午夜国产视频 | 日本亚欧热亚洲乱色视频 | 在线精品视频成人网 | 91九色视频无限观看免费 | 2019在秋霞理论 | 热久久国产欧美一区二区精品 | 日本久久久WWW成人免费毛片丨 | FREE性丰满HD毛多多 | 超大BBWWW | 美女激清床上戏大全 | 色宅男看片午夜大片免费看 | 青春禁区动漫免费观看 | 全肉高H短篇合集 | 精品国产在线国语视频 | 一本到2019线观看 | 娇妻被朋友玩得呻吟在线电影 | 免费人成视频19674不收费 | 国产精品无码亚洲精品 | 九九电影伦理片 | chinese黑人第一次 | 国产免费看黄的私人影院 | 国产美女影院 | CHRISTMAS农村夫妻HO| 免费精品美女久久久久久久久久 | 免费三级网址 | 白丝高中生被c爽哭 | 成人无码精品1区2区3区免费看 | 高H辣肉办公室 | 久久中文字幕免费高清 | 紧缚束缚调教丨vk | 伊人色综合久久天天 | 一区二区中文字幕在线观看 | 伊人久久网国产伊人 | 护士日本xx厕所 | 亚州三级久久电影 | 免费夜里18款禁用软粉色 |