傳統咱們在開發java等語言的時候通常會使用模板引擎編寫html。他們都有一個缺點,就是都是須要先被服務器解析一遍,再把解析的結果給瀏覽器,瀏覽器呈現給用戶。html
先後端分離目前用的比較多的就是用AJAX局部刷新技術,後端暴露API,前端只須要調用API就能夠了。固然,這樣就將工做重心轉移到前端的構建來了,後端只須要根據前端所須要的操做執行相應的操做便可。前端
可是,先後端分離也會存在一些問題,首當其衝的java
1、是SEO的問題。全部的數據是用js生成的,衆所周知搜索爬蟲就是爬出url地址,將url內容爬下,解決方式能夠學學淘寶的,用nodejs作中間件,遇到爬蟲直接輸出結果。node
2、就是ajax跨域問題,網上有相關的解決方法。like http://chenjc-it.iteye.com/blog/1495495web
3、是集羣下的session/cookie失效的問題,這個和ajax扯不上關係,集羣下就會出現這個問題。解決方案:ajax
(1)客戶端存儲方案:把session加密後存在cookie中,每次session信息被寫在客服端,而後經瀏覽器再次提交到服務器.即便兩次請求在集羣中的兩臺服務器上完成,也能夠到達session共享.這種解決方法的優勢是session信息不用存放在服務器端,大大減輕了服務器的壓力.另外一個優勢是一個session中的兩次或屢次請求能夠在一個羣集中的多個服務器上完成,能夠避免單點故障.目前,淘寶是採用的這種解決方案.
這個方案可能比較陌生,但它在大型網站中仍是比較廣泛被使用。原理是將全站用戶的Session信息加密、序列化後以Cookie的方式,統一種植在根域名下(如:.host.com),利用瀏覽器訪問該根域名下的全部二級域名站點時,會傳遞與之域名對應的全部Cookie內容的特性,從而實現用戶的Cookie化Session 在多服務間的共享訪問。
這個方案的優勢無需額外的服務器資源;缺點是因爲受http協議頭信心長度的限制,僅可以存儲小部分的用戶信息,同時Cookie化的 Session內容須要進行安全加解密(如:採用DES、RSA等進行明文加解密;再由MD五、SHA-1等算法進行防僞認證),另外它也會佔用必定的帶寬資源,由於瀏覽器會在請求當前域名下任何資源時將本地Cookie附加在http頭中傳遞到服務器。
(2)集中式session共享方案:提供一個羣集保存session共享信息.其餘應用通通把本身的session信息存放到session羣集服務器組.當應用系統須要session信息的時候直接到session羣集服務器上讀取.這種方式具備第一種方式的第二個優勢.
(3)session複製方案:配置負載均衡服務器,讓用戶的一個session在一個服務器完成.定時的備份session信息到salve上面.一臺服務器down掉後,經過均衡服務器透明把用戶的請求轉發到羣集中的其餘服務器上,此時須要從salve上讀取備份的session信息. 算法
上面這種方式是解決集羣下 session失效的問題,固然,正常狀況下小網站沒集羣session失效後的解決方式是:json
方案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保持長鏈接)
4、用戶資源上傳問題
資源與後臺項目放一塊兒,後臺處理完後須要返回前臺一個相對路徑,若是資源時一臺單獨的服務器,那就須要返回資源的絕對URL便可。