傳統我們在開發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即可。
