传统我们在开发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即可。