如何实现前后端分离?前端如何在访问后端时避免跨域访问?

明夏陪你看海

前后端分离实现了技术上更大的专一性,并且赋予了前后数据的灵活性!公司现在沿用的阿里系前后端分离,姑且分享下!

前后端分离之前的时代,MVC框架大行其道,通常是前端(后台亲切称呼为写静态页面的)开发HTML页面,包括CSS等,然后由后端开发人员统一进行动态数据绑定,这样前端的能力没有体现出来,而后端也对改样式,调布局不胜其烦,而且前后端耦合容易引发相互污染,项目笨重等缺点,这时候分离是最好的选择!

原始的MVC模型图示:


读写分离就是将原来后端的框架MVC分为MC+V,后端controller只需要控制流程的流转,权限认证,业务逻辑等,model层为业务代码与数据层的连接,整个View层全部作为前端项目的形式拆分,单独部署在不同的服务节点上,实现分离!


分离之前View与controller的数据传输只需要通过转发或者重定向,将数据传递到页面,使用特定的EL表达式进行数据接收与显示,分离之后两个项目通常在不同的服务器中,数据的传输涉及到网络通信,所以需要在满足一定的传输协议的基础上进行动态数据的处理!

前后端分离怎么做的呢?

①,后端:后端设计好数据结构后,根据需求提供一套接口文档,内容包括遵循http协议的接口暴露地址,入参,返回对象形式,然后开发好相应的功能接口进行对外服务!(后端框架还是沿袭之前的spring,springboot,mybatis等等)

②,前端:前端则需要把前端代码部署在node.js上,node.js相当于js版本的JVM,是基于google的V8引擎开发的,专门提供给js代码解释环境的一套组件,node.js使用了异步事件驱动,非阻塞的处理模型,能支持大量的并发连接,前段专注于页面渲染和动态数据显示。

③,前后端交互:后端通过一定协议(http,https等)暴露服务,前端相应的进行调用即可,但是因为浏览器具有同源策略,如果是其他域名的脚本通常不会执行,也就是说发生了跨域,怎么实现通信呢?我们才用的是反向代理的方式,通过nginx配置一个映射地址,比如浏览器需要的同源地址为http://123.com,好的没问题,我给你这么访问,在访问某个接口(比如a/b/get)nginx中我通过配置映射将http://123.com/a/b/get映射为http://234.com/a/b/get(后端)实际的暴露地址,实现了数据的获取!



这样的一个架构,在用户看来是完全透明的,实现了整个功能的内聚,前后分离让前后端的开发人员更加专注的维护自己的代码,大大提升了开发人员的效率,如果你在开发过程中有疑惑,欢迎私信,更多的技术分享,敬请关注。。。


谢逅架构

1. 前端专注于写前端的页面样式,后台开发人员专注于写业务逻辑,提供前端所需的各种接口,最后由前端开发人员进行调用真实接口调试。

2. 避免跨域,可以使用nginx进行跳转。譬如:后台提供接口地址为 http://10.1.2.3/api/1.0/web/login,可在nginx中进行配置,proxyTable '/api/1.0/web' 'http://10.1.2.3/',表示,凡是调用以/api/1.0/web开头的url地址,都跳转到(路由)10.1.2.3这个IP地址上,从而解决了跨域问题。

3. 前后端进行代码联调时,一般都有个api文档,比较常用的是swagger,有兴趣可以了解一下。


京京肚肚撸代码

前后端分离最简单的做法是前端使用ajax请求后端返回的json对象

避免跨域访问这块在小项目中的做法是前后端放在同一个主机上,也可以使用jsonp或者指定不限制服务器请求域,还有其他的暂时没想起来


分享到:


相關文章: