• 关于前后端分离的一些事


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

  • 相关阅读:
    Jmeter非GUI、GUI模式压测生成测试报告
    测试轮播banner
    Jmeter如何监控服务器CPU、内存、i/o等资源
    java基础(三)
    用python从符合一定格式的txt文档中逐行读取数据并按一定规则写入excel(openpyxl支持Excel 2007 .xlsx格式)
    L2-011. 玩转二叉树
    L2-010. 排座位
    L2-008. 最长对称子串
    L2-009. 抢红包
    L2-006. 树的遍历
  • 原文地址:https://www.cnblogs.com/JAYIT/p/5217342.html
Copyright © 2020-2023  润新知