热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

前端工作过程遇到的问题总结(一)

目录本地储存localStorage与cookie的区别输入一个url到返回页面,中间发生了什么?(面试)原生AJAX写法(面试&#

目录

本地储存localStorage与COOKIE的区别

输入一个url到返回页面,中间发生了什么?(面试)

原生AJAX写法(面试)

同源策略、跨域解决方案

Flexb布局



本地储存localStorage与COOKIE的区别


  • COOKIE在浏览器服务器之间来回传递

     sessionStorage和localStorage不会把数据发送给服务器,仅在本地保存

  • 数据有效期不同

     COOKIE只在设置的COOKIE过期时间之前一直有效,即使窗口或浏览器关闭。

     sessionStorage:仅在当前浏览器窗口关闭前有效。

     localStorage:始终有效,长期保存。

  • COOKIE数据还有路径的概念,可以限制COOKIE只属于某个路径下。
  • 存储大小也不同

       COOKIE数据不能超过4K,sessionStorage和localStorage虽然也有存储大小的限制,但比COOKIE大得多,可以达到5M或更大。

  • 作用域不同

    sessionStorage不在不同的浏览器窗口中共享;

    localStorage在所有同源窗口中都是共享的

    COOKIE也是在所有同源窗口中都是共享的

    Web Storage支持事件通知机制,可以将数据更新的通知发送给监听者。Web Storage的api接口使用更方便

输入一个url到返回页面,中间发生了什么?(面试)

在浏览器中输入url,客户端先检查本地是否有对应的ip地址,

  • 如果找到了则返回响应的ip地址
  • 如果没有找到则会请求DNS服务器,返回解析后的ip地址。

应用层客户端发送HTTP请求,包括请求头和请求体。其中请求头包含了重要的信息,包括请求的方法,目标url,遵循的协议,返回的信息是否需要缓存,客户端是否发送COOKIE等

然后传输层TCP协议传输报文,三次握手四次握手,三次握手,发送端发送带有SYN标示的数据给接收端,接收端接受到数据包后返回一个SYN/ACK标志的数据包表示确认信息,接收端接受后再发送一个带有ACK表示接到请求,连接成功。

再然后网络层ip协议查询mac地址,ip协议把TCP分割好的各种数据包发送给接收方,而要保证确实能传到接收方需要mac地址,物理地址是唯一的。ip地址和mac地址是一一对应的关系,一个网络设备可以换,但是mac地址是不能变的。

数据到达链路层,客户端发送请求的一端就完成了

服务端接受请求,在层层向上直到应用层。接受到HTTP请求后,查找资源并返回响应报文,响应报文有一个重要的信息就是状态码,返回数据渲染页面最后呈现给客户。

建议参考这个文档:输入URL到页面加载

原生AJAX写法(面试)

这是一篇转载的文章:原生Ajax写法

  • 原生Ajax的使用:

function ajax(url){var XHR= window.XMLHttpRequest ? new XMLHttpRequest() : ActiveXObject("microsoft.XMLHttp")XHR.open(method,url,true); // 第一参数是方法类型,第二个参数是url地址,第三个参数是设置是否同步XHR.send();XHR.onreadysattechange = () =>{// readyState值说明// 0,初始化,XHR对象已经创建,还未执行open// 1,载入,已经调用open方法,但是还没发送请求// 2,载入完成,请求已经发送完成// 3,交互,可以接收到部分数据// status值说明// 200:成功// 404:没有发现文件、查询或URl// 500:服务器产生内部错误if(XHR.readyState == 4 && XHR.status == 200){// 这里可以对返回的内容做处理// 一般会返回JSON或XML数据格式var data = XHR.responseTEXT;return data;// 主动释放,JS本身也会回收的XHR = null;}}  
}

  • get方法

function GET (url) {// 创建核心对象var XHR = window.XMLHttpRequest ? new XMLHttpRequest() : ActiveXObject("microsoft.XMLHttp")// 编写回调函数XHR.onreadystatechange = function () {if (XHR.readyState == 4 && XHR.status == 200) {let data = XHR.responseTEXT;return data;}}// open设置请求方式和请求路径XHR.open("get",url); // 后面还可以写是否同步// send 发送XHR.send();
}

  • post方法

function POST(url,data) {// 创建核心对象var XHR = window.XMLHttpRequest ? new XMLHttpRequest() : ActiveXObject("microsoft.XMLHttp")// 编写回调函数XHR.onreadystatechange = function () {if (XHR.readyState == 4 && XHR.status == 200) {let data = XHR.responseTEXT;return data;}}// open设置请求方式和请求路径XHR.open("post",url); // 后面还可以写是否同步// 设置请求头XHR.setRequestHeader("content-type","application/x-www-form-urlencode");// send 发送XHR.send(data);
}

同源策略、跨域解决方案

同源策略

  • 什么是源

 源(origin)就是协议、域名和端口号

若地址里面的协议、域名和端口号均相同则属于同源。

以下是相对 http://www.a.com/test/index.html的同源检测

  1. http://www.a.com/content/list.html --成功
  2. http://www.child.a.com/test/index.html --失败,域名不同
  3. https://www.a.com/test/index.html --失败,协议不同
  4. http://www.a.com:8080/test/index.html --失败,端口号不同

  • 同源策略

同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读取对方资源。所以a.com下的js脚本采用ajax读取b.com里面的文件数据是会报错的。

  • 不受同源策略限制的

  1. 页面中的链接,重定向以及表单提交是不会受到同源策略限制的。
  2. 跨域资源的引入是可以的。但是js不能读写加载的内容。如嵌入到页面中的,,,

跨域

  • 什么是跨域

前面所讲的浏览器同源策略的影响,不是同源的脚本不能操作其他源下面的对象。想要操作另一个源下的对象是需要跨域。

  • 跨域的实现形式

1. 降域 document.domain

同源策略认为域和子域属于不同的域,如:

child.a.com与a.com
child.a.com与child2.a.com
xxx.child1.a.com与child1.a.com

两两不同源,可以通过设置document.domain='a.com',浏览器就会认为它们都是同一个源。想要实现以上任意两个页面之间的通信,两个页面必须都设置document.domain='a.com'.

此方式的特点:

  1. 只能在父域名与子域名之间使用,且将xxx.child1.a.com域名设置为a.com后,不能再设置child1.a.com
  2. 存在安全性问题,当一个站点被攻击后,另一个站点会引起安全漏洞。
  3. 这种方法只适用于COOKIE和iframe

2. JSONP跨域

JSONP和JSON并没有什么关系!

JSON的原理:在a.com的jsonp.html里创建一个回调函数xxx,动态添加元素,向服务器发送请求,请求地址后面加上查询字符串,通过callback参数指定回调函数的名字。请求地址为http://b.com/main.js?callback=xxx。在main.js中调用这个回调函数xxx,并且以JSON数据形式作为参数传递,完成回调。如下面的代码:

function addScriptTag(src) { var script = document.createElement('script'); script.setAttribute("type","text/Javascript"); script.src = src; document.body.appendChild(script);
}
// window.onload是为了让页面加载完成后再执行
window.onload = function () { addScriptTag('http://b.com/main.js?callback=foo');
}
function foo(data) { console.log(data.name+"测试");
};

这样便实现了跨域的参数传递。

采用jsonp跨域也存在问题:

  1. 使用这种方法,只要是个网站都可以拿到b.com里的数据,存在安全性问题。需要网站双方商议进行基本的token的身份验证
  2. 只能是GET,不能POST
  3. 可能被注入恶意代码,篡改页面内容,可以采用字符串过滤来规避此问题

3. CORS

CORS是一个W3C标准,全程是“跨域资源共享”(Cross-origin resource sharing)

它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。

刚才的例子中,在b.com里面添加响应头声明允许a.com的访问,代码: Access-Control-Allow-Origin: http://a.com 然后a.com就可以用ajax获取b.com里的数据了。

注意:此方法IE8以下完全不支持,IE8-10部分支持。详见caniuse-CORS 详细内容请参考:跨域资源共享 CORS 详解

4. 其他方法

  1. HTML5的postMessage方法
  2. window.name
  3. location.hash

Flexb布局

这里可以看我的另外一篇文章:快速入门Flex布局


推荐阅读
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
author-avatar
杜_森后_665
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有