如何實現前後端分離?前端如何在訪問後端時避免跨域訪問?

明夏陪你看海

前後端分離實現了技術上更大的專一性,並且賦予了前後數據的靈活性!公司現在沿用的阿里系前後端分離,姑且分享下!

前後端分離之前的時代,MVC框架大行其道,通常是前端(後臺親切稱呼為寫靜態頁面的)開發HTML頁面,包括CSS等,然後由後端開發人員統一進行動態數據綁定,這樣前端的能力沒有體現出來,而後端也對改樣式,調佈局不勝其煩,而且前後端耦合容易引發相互汙染,項目笨重等缺點,這時候分離是最好的選擇!

原始的MVC模型圖示:


讀寫分離就是將原來後端的框架MVC分為MC+V,後端controller只需要控制流程的流轉,權限認證,業務邏輯等,model層為業務代碼與數據層的連接,整個View層全部作為前端項目的形式拆分,單獨部署在不同的服務節點上,實現分離!


分離之前View與controller的數據傳輸只需要通過轉發或者重定向,將數據傳遞到頁面,使用特定的EL表達式進行數據接收與顯示,分離之後兩個項目通常在不同的服務器中,數據的傳輸涉及到網絡通信,所以需要在滿足一定的傳輸協議的基礎上進行動態數據的處理!

前後端分離怎麼做的呢?

①,後端:後端設計好數據結構後,根據需求提供一套接口文檔,內容包括遵循http協議的接口暴露地址,入參,返回對象形式,然後開發好相應的功能接口進行對外服務!(後端框架還是沿襲之前的spring,springboot,mybatis等等)

②,前端:前端則需要把前端代碼部署在node.js上,node.js相當於js版本的JVM,是基於google的V8引擎開發的,專門提供給js代碼解釋環境的一套組件,node.js使用了異步事件驅動,非阻塞的處理模型,能支持大量的併發連接,前段專注於頁面渲染和動態數據顯示。

③,前後端交互:後端通過一定協議(http,https等)暴露服務,前端相應的進行調用即可,但是因為瀏覽器具有同源策略,如果是其他域名的腳本通常不會執行,也就是說發生了跨域,怎麼實現通信呢?我們才用的是反向代理的方式,通過nginx配置一個映射地址,比如瀏覽器需要的同源地址為http://123.com,好的沒問題,我給你這麼訪問,在訪問某個接口(比如a/b/get)nginx中我通過配置映射將http://123.com/a/b/get映射為http://234.com/a/b/get(後端)實際的暴露地址,實現了數據的獲取!



這樣的一個架構,在用戶看來是完全透明的,實現了整個功能的內聚,前後分離讓前後端的開發人員更加專注的維護自己的代碼,大大提升了開發人員的效率,如果你在開發過程中有疑惑,歡迎私信,更多的技術分享,敬請關注。。。


謝逅架構

1. 前端專注於寫前端的頁面樣式,後臺開發人員專注於寫業務邏輯,提供前端所需的各種接口,最後由前端開發人員進行調用真實接口調試。

2. 避免跨域,可以使用nginx進行跳轉。譬如:後臺提供接口地址為 http://10.1.2.3/api/1.0/web/login,可在nginx中進行配置,proxyTable '/api/1.0/web' 'http://10.1.2.3/',表示,凡是調用以/api/1.0/web開頭的url地址,都跳轉到(路由)10.1.2.3這個IP地址上,從而解決了跨域問題。

3. 前後端進行代碼聯調時,一般都有個api文檔,比較常用的是swagger,有興趣可以瞭解一下。


京京肚肚擼代碼

前後端分離最簡單的做法是前端使用ajax請求後端返回的json對象

避免跨域訪問這塊在小項目中的做法是前後端放在同一個主機上,也可以使用jsonp或者指定不限制服務器請求域,還有其他的暫時沒想起來


分享到:


相關文章: