前后端分离详解DragonFly123

前后端分离前我们的开发协作模式一般是这样的:

前端写好静态的HTML页面交付给后端开发。静态页面可以本地开发,也无需考虑业务逻辑只需要实现View即可。

后端使用模板引擎去套模板,同时内嵌一些后端提供的模板变量和一些逻辑操作。

然后前后端集成对接,遇到问题,前台返工,后台返工。

然后在集成,直至集成成功。

在前端调试的时候要安装完整的一套后端开发工具,要把后端程序完全启动起来。遇到问题需要后端开发来帮忙调试。我们发现前后端严重耦合,还要要求后端人员会一些HTML,JS等前端语言。前端页面里还嵌入了很多后端的代码。一旦后端换了一种语言开发,简直就要重做。

像这种增加了大量的沟通成本,调试成本等,而且前后端的开发进度相互影响,从而大大降低了开发效率。

前后端分离并不只是开发模式,而是web应用的一种架构模式。在开发阶段,前后端工程师约定好数据交互接口,实现并行开发和测试;在运行阶段前后端分离模式需要对web应用进行分离部署,前后端之前使用HTTP或者其他协议进行交互请求。

在传统架构模式中,前后端代码存放于同一个代码库中,甚至是同一工程目录下。页面中还夹杂着后端代码。前后端工程师进行开发时,都必须把整个项目导入到开发工具中。

前后端代码库分离,前端代码中有可以进行Mock测试(通过构造虚拟测试对象以简化测试环境的方法)的伪后端,能支持前端的独立开发和测试。而后端代码中除了功能实现外,还有着详细的测试用例,以保证API的可用性,降低集成风险。

在开发期间前后端共同商定好数据接口的交互形式和数据格式。然后实现前后端的并行开发,其中前端工程师在开发完成之后可以独自进行mock测试,而后端也可以使用Postman等接口测试软件进行接口自测,然后前后端一起进行功能联调并校验格式,最终进行自动化测试。

通过将开发团队前后端分离化,让前后端工程师只需要专注于前端或后端的开发工作,是的前后端工程师实现自治,培养其独特的技术特性,然后构建出一个全栈式的精益开发团队。

前后端分离以后,可以实现前后端代码的解耦,只要前后端沟通约定好应用所需接口以及接口参数,便可以开始并行开发,无需等待对方的开发工作结束。与此同时,即使需求发生变更,只要接口与数据格式不变,后端开发人员就不需要修改代码,只要前端进行变动即可。如此一来整个应用的开发效率必然会有质的提升。

如果开发团队能完成前后端分离的转型,打造优秀的前后端团队,开发独立化,让开发人员做到专注专精,开发能力必然会有所提升,能够完美应对各种复杂多变的前端需求。

前后端分离后,应用的代码不再是前后端混合,只有在运行期才会有调用依赖关系。应用代码将会变得整洁清晰,不论是代码阅读还是代码维护都会比以前轻松。

使用了前后端分离架构后,除了开发模式的变更,我们在开发的过程中还会遇到哪些问题呢?我们接着往下看。

我们先来看看传统开发,我们是如何进行用户认证的

HTTP有一个特性:无状态的,就是前后两个HTTP事务它们并不知道对方的信息。而为了维护会话信息或用户信息,一般可用Cookie和Session技术缓存信息。

-Cookie是存储在客户端的

-Session是存储在服务端的

但这样做问题就很多,如果我们的页面出现了XSS漏洞,由于cookie可以被JavaScript读取,XSS漏洞会导致用户token泄露,而作为后端识别用户的标识,cookie的泄露意味着用户信息不再安全。尽管我们通过转义输出内容,使用CDN等可以尽量避免XSS注入,但谁也不能保证在大型的项目中不会出现这个问题。

JWT是一个开放标准(RFC7519),它定义了一种用于简洁,自包含的用于通信双方之间以JSON对象的形式安全传递信息的方法。该信息可以被验证和信任,因为它是数字签名的。JWTS可以使用秘密(使用HMAC算法)或公钥/私钥对使用RSA或ECDSA来签名。

-简洁(Compact):可以通过URL,POST参数或者在HTTPheader发送,因为数据量小,传输速度快。

-自包含(Self-contained):负载中包含了所有用户所需要的信息,避免了多次查询数据库。

JWT由3个子字符串组成,分别为Header,Payload以及Signature,结合JWT的格式即:Header.Payload.Signature。(Claim是描述Json的信息的一个Json,将Claim转码之后生成Payload)。

Header是由下面这个格式的Json通过Base64编码(编码不是加密,是可以通过反编码的方式获取到这个原来的Json,所以JWT中存放的一般是不敏感的信息)生成的字符串,Header中存放的内容是说明编码对象是一个JWT以及使用“SHA-256”的算法进行加密(加密用于生成Signature)

{"typ":"JWT","alg":"HS256"}-头部包含了两部分,token类型和采用的加密算法

-Base64是一种编码,也就是说,它是可以被翻译回原来的样子来的。它并不是一种加密过程。

签名的目的:最后一步签名的过程,实际上是对头部以及负载内容进行签名,防止内容被窜改。如果有人对头部以及负载的内容解码之后进行修改,再进行编码,最后加上之前的签名组合形成新的JWT的话,那么服务器端会判断出新的头部和负载形成的签名和JWT附带上的签名是不一样的。如果要对新的头部和负载进行签名,在不知道服务器加密时用的密钥的话,得出来的签名也是不一样的。

三个部分通过.连接在一起就是我们的JWT了:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjU3ZmVmMTY0ZTU0YWY2NGZmYzUzZGJkNSIsInhzcmYiOiI0ZWE1YzUwOGE2NTY2ZTc2MjQwNTQzZjhmZWIwNmZkNDU3Nzc3YmUzOTU0OWM0MDE2NDM2YWZkYTY1ZDIzMzBlIiwiaWF0IjoxNDc2NDI3OTMzfQ.PA3QjeyZSUh7H0GfE0vJaKW4LjKJuC3dVLQiY4hii8sJWT认证服务器在生成一个JWT之后会将这个token发送到客户端机器,在客户端再次访问受到JWT保护的资源URL链接的时候,服务器会获取到这个token信息,首先将Header进行反编码获取到加密的算法,在通过存放在服务器上的密匙对Header.Payload这个字符串进行加密,比对token中的Signature和实际加密出来的结果是否一致,如果一致那么说明该token是合法有效的,认证成功,否则认证失败。

2.后端核对用户名和密码成功后,将用户的id等其他信息作为JWTPayload(负载),将其与头部分别进行Base64编码拼接后签名,形成一个JWT。形成的JWT就是一个形同lll.zzz.xxx的字符串。

4.前端在每次请求时将JWT放入HTTPHeader中的Authorization位。(解决XSS和XSRF问题)

5.后端检查是否存在,如存在验证JWT的有效性。例如,检查签名是否正确;检查Token是否过期;检查Token的接收方是否是自己(可选)。

6.验证通过后后端使用JWT中包含的用户信息进行其他逻辑操作,返回相应结果。

Session方式存储用户id的最大弊病在于Session是存储在服务器端的,所以需要占用大量服务器内存,对于较大型应用而言可能还要保存许多的状态。一般而言,大型应用还需要借助一些KV数据库和一系列缓存机制来实现Session的存储。

Session方式来存储用户id,一开始用户的Session只会存储在一台服务器上。对于有多个子域名的站点,每个子域名至少会对应一台不同的服务器,例如:

当客户端和服务端分开部署到不同服务器的时候,就会遇到跨域访问的问题,是由浏览器同源策略限制的一类请求场景。

跨域解决方案有很多种,下面使用Nginx反向代理的方案

代理访问其实在实际应用中有很多场景,在跨域中应用的原理做法为:通过反向代理服务器监听同端口,同域名的访问,不同路径映射到不同的地址,比如,在nginx服务器中,监听同一个域名和端口,不同路径转发到客户端和服务器,把不同端口和域名的限制通过反向代理,来解决跨域的问题:

THE END
1.Java:企业级java后端开发,需要掌握哪些内容后端开发是指开发基于服务器端的软件应用程序,也称为系统的后台或服务器端编程。 后端程序员负责处理网站或应用程序后台的逻辑和功能,包括数据库管理、服务器端脚本编写、API设计、数据安全性、网站性能优化等。 后端开发技术通常包括网络协议、服务器架构、数据库管理、编程语言和框架等方面的知识。具有优秀的后端开发技https://blog.csdn.net/snowball_li/article/details/129445520
2.什么是后端开发?后端开发人员是这样的开发人员。 后端开发究竟是什么? 这篇文章的目的在于,我将会考虑后端开发是一种不涉及创建生成用户界面的开发。这可能包括后端Web开发,可能也涉及编写API,创建库或和没有用户界面或甚至科学编程系统的系统组件一起工作。 在现实中,即使前端开发获得了大部分的荣耀,但是世界上存在的大多数代码(可以https://zhuanlan.zhihu.com/p/27067255
3.后端成长之路:从菜鸟到架构后端任务其实是实现接收输入响应输出 后端初接触 后端首先需要学习的是html,css和js,也许你会问做网页不是前端做的事情吗?答案是对于真实开发环境后端很多时候还兼顾了前端这个角色,对于架构来说优化不仅仅要考虑后端还需要考虑前端。 要学到什么样的程度才可以学下一样技能呢?我的建议是能够搭建起一个简单的页面,最https://www.jianshu.com/p/f62379fe9f80
4.后端开发在网易云课堂后端开发频道,发现好课!云课堂是网易公司(163.com)旗下实用技能学习平台。与顶级机构、院校和优秀讲师合作,为您提供海量优质课程,以及创新的在线学习体验。涉及IT互联网、设计、职场提升、经管、法律、语言、留学、考试、亲子育儿、兴趣生活等多个领域。帮https://study.163.com/category/480000003126016
5.软件编程基础知识:前端和后端之间的区别什么是后端?后端开发就像电影或节目的幕后,用户执行的操作由后端通过编写的代码进行分析、获取和传递回来。开发后端的人被称为后端开发人员。后端开发人员的主要工作包括与数据库打交道,提供前端所需要展示的数据等。后端开发人员的主要技能包括了解后端语言,例如 Python、Java、Ruby 等。其他技能包括对数据库管理系统 https://baijiahao.baidu.com/s?id=1796569745445408426&wfr=spider&for=pc
6.后端开发是做什么的课程简介:后端开发是对用户看不到的程序后端部分的开发,负责处理前端的请求,进行逻辑处理和数据交互,会用到应用构建的服务器端语言、数据相关工具、版本控制工具以及作为开发部署环境的Linux系统等工具,需要考虑底层业务逻辑的实现、数据的保存与读取、平台的稳定性和性能等。 https://www.hxsd.tv/free/29208/
7.一文看懂Web后端开发「建议收藏」腾讯云开发者社区由于网络上系统地介绍后端开发的文章实在太少,而最近有恰巧有许多同学问我“什么是后端开发?”、“你为什么喜欢后端开发?”、“做后端都需要学什么?”,那么我们就来讲一讲,到底什么才是后端开发。 定义 后端开发(Back-End Development,也称服务端开发、服务器端开发等)是创建完整可运行的Web应用服务端程序(服务端程https://cloud.tencent.com/developer/article/2097193
8.什么是后端开发软件开发通识其他主要智能手机开发平台 时长18:38 可行性研究 时长14:04 什么是操作系统 时长15:35 什么是bs、cs架构 时长16:23 什么是前端开发 时长19:50 什么是后端开发 时长16:52 什么是移动web开发及web浏览器 时长17:31 软件开发看标准还是效率 时长16:13 软件程序员素质技能 时长15:02 Android开发简介 时长https://time.geekbang.org/course/detail/100765706-775032
9.app后端开发教程入门介绍App 后端开发是指运行在服务器端的、为移动应用提供数据和计算服务的技术。在移动 APP 中,后端开发主要针对数据交互、安全验证、推送服务、存储服务和数据分析等功能开发。本文主要介绍 App 后端开 App后端开发是指运行在服务器端的、为移动应用提供数据和计算服务的技术。在移动 APP 中,后端开发主要针对数据交互、安https://www.yimenapp.com/kb-yimen/28609/
10.什么是Java后端开发?cdhqyj的技术博客Java后端开发主要是指使用Java语言进行服务器端应用程序的开发。Java后端开发涉及到处理业务逻辑、数据存储和处理、与前端交互等方面的工作。具体来说,Java后端开发包括以下几个主要方面: 1、构建Web应用程序:使用Java开发框架(如Spring、SpringBoot、JavaEE等)构建Web应用程序,处理HTTP请求和响应,实现业务逻辑。 https://blog.51cto.com/u_14217621/8884499
11.软件开发的前端和后端是什么意思?后端开发: 使用服务器端编程语言(如Java、Python、Node.js等)构建应用的后台。 3. 前端和后端的协作 在典型的软件开发中,前端和后端是密切协作的。前端通过API(应用程序接口)从后端获取数据,并将用户的操作传递给后端进行处理。这种分工协作模式使得开发团队能够专注于各自的领域,提高开发效率。 http://www.apppark.cn/mobile/news_t_49740.html
12.2024年的后端和Web开发趋势虽然JavaScript 传统上是一种前端语言,但它也将其范围扩展到后端开发。Node.js,一个用于执行JavaScript服务器端的运行时环境,已经获得了极大的普及。它允许你在 Web 应用程序的客户端和服务器端使用 JavaScript,使其成为一种全栈语言。 同时,JavaScript 拥有庞大的库、框架和工具生态系统,可简化 Web 开发。对于使用 https://xxhjs.nuc.edu.cn/info/1009/8350.htm
13.后端开发和后台开发工程师有什么区别说明:后端开发和后台开发工程师哪个工资高?后端开发低于后台开发工程师。后端开发平均工资¥21.5K/月,2024年工资¥21.5K,2024年工资低于2023年,后台开发工程师平均工资¥27.4K/月,2024年工资¥27.1K,2024年工资低于2023年,统计依赖于各大平台发布的公开数据,系统稳定性会影响客观性,仅供参考。 https://www.jobui.com/gangwei/pk/houduankaifa-houtaikaifagongchengshi/
14.JAVA后端应该学什么技术javaJava语言是最常见的后端开发语言之一,Java语言由于自身具备构建多线程的能力,且体系结构比较中立,所以在大型互联网平台的开发中得到了广泛的采用。 目前要想从事Java的后端开发应该学习以下内容: 一、Servlet技术 Servlet技术是Java后端的重要技术之一,作为Java Web开发的核心组件,Servlet承担了Web MVC结构中的核心作用(功https://www.jb51.net/article/210292.htm