旅游网站开发需求报告,做微信推文的网站,天津关键词排名推广,免费推广的预期效果最近在boss直聘上投了很多简历#xff0c;记录一下今天的面试题#xff0c;这个好几个都是电话直接打过来问时间方便#xff1f;我一回答方便就直接开始丢题目#xff0c;我也不知道哪个公司的。感觉公司不是很正规的感觉#xff0c;感觉那边有个问题题库#xff0c;面试… 最近在boss直聘上投了很多简历记录一下今天的面试题这个好几个都是电话直接打过来问时间方便我一回答方便就直接开始丢题目我也不知道哪个公司的。感觉公司不是很正规的感觉感觉那边有个问题题库面试官不够灵活读课本一样不说了看题 目录 1.原型链
2.token、session、cookie的区别
3.拦截器的作用
4.简述MVVM模型 1.原型链
所有的 JavaScript 对象都会从一个 prototype原型对象中继承属性和方法。
引用javascript——原型与原型链
2.token、session、cookie的区别
Cookie
cookie 是一个非常具体的东西指的就是浏览器里面能永久存储的一种数据仅仅是浏览器实现的一种数据存储功能。
cookie由服务器生成发送给浏览器浏览器把cookie以kv形式保存到某个目录下的文本文件内下一次请求同一网站时会把该cookie发送给服务器。由于cookie是存在客户端上的所以浏览器加入了一些限制确保cookie不会被恶意使用同时不会占据太多磁盘空间所以每个域的cookie数量是有限的。
Session
session 从字面上讲就是会话。这个就类似于你和一个人交谈你怎么知道当前和你交谈的是张三而不是李四呢对方肯定有某种特征长相等表明他就是张三。
session 也是类似的道理服务器要知道当前发请求给自己的是谁。为了做这种区分服务器就要给每个客户端分配不同的“身份标识”然后客户端每次向服务器发请求的时候都带上这个“身份标识”服务器就知道这个请求来自于谁了。至于客户端怎么保存这个“身份标识”可以有很多种方式对于浏览器客户端大家都默认采用 cookie 的方式。
服务器使用session把用户的信息临时保存在了服务器上用户离开网站后session会被销毁。这种用户信息存储方式相对cookie来说更安全可是session有一个缺陷如果web服务器做了负载均衡那么下一个操作请求到了另一台服务器的时候session会丢失。
Token
Token的引入Token是在客户端频繁向服务端请求数据服务端频繁的去数据库查询用户名和密码并进行对比判断用户名和密码正确与否并作出相应提示在这样的背景下Token便应运而生。
Token的定义Token是服务端生成的一串字符串以作客户端进行请求的一个令牌当第一次登录后服务器生成一个Token便将此Token返回给客户端以后客户端只需带上这个Token前来请求数据即可无需再次带上用户名和密码。最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名由token的前几位盐以哈希算法压缩成一定长的十六进制字符串可以防止恶意第三方拼接token请求服务器)。
使用Token的目的Token的目的是为了减轻服务器的压力减少频繁的查询数据库使服务器更加健壮。
基于 Token 的身份验证
使用基于 Token 的身份验证方法在服务端不需要存储用户的登录记录。大概的流程是这样的
客户端使用用户名跟密码请求登录服务端收到请求去验证用户名与密码验证成功后服务端会签发一个 Token再把这个 Token 发送给客户端客户端收到 Token 以后可以把它存储起来比如放在 Cookie 里或者 Local Storage 里客户端每次向服务端请求资源的时候需要带着服务端签发的 Token服务端收到请求然后去验证客户端请求里面带着的 Token如果验证成功就向客户端返回请求的数据
APP登录的时候发送加密的用户名和密码到服务器服务器验证用户名和密码如果成功以某种方式比如随机生成32位的字符串作为token存储到服务器中并返回token到APP以后APP请求时凡是需要验证的地方都要带上该token然后服务器端验证token成功返回所需要的结果失败返回错误信息让他重新登录。其中服务器上token设置一个有效期每次APP请求的时候都验证token和有效期。
那么我的问题来了 1.服务器上的token存储到数据库中每次查询会不会很费时。如果不存储到数据库应该存储到哪里呢。 2.客户端得到的token肯定要加密存储的发送token的时候再解密。存储到数据库还是配置文件呢
token是个易失数据丢了无非让用户重新登录一下新浪微博动不动就让我重新登录反正这事儿我是无所谓啦。 所以如果你觉得普通的数据库表撑不住了可以放到 MSSQL/MySQL 的内存表里不过据说mysql的内存表性能提升有限可以放到 Memcache里讲真这个是挺常见的策略可以放到redis里我做过这样的实现甚至可以放到 OpenResty 的变量字典里只要你有信心不爆内存。
token是个凭条不过它比门票温柔多了门票丢了重新花钱买token丢了重新操作下认证一个就可以了因此token丢失的代价是可以忍受的——前提是你别丢太频繁要是让用户隔三差五就认证一次那就损失用户体验了。
基于这个出发点如果你认为用数据库来保持token查询时间太长会成为你系统的瓶颈或者隐患可以放在内存当中。 比如memcached、redisKV方式很适合你对token查询的需求。 这个不会太占内存比如你的token是32位字符串要是你的用户量在百万级或者千万级那才多少内存。 要是数据量真的大到单机内存扛不住或者觉得一宕机全丢风险大只要这个token生成是足够均匀的高低位切一下分到不同机器上就行内存绝对不会是问题。
客户端方面这个除非你有一个非常安全的办法比如操作系统提供的隐私数据存储那token肯定会存在泄露的问题。比如我拿到你的手机把你的token拷出来在过期之前就都可以以你的身份在别的地方登录。 解决这个问题的一个简单办法 1、在存储的时候把token进行对称加密存储用时解开。 2、将请求URL、时间戳、token三者进行合并加盐签名服务端校验有效性。 这两种办法的出发点都是窃取你存储的数据较为容易而反汇编你的程序hack你的加密解密和签名算法是比较难的。然而其实说难也不难所以终究是防君子不防小人的做法。话说加密存储一个你要是被人扒开客户端看也不会被喷明文存储…… 方法1它拿到存储的密文解不开、方法2它不知道你的签名算法和盐两者可以结合食用。 但是如果token被人拷走他自然也能植入到自己的手机里面那到时候他的手机也可以以你的身份来用着这你就瞎了。 于是可以提供一个让用户可以主动expire一个过去的token类似的机制在被盗的时候能远程止损。
在网络层面上token明文传输的话会非常的危险所以建议一定要使用HTTPS并且把token放在post body里。
补充
cookie与session的区别
1、cookie数据存放在客户端上session数据放在服务器上。
2、cookie不是很安全别人可以分析存放在本地的COOKIE并进行COOKIE欺骗 考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多会比较占用你服务器的性能 考虑到减轻服务器性能方面应当使用COOKIE。
4、单个cookie保存的数据不能超过4K很多浏览器都限制一个站点最多保存20个cookie。
5、所以个人建议 将登陆信息等重要信息存放为SESSION 其他信息如果需要保留可以放在COOKIE中
3.拦截器的作用
二Axios封装的http拦截器 在请求或响应被 then 或 catch 处理前拦截它们分为请求拦截器发送请求前触发和响应拦截器得到响应结果后触发。在请求接口调用时触发 // 添加请求拦截器 axios.interceptors.request.use(function (config) { // 在发送请求之前做些什么 return config; }, function (error) { // 对请求错误做些什么 return Promise.reject(error); }); // 添加响应拦截器 axios.interceptors.response.use(function (response) { // 对响应数据做点什么 return response; }, function (error) { // 对响应错误做点什么 return Promise.reject(error); }); 注意一定要有返回值 4.简述MVVM模型
MVVM是Model-View-ViewModel的简写。它本质上就是MVC 的改进版。MVVM 就是将其中的View 的状态和行为抽象化让我们将视图 UI 和业务逻辑分开。当然这些事 ViewModel 已经帮我们做了它可以取出 Model 的数据同时帮忙处理 View 中由于需要展示内容而涉及的业务逻辑。
Model
我们可以把Model称为数据层因为它仅仅关注数据本身不关心任何行为格式化数据由View的负责这里可以把它理解为一个类似json的数据对象。
var data {val: 0
}; View
指的是所看到的页面和MVC/MVP不同的是MVVM中的View通过使用模板语法来声明式的将数据渲染进DOM当ViewModel对Model进行更新的时候会通过数据绑定更新到View。
div idmyappdivspan{{ val }}rmb/span/divdivbutton v-on:clicksub(1)-/buttonbutton v-on:clickadd(1)/button/div
/div ViewModel
mvvm模式的核心它是连接view和model的桥梁。它有两个方向
将Model转化成View即将后端传递的数据转化成所看到的页面。实现的方式是数据绑定。将View转化成Model即将所看到的页面转化成后端的数据。实现的方式是DOM 事件监听。这两个方向都实现的我们称之为数据的双向绑定。
new vue({el: #myapp,data: data,methods: {add(v) {if(this.val 100) {this.val v;}},sub(v) {if(this.val 0) {this.val - v;}}}
}); 总结
在MVVM的框架下视图View和模型Model是不能直接通信的。它们通过ViewModel来通信ViewModel通常要实现一个observer观察者当数据发生变化ViewModel能够监听到数据的这种变化然后通知到对应的视图做自动更新而当用户操作视图ViewModel也能监听到视图的变化然后通知数据做改动这实际上就实现了数据的双向绑定。并且MVVM中的View 和 ViewModel可以互相通信。
整体来看简化了业务与界面的依赖还解决了数据频繁更新以前用jQuery操作DOM很繁琐的问题。因为在MVVM中View不知道Model的存在ViewModel和Model也察觉不到View这种低耦合模式可以使开发过程更加容易提高应用的可重用性。
MVVM流程图如下 好啦本期的内容就分享到这里我们下期见 好书不厌百回读熟读自知其中意。让学习成为习惯用知识改变命运让博客见证成长用行动证明努力。 如果我的博客对你有帮助、如果你喜欢我的博客内容请 “点赞” “评论” “收藏” 一键三连哦 听说 点赞 的人运气不会太差每一天都会元气满满呦^ _ ^ ❤️ ❤️ ❤️ 码字不易大家的支持就是我坚持下去的动力。点赞后不要忘了 关注 我哦 更多精彩内容请前往 孙叫兽的博客 微信公众号【电商程序员】分享改变自己的项目。
如果以上内容有任何错误或者不准确的地方欢迎在下面 留个言。或者你有更好的想法欢迎一起交流学习~~~