‘壹’ web为什么要前后端分离优点是什么
解耦,降低耦合度,而且前后端分离可以提升一些后端的开发效率。
‘贰’ 用web api 分离前后台 会不会有风险
1、 OAuth是做什么的?
在网上浏览时,大家都见过这样的功能:网站A提供了第三方登录服务,比如使用新浪微博、QQ账户登录。用户使用第三方账户登陆后,第三方返回Token给网站A,当网站A调用第三方服务请求登录用户信息时需传递该Token给第三方,第三方才允许该服务请求。之后的每次请求无需再次认证,直接使用该Token即可。这就是OAuth的典型应用。
2、 简单使用介绍 (具体使用OAuth的方法请参考:在ASP.NET中基于Owin OAuth使用Client Credentials Grant授权发放Token)
2.1、用户登录的过程即是获取Token的过程,前端用户登录示例代码如下:
1 $.ajax({
2 type: "POST",
3 url: api_address + "token", //api_address为WebApi服务地址,由于OAuth的使用中设置了属性TokenEndpointPath = new PathString("/token"),所以请求到“token”链接时即可自动进入认证流程。
4 data: { grant_type: "password", username: username, password: password, ran: Math.random() },//传递用户名、密码、认证方式
5 dataType: "json",
6 success: function (result) {
7 if (result.access_token && result.access_token.length > 0) {
8 //result.access_token即是有效的服务调用凭证,可以把该值存入到Cookie中,以备下次使用。
9 callback(1, "登录成功。");
10 }
11 else {
12 callback(0, "未知错误!");
13 }
14 },
15 error: function (XMLHttpRequest, textStatus, errorThrown) {
16 callback(0, XMLHttpRequest.responseJSON.error);
17 }
18 });
登录代码
2.2、当认证方式为password时,已下方法为认证流程中的一步。(认证通过才会返回Token)
1 public override Task GrantResourceOwnerCredentials( context)
2 {
3 var username= context.UserName;
4 var password=context.Password;
5 if(用户名与密码不合法)
6 {
7 context.setError(“用户名或密码错误!”);//认证不通过
8 }
9 else
10 {
11 var oAuthIdentity = new ClaimsIdentity(context.Options.AuthenticationType);
12 oAuthIdentity.AddClaim(new Claim(ClaimTypes.Name, context.UserName));
13 //可以加入用户信息及其他必要信息到Token中,以便在api服务中使用(使用中HttpContext.Current.User.Identity即为oAuthIdentity对象,WebApi的Controller中可直接使用User.Identity)。
14 oAuthIdentity.AddClaim(new Claim("UserID", user.UserID.ToString()));
15 var ticket = new AuthenticationTicket(oAuthIdentity, new AuthenticationProperties());
16 context.Validated(ticket);//认证通过
17 }
18 return base.GrantResourceOwnerCredentials(context);
19 }
认证代码
3、 已经获取了Token,如何使用?
网上的大部分示例都是使用HttpClient调用的方式,而前后端的完全分离作为一种发展趋势,我们需要Jquery的调用方式。
1 $.ajax({
2 type: “method”,//get,post,put,delete
3 url:api_address + “api/Test”,//如果调用webapi中的TestController
4 data: {data},
5 dataType: "json",
6 headers: {
7 "Authorization": "Bearer " + “token” //把登录获取的Token加入到http请求头中
8 },
9 success: function (result) {
10 callback(result);
11 },
12 error: function (XMLHttpRequest, textStatus, errorThrown) {
13 //。。。。。。
14 }
15 });
调用Api
4、Api的访问权限该如何做?
认证中我们把用户登录成功作为认证通过的标志,但不同角色的用户具有不同的访问权限(个人认为认证中应使用最小权限验证,如示例中的登录成功),如何控制有些Controller不能被低权限用户访问。
1 [Authorize]
2 public class TestController: ApiController
3 {
4 // GET api/<controller>
5 public HttpResponseMessage Get(int appid)
6 {
7 return null;
8 }
9 }
一个典型的ApiController
[Authorize]表示访问该Controller的请求必须经过认证(请求头中具有Token信息),这里我们可以自定义一个特性去验证用户权限,并替换特性AuthorizeAttribute。(这里仅提供思路,具体做法请自己摸索,不保证以下代码的正确性)
1 public class CustomeAuthorizeAttribute:System.Web.Http.AuthorizeAttribute
2 {
3 protected override bool IsAuthorized(System.Web.Http.Controllers.HttpActionContext actionContext)
4 {
5 if(base.IsAuthorized(actionContext))
6 {
7 //这里对用户的权限进行验证,actionContext可以获得请求的是哪一个Controller
8 var user = HttpContext.Current.User.Identity;//Token中带有的用户信息
9 if (可以访问)
10 {
11 return true;
12 }
13 return false;
14 }
15 return false;
16 }
17 }
18
‘叁’ java web前后端分离安全性
批量注册的账号是属于你的系统,对于他们有用吗?如果对他们毫无用处,他们为什么要用你的接口批量注册呢
‘肆’ Web 前后端为什么需要分离
我理解的前端就是负责所有和用户交互有关的模块都可以视为前端,他就像餐馆里面的前台服务生直接和客户打交道的人。
后端就是负责处理用户的请求,进行数据的处理,用户几乎所有操作都可以抽象为对数据的增删改查,就像餐馆里面的厨师接收服务生告诉他要炒哪些菜,厨师把菜处理好再给服务生(后端处理数据返回给前端表现层)服务生最后输出给客户。
但是目前由于很多情况下业务比较简单,比如说一个内容发布系统 CMS ,用户交互,请求查看文章和管理员新增文章都是很简单的业务逻辑,所以前后端都用 php 这门主要用于表现层的语言来实现,而本身在用 MVC 模式把用户交互部分( V 和 C )以及数据处理(主要是 M ),否则的话就得用 java 等非脚本语言来实现保证效率,甚至高并发环境下还要用到消息队列,缓存等等。
‘伍’ web开发为什么要前后端分离
在学习前端开发的时候,会发现前端开发的知识非常琐碎,前端往往是靠拼凑来完成页面效果,开发过程没有java后端开发有逻辑,代码也很难管理。后端开发有各种各样的工具类、jar包、maven依赖、spring框架等,具有工程化模块化思维,可以满足后期的优化。vue.js和react.js等这些前端框架的出现,它们从本质上打破了以前前端开发的规则,这就是前端开发组件化框架。这些框架出现后,前端开发也开始像后端一样,遵循一套体系来进行约束性的开发,越来越工程化、组件化、迭代化,变得有章可循。前后端分离核心思想是前端HTML页面通过AJAX调用后端的RESTFUL API接口并使用JSON数据进行交互。
‘陆’ Web前后端分离的意义大吗
没必要分太细。我们需要 specialist,但是 senior 的人都应该了解整个 E2E (end-to-end) 过程的。在Facebook 我们不分前端和后端,只分 proct 和 infrastructure。做 proct 的通常都是 full stack,不需要对特定的技术非常精通,但要求学习能力和灵活性足够好,不能只做自己 comfort zone 以内的事情,do whateverit takes to get your proct shipped。通常聪明的应届生都会先进入 proct,因为他们学什么都很快,也不会说浪费了在某个领域的积累。infrastructure 拥有更多各个领域的 specialist,前端只是其中之一。infrastructure 的客户就是 proct,要做的事情就是让 proct 开发实际产品时觉得爽,就这么简单。至于真正 senior 的人,必须了解整个 E2E 过程。这有点像那个“在浏览器地址栏按下回车后都发生了什么”的答案,也就是掌握大局同时了解细节。因为具体的问题可疑扔给 junior 的人去解决,所以 senior 的存在价值就是在众多问题当中寻找值得解决的问题。学过计算机体系结构的人都应该知道,性能优化只应该在瓶颈上做,因为做在非瓶颈上就是浪费资源。同理技术或产品的优化都应该是做在瓶颈上的,所以 senior 的人应该熟悉整套系统并且能够有效找到当前的瓶颈。这时候就不存在前端或者后端的概念了,因为specialist 在特定领域再精通,不了解整个 E2E 的过程就没办法再往上提升。提到“联调”,我想说我很久没听说过这个词了,因为这个词没有对应的英语版本,美国公司的产品开发过程通常不包括联调。proct 要做什么,就自己学习对应的技术,学习公司内部的 infrastructure,然后调用公司内部的 API 就可以了。一个产品的逻辑,要分前端和后端两个团队的人实现,然后还要协调实现的结果,这我只在中国公司见过。当然这不仅仅要求公司 infrastructure 好,还要求有开放的文化。
‘柒’ web编程里的前后端分离缺点是什么
简单来说,前后端分离的缺点是会让开发复杂化。对于大项目,这种方式是没有问题的。而对于小项目,这种其实是不合适的。
因为小项目可能一共就1-2个人开发维护,还要分前后端,这就增大了工作量。
‘捌’ Web项目开发为何要走前后端分离模式
如果是问“什么是正确的前后端分离”,我还真不敢回答,生怕自己的理解有什么偏差;但是问怎么“理解前后端分离”,那我可以结合自身的工作,谈谈我对前后端分离的理解,也欢迎大家提出不同的理解。
不过到了此阶段,在企业级项目的开发过程中,Java程序员依然要兼顾前后端的开发,所以前端页面的样子嘛,达不到美观的程度,也就是能用。
前后端分离有很多的好处:前端开发和后端开发可以各司其职,约定好接口之后就可以并行开发;后端接口可以复用,如果项目同时有电脑网页端、移动网页端、APP端等多个入口的时候,后端可以只有一个;
带来好处的同时,也会有一些缺点,例如:增加了架构的复杂性,如果技术能力不足的团队,可以考虑半分离(例如我们部门都是企业级应用,都没有前端开发人员);如果是面向互联网的应用,需要搜索引擎抓取,就需要服务器端渲染;另外前后端交互的接口,也需要花时间和精力设计。