博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于前后端分离的一些事
阅读量:4567 次
发布时间:2019-06-08

本文共 2257 字,大约阅读时间需要 7 分钟。

传统我们在开发java等语言的时候一般会使用模板引擎编写html。他们都有一个缺点,就是都是需要先被服务器解析一遍,再把解析的结果给浏览器,浏览器呈现给用户。

前后端分离目前用的比较多的就是用AJAX局部刷新技术,后端暴露API,前端只需要调用API就可以了。当然,这样就将工作重心转移到前端的构建来了,后端只需要根据前端所需要的操作执行相应的操作即可。

但是,前后端分离也会存在一些问题,首当其冲的

  一、是SEO的问题。所有的数据是用js生成的,众所周知搜索爬虫就是爬出url地址,将url内容爬下,解决方式可以学学淘宝的,用nodejs做中间件,遇到爬虫直接输出结果。

  二、就是ajax跨域问题,网上有相关的解决方法。like 

  三、是集群下的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即可。

 

转载于:https://www.cnblogs.com/JAYIT/p/5217342.html

你可能感兴趣的文章
可参考的js代码
查看>>
Spring IOC 中三种注入方式
查看>>
07.计算Nova→4.源码→2.RPC机制
查看>>
观察者模式
查看>>
.NET对象序列化:TimeSpan
查看>>
android学习之handler
查看>>
《HTTP 权威指南》笔记:第十二章 基本认证体制
查看>>
sizeof() strlen()
查看>>
蓝桥杯-地宫取宝
查看>>
WorldWind源码剖析系列:星球表面渲染类WorldSurfaceRenderer
查看>>
利用MATLAB软件对数码相机进行检校
查看>>
python3之运算符
查看>>
创建控制器的方法、控制器加载view过程、控制器view的生命周期、多控制器组合...
查看>>
Angualr6访问API
查看>>
使用SQLAlchemy对博客文章进行分页
查看>>
spell checking
查看>>
Java设计模式视频讲解
查看>>
面试 9:Java 玩转冒泡排序
查看>>
线程初步了解 - <第一篇>
查看>>
NET(C#):使用HttpWebRequest头中的Range下载文件片段
查看>>