關於前后端分離的一些事


傳統我們在開發java等語言的時候一般會使用模板引擎編寫html。他們都有一個缺點,就是都是需要先被服務器解析一遍,再把解析的結果給瀏覽器,瀏覽器呈現給用戶。

前后端分離目前用的比較多的就是用AJAX局部刷新技術,后端暴露API,前端只需要調用API就可以了。當然,這樣就將工作重心轉移到前端的構建來了,后端只需要根據前端所需要的操作執行相應的操作即可。

但是,前后端分離也會存在一些問題,首當其沖的

  一、是SEO的問題。所有的數據是用js生成的,眾所周知搜索爬蟲就是爬出url地址,將url內容爬下,解決方式可以學學淘寶的,用nodejs做中間件,遇到爬蟲直接輸出結果。

  二、就是ajax跨域問題,網上有相關的解決方法。like http://chenjc-it.iteye.com/blog/1495495

  三、是集群下的session/cookie失效的問題,這個和ajax扯不上關系,集群下就會出現這個問題。解決方案:

(1)客戶端存儲方案:把session加密后存在cookie中,每次session信息被寫在客服端,然后經瀏覽器再次提交到服務器.即使兩次請求在集群中的兩台服務器上完成,也可以到達session共享.這種解決方法的優點是session信息不用存放在服務器端,大大減輕了服務器的壓力.另一個優點是一個session中的兩次或多次請求可以在一個群集中的多個服務器上完成,可以避免單點故障.目前,淘寶是采用的這種解決方案.

    這個方案可能比較陌生,但它在大型網站中還是比較普遍被使用。原理是將全站用戶的Session信息加密、序列化后以Cookie的方式,統一種植在根域名下(如:.host.com),利用瀏覽器訪問該根域名下的所有二級域名站點時,會傳遞與之域名對應的所有Cookie內容的特性,從而實現用戶的Cookie化Session 在多服務間的共享訪問。

    這個方案的優點無需額外的服務器資源;缺點是由於受http協議頭信心長度的限制,僅能夠存儲小部分的用戶信息,同時Cookie化的 Session內容需要進行安全加解密(如:采用DES、RSA等進行明文加解密;再由MD5、SHA-1等算法進行防偽認證),另外它也會占用一定的帶寬資源,因為瀏覽器會在請求當前域名下任何資源時將本地Cookie附加在http頭中傳遞到服務器。

(2)集中式session共享方案:提供一個群集保存session共享信息.其他應用統統把自己的session信息存放到session群集服務器組.當應用系統需要session信息的時候直接到session群集服務器上讀取.這種方式具有第一種方式的第二個優點. 
 
(3)session復制方案:配置負載均衡服務器,讓用戶的一個session在一個服務器完成.定時的備份session信息到salve上面.一台服務器down掉后,通過均衡服務器透明把用戶的請求轉發到群集中的其他服務器上,此時需要從salve上讀取備份的session信息. 

上面這種方式是解決集群下 session失效的問題,當然,正常情況下小網站沒集群session失效后的解決方式是:

方案1:檢查AJAX返回的返回的內容是否有<html>標簽
           在web系統中,當session過期時,當用戶有操作的時候,此時系統一般會返回登陸界面。
          讓用戶重新輸入用戶名和密碼。當session過期的時候,AJAX請求返回的內容應該是登陸界面的頁面

          內容(即登陸界面的頁面的html代碼)。通過判斷返回內容是否用<html>來判斷session是否過期。
     var result=request.responseText;/* ajax返回的內容*/
     
     if(result.indexOf('<HTML>')>-1){/*返回內容中有html標簽*/}
     或者
     var r=/<html>/ig;
     if(r.test(result)){/*返回內容中有html標簽*/}
     通過上面的方法可以判斷session是否過期,然后根據具體的業務進行異常處理。

     方案2:返回的結果中有session是否過期的標志。也有人稱為true/false模式
                此解決方案一般結合json使用。
     如返回的結果是:
        var res={
             "result":true,/*session沒有過期,false(session過期)*/
             "data"  :""/*其它數據*/
          }
     if(res["result"])
     {
          /*session沒有過期*/ 
     }else{
         /*session過期*/
     }     

方案3:利用時間戳,在頁面上搞個全局變量

     var startDate; /*ajax最近一次訪問服務器的時間,Date類型*/
     if(new Date().getTime()-startDate.getTime()<30*60*1000)
     {
           /*假設session過期的時間30分鍾*/
           /*session沒有過期*/
     }else{
           /*session過期*/
     }

    方案4:延長session過期時間,此方案有性能問題    

  4.1:延長session過期時間
      4.2:client輪循server。(AJAX輪循server或client,server保持長連接)

  四、用戶資源上傳問題

資源與后台項目放一起,后台處理完后需要返回前台一個相對路徑,如果資源時一台單獨的服務器,那就需要返回資源的絕對URL即可。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM