最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java前后端分離項(xiàng)目跨域問題解決方案

 更新時間:2024年03月12日 09:02:54   作者:莊周de蝴蝶  
本文主要介紹了Java前后端分離項(xiàng)目跨域問題解決方案,其中后端基于SpringBoot,前端使用了jQuery、axios等框架,具有一定的參考價(jià)值,感興趣的可以了解一下

前言

本文將講解前后端項(xiàng)目中跨域問題的常見解決方案,其中后端基于SpringBoot,前端使用了jQuery、axios等框架用于實(shí)戰(zhàn)代碼的講解。本文將不涉及跨域的解釋和SpringBoot等框架,或者是Nginx的使用,將主要講解前后端分離項(xiàng)目中跨域問題的解決,不過如果你遇到了問題,也歡迎一起交流學(xué)習(xí)。

跨域解決

JSONP方式

這種方式只能用于Get請求,因此如果需要以Post請求方式獲取數(shù)據(jù),則可以先看后面CORS解決方式,以下就講解兩種基于JSONP原理的解決方案,首先先看后端的接口:

@RestController
@RequestMapping("/api/customer")
public class HelloController {

    @GetMapping("/getAllCustomerInfo")
    public String getAllCustomerInfo() {
        // 返回的數(shù)據(jù)必須包含在 getAllCustomerInfo() 字符串中
        // 以便在返回到前端后,可以自動執(zhí)行回調(diào)函數(shù),獲取數(shù)據(jù)
        // getAllCustomerInfo() 與前端的回調(diào)函數(shù)名對應(yīng)
        return "getAllCustomerInfo(" + getCustomerList() + ")";
    }

    private String getCustomerList() {
        List<Customer> list = new ArrayList<>(Arrays.asList(
                new Customer(1, "張三", "123456"),
                new Customer(2, "李四", "654321"),
                new Customer(3, "王五", "123123")
        ));
        return new Gson().toJson(list);
    }

}

下面就來分別講解以下兩種方式的解決方案:

js原生解決方案

// 首先設(shè)置 src 并將結(jié)點(diǎn)添加到 <head> 中
const script = document.createElement('script')
script.src = 'http://localhost:8080/api/customer/getAllCustomerInfo'
document.head.appendChild(script)

// 回調(diào)函數(shù)名與接口中返回的名字對應(yīng)
const getAllCustomerInfo = res => {
	console.table(res, ['id', 'username', 'password'])
}

通過以上設(shè)置就可以在Console中看到以下結(jié)果:

image-20200915142859045

jQueryajax解決方案

// 記得需要引入 jQuery
<script src="https://cdn.staticfile.org/jquery/1.10.0/jquery.js"></script>

$.ajax({ 
	url: 'http://localhost:8080/api/customer/getAllCustomerInfo', 
	type: 'get', 
	dataType: 'jsonp', 
	jsonpCallback: "getAllCustomerInfo"
})

// 回調(diào)函數(shù)同上
const getAllCustomerInfo = res => {
	console.table(res, ['id', 'username', 'password'])
}

CORS解決方案

跨域資源共享(CORS) 是一種機(jī)制,它使用額外的 HTTP 頭來告訴瀏覽器 讓運(yùn)行在一個 origin (domain) 上的Web應(yīng)用被準(zhǔn)許訪問來自不同源服務(wù)器上的指定的資源。當(dāng)一個資源從與該資源本身所在的服務(wù)器不同的域、協(xié)議或端口請求一個資源時,資源會發(fā)起一個跨域 HTTP 請求,詳細(xì)解釋請看鏈接。

后端接口中進(jìn)行設(shè)置

通過利用CORS,我們在前端只需要利用正常的ajax請求方式即可,無需再設(shè)置回調(diào)函數(shù),在這里我們使用了axios,在展示后端代碼之前,我們先看后端代碼的改變,為了區(qū)別于JSONP只能進(jìn)行Get請求,我們這里將接口改成了Post

@RestController
@RequestMapping("/api/customer")
public class HelloController {

    @PostMapping("/getAllCustomerInfo")
    public List<Customer> getAllCustomerInfo(HttpServletResponse response) {
        // 設(shè)置響應(yīng)頭
        response.setHeader("Access-Control-Allow-Origin", "*");
        // 不再需要將結(jié)果放在回調(diào)函數(shù)中
        return new ArrayList<>(Arrays.asList(
                new Customer(1, "張三", "123456"),
                new Customer(2, "李四", "654321"),
                new Customer(3, "王五", "123123")
        ));
    }

}

然后前端代碼直接使用ajax請求即可:

// 首先需要引入 axios
<script src="https://cdn.staticfile.org/axios/0.1.0/axios.js"></script>

axios.post('http://localhost:8080/api/customer/getAllCustomerInfo')
	.then(res => {
		console.table(res, ['id', 'username', 'password'])
	})

Nginx反向代理

關(guān)于反向代理的知識,這里不做詳細(xì)解析,感興趣的話,可以查看該鏈接。通過使用Nginx的反向代理,我們在后端接口中就可以去掉響應(yīng)頭的代碼設(shè)置:

@RestController
@RequestMapping("/api/customer")
public class HelloController {

    @PostMapping("/getAllCustomerInfo")
    public List<Customer> getAllCustomerInfo() {
        return new ArrayList<>(Arrays.asList(
                new Customer(1, "張三", "123456"),
                new Customer(2, "李四", "654321"),
                new Customer(3, "王五", "123123")
        ));
    }

}

然后是nginx.conf中的修改:

server {
	# 監(jiān)聽80端口, 前端不再直接訪問8080端口, 改為訪問80端口即可
    listen       80;
    server_name  localhost;

    location / {
        root   html;
        # 添加頭
        add_header Access-Control-Allow-Origin *;
        # 代理轉(zhuǎn)發(fā)到8080后端端口
        proxy_pass http://localhost:8080;
        index  index.html index.htm;
    }
}

然后再將前端中訪問的接口修改為80:

// 首先需要引入 axios
<script src="https://cdn.staticfile.org/axios/0.1.0/axios.js"></script>

// 80為 http 默認(rèn)端口,可省略
axios.post('http://localhost/api/customer/getAllCustomerInfo')
             .then(res => {
                console.table(res, ['id', 'username', 'password'])
             })

然后開啟Nginx服務(wù)器,Console中再次出現(xiàn)了我們想看到的結(jié)果:

image-20200915150523876

總結(jié)

本文并沒有包括跨域問題的所有解決方案,不過相信對于大部分的跨域問題,都已經(jīng)可以解決了,本文在之后也可能會繼續(xù)更新,講解更多種解決跨域問題的方法

到此這篇關(guān)于Java前后端分離項(xiàng)目跨域問題解決方案的文章就介紹到這了,更多相關(guān)Java前后端分離跨域內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java對數(shù)據(jù)庫更新的操作方式及注意事項(xiàng)

    java對數(shù)據(jù)庫更新的操作方式及注意事項(xiàng)

    這篇文章主要介紹了java對數(shù)據(jù)庫更新的操作方式及注意事項(xiàng),具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(7)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(7)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • Spring Boot 整合 ShedLock 處理定時任務(wù)重復(fù)執(zhí)行的問題小結(jié)

    Spring Boot 整合 ShedLock 處理定時任務(wù)重復(fù)執(zhí)行的問題小結(jié)

    ShedLock是解決分布式系統(tǒng)中定時任務(wù)重復(fù)執(zhí)行問題的Java庫,通過在數(shù)據(jù)庫中加鎖,確保只有一個節(jié)點(diǎn)在指定時間執(zhí)行任務(wù),它與SpringScheduler、Quartz等框架結(jié)合使用,本文介紹Spring Boot 整合 ShedLock 處理定時任務(wù)重復(fù)執(zhí)行的問題,感興趣的朋友一起看看吧
    2025-02-02
  • Mybatis實(shí)體類對象入?yún)⒉樵兊墓P記

    Mybatis實(shí)體類對象入?yún)⒉樵兊墓P記

    這篇文章主要介紹了Mybatis實(shí)體類對象入?yún)⒉樵兊墓P記,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 使用Java快速搭一個可用的Agent的完整實(shí)例

    使用Java快速搭一個可用的Agent的完整實(shí)例

    很多人第一次接觸Agent框架,容易把它理解成更復(fù)雜一點(diǎn)的模型SDK,但真正進(jìn)入業(yè)務(wù)場景后,你會發(fā)現(xiàn)問題根本不在怎么調(diào)模型,而在怎么讓模型穩(wěn)定地參與業(yè)務(wù)流程,這篇文章從Java開發(fā)者視角出發(fā),介紹AgentScope是什么、適合解決什么問題,需要的朋友可以參考下
    2026-03-03
  • Spring Bean管理注解方式代碼實(shí)例

    Spring Bean管理注解方式代碼實(shí)例

    這篇文章主要介紹了Spring Bean管理注解方式代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Java中十六進(jìn)制和十進(jìn)制之間互相轉(zhuǎn)換代碼示例

    Java中十六進(jìn)制和十進(jìn)制之間互相轉(zhuǎn)換代碼示例

    這篇文章主要給大家介紹了關(guān)于Java中十六進(jìn)制和十進(jìn)制之間互相轉(zhuǎn)換的相關(guān)資料,我們項(xiàng)目過程中總是要用到十進(jìn)制與十六進(jìn)制相互轉(zhuǎn)換的方法,需要的朋友可以參考下
    2023-07-07
  • Spring框架原理之實(shí)例化bean和@Autowired實(shí)現(xiàn)原理方式

    Spring框架原理之實(shí)例化bean和@Autowired實(shí)現(xiàn)原理方式

    這篇文章主要介紹了Spring框架原理之實(shí)例化bean和@Autowired實(shí)現(xiàn)原理方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • 全面解析Java中的GC與幽靈引用

    全面解析Java中的GC與幽靈引用

    一般的應(yīng)用程序不會涉及到 Reference 編程, 但是了解這些知識會對理解 GC 的工作原理以及性能調(diào)優(yōu)有一定幫助,在實(shí)現(xiàn)一些基礎(chǔ)性設(shè)施比如緩存時也可能會用到,希望本文能有所幫助
    2013-09-09
  • Java編程之文件讀寫實(shí)例詳解

    Java編程之文件讀寫實(shí)例詳解

    這篇文章主要介紹了Java編程之文件讀寫的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Java文件讀寫所涉及的類及相應(yīng)的操作技巧,需要的朋友可以參考下
    2015-12-12

最新評論

财经| 保靖县| 德安县| 青田县| 集贤县| 桃园市| 聂拉木县| 蕉岭县| 沾化县| 海晏县| 灌阳县| 隆化县| 城口县| 繁峙县| 固镇县| 白水县| 淮北市| 新野县| 类乌齐县| 浦城县| 淅川县| 资兴市| 酉阳| 海兴县| 九台市| 宜兴市| 于都县| 琼海市| 信宜市| 弥勒县| 定州市| 寿光市| 自治县| 中宁县| 玛沁县| 拉萨市| 台中县| 安西县| 阳朔县| 九江县| 临汾市|