产生跨域问题的原因跨域问题是由于浏览器同源策略,同源策略限制从一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的关键的安全机制。 一个源的定义:如果协议,端口(如果指定了一个)和域名对于两个页面是相同的,则两个页面具有相同的源。 如https://www.github.com:80,https是协议,80是端口,www.github.com是域名。有一个不同,则不同源。 下表给出了相对http://store.company.com/dir/page.html同源检测的示例: URL 结果 原因 http://store.company.com/dir2/other.html 成功 dir2/other.html http://store.company.com/dir/inner/another.html 成功 dir/inner/another.html http://store.company.com/dir/inner/another.html 失败 不同的协议 ( https ) http://store.company.com:81/dir/etc.html 失败 不同的端口 ( 81 ) http://news.company.com/dir/other.html 失败 不同的域名 ( news ) 解決方法1、使用jsonp 2、服务端代理 在服务器端设置一个代理,由服务器端向跨域下的网站发出请求,再将请求结果返回给前端,成功避免同源策略的限制。 3、HTTP访问控制CORS 设置Access-Control-Allow-Origin。
网络层
第7层应用层:OSI中的最高层。为特定类型的网络应用提供了访问OSI环境的手段,处理网络应用。常见的协议有:HTTP,HTTPS,FTP,TELNET,SSH,SMTP,POP3等。 第6层表示层:(数据表示)主要用于处理两个通信系统中交换信息的表示方式。为上层用户解决用户信息的语法问题。它包括数据格式交换、数据加密与解密、数据压缩与终端类型的转换。 不用协议. 第5层会话层:(互联主机通信)在两个节点之间建立端连接。为端系统的应用程序之间提供了对话控制机制。此服务包括建立连接是以全双工还是以半双工的方式进行设置,尽管可以在层4中处理双工方式 ;会话层管理登入和注销过程。 不用协议. 第4层传输层:(端到端连接)常规数据递送;面向连接或无连接。为会话层用户提供一个端到端的可靠、透明和优化的数据传输服务机制。 包括全双工或半双工、流控制和错误恢复服务;传输层把消息分成若干个分组,并在接收端对它们进行重组。不同的分组可以通过不同的连接传送到主机。这样既能获得较高的带宽,又不影响会话层。在建立连接时传输层可以请求服务质量,该服务质量指定可接受的误码率、延迟量、安全性等参数,还可以实现基于端到端的流量控制功能。 协议:TCP • UDP • DCCP • SCTP • RTP • RSVP • PPTP… 第3层网络层:(寻址和最短路径)本层通过寻址来建立两个节点之间的连接,为源端的运输层送来的分组,选择合适的路由和交换节点,正确无误地按照地址传送给目的端的运输层。它包括通过互连网络来路由和中继数据 ;除了选择路由之外,网络层还负责建立和维护连接,控制网络上的拥塞以及在必要的时候生成计费信息。协议:IP (IPv4 • IPv6) • ARP • RARP • ICMP • ICMPv6 • IGMP • RIP • OSPF • BGP • IS-IS • IPsec … 第2层 ...
Windows下启动mongo
C:\Program Files\MongoDB\Server\3.4\bin> .\mongod --dbpath D:\MGDB //dbpath 指定数据存放地址 mongoose简单使用 连接 var connection = mongoose.createConnection('mongodb://localhost:27017/test');var db = connection.model('Tank', yourSchema); 保存 var Tank = db.model('Tank', yourSchema);var small = new Tank({ size: 'small' });small.save(function (err) { if (err) return handleError(err); // saved!})// orTank.create({ size: 'small' }, function (err, small) { if (err) return handleError(err); // saved!}) 删除 Tank.remove({ size: 'large' }, function (err) { if (err) return handleError(err); // removed!});
Js的小技巧
匿名函数 自执行1.什么是自执行的匿名函数?它是指形如这样的函数: (function {// code})(); 2.匿名函数的好处在于:可以减少局部变量,以免污染现有的运行环境。 3.疑问为什么(function {// code})();可以被执行, 而function {// code}();却会报错? 4.分析 (1). 首先, 要清楚两者的区别:(function {// code})是表达式, function {// code}是函数声明. (2). 其次, js”预编译”的特点:js在”预编译”阶段, 会解释函数声明, 但却会忽略表式. (3). 当js执行到function() {//code}();时, 由于function() {//code}在”预编译”阶段已经被解释过, js会跳过function(){//code}, 试图去执行();, 故会报错;当js执行到(function {// code})();时, 由于(function {// code})是表达式, js会去对它求解得到返回值, 由于返回值是一 个函数, 故而遇到();时, 便会被执行. 另外, 函数转换为表达式的方法并不一定要靠分组操作符(),我们还可以用void操作符,~操作符,!操作符,,+,-等一元操作符如: !function(){ alert("另类的匿名函数自执行");}(); 判断是否是Arrayinstanceof 判断var ary = [1,23,4];console.log(ary instanceof Array) //true; 从输出的效果来看,还是挺令人满意的,能准确的检测出数据类型是否是数组,不要高兴的太早,大家先想想这个的缺点 原型链方法var ary = [1,23,4];console.log(ary.__prot ...
HTTP(HyperText Transfer Protocol,超文本传输协议)
HTTP是一个应用层协议,虽然在2015年已推出HTTP/2版本,并被主要的web浏览器和web服务器支持。但目前使用最广泛的还是HTTP/1.1版本。有关历史请查阅这里。它的主要特点可概括如下: 支持客户/服务器模式。 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。为了解决这个问题, Web程序引入了Cookie机制来维护状态。 另外,HTTP请求报文和响应报文都是由开始行(对于请求消息,开始行就是请求行,对于响应消息,开始行就是状态行),消息报头(可选),空行(只有CRLF的行),消息正文(可选)组成。将在下面详细讲解。 请求报文结构报文中的数据都使用ASCII编码,各个字段的长度是不确定的(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。 请求报文样例POST /search HTTP/1.1Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint,application/msword, application/x-silverlight, applic ...
Http状态码
HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码。它由 RFC 2616 规范定义的,并得到RFC 2518、RFC 2817、RFC 2295、RFC 2774、RFC 4918等规范扩展。 消息(1字头)编辑这一类型的状态码,代表请求已被接受,需要继续处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束。由于 HTTP/1.0 协议中没有定义任何 1xx 状态码,所以除非在某些试验条件下,服务器禁止向此类客户端发送 1xx 响应。 100 Continue客户端应当继续发送请求。这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。服务器必须在请求完成后向客户端发送一个最终响应。 101 Switching Protocols服务器已经理解了客户端的请求,并将通过Upgrade 消息头通知客户端采用不同的协议来完成这个请求。在发送完这个响应最后的空行后,服务器将会切换到在Upgrade 消息头中定义的那些协议。只有在切换新的协议更有好处的时候才应该采取类似措施。例如,切换到新的HTTP 版本比旧版本更有优势,或者切换到一个实时且同步的协议以传送利用此类特性的资源。 102 Processing由WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行。 成功(2字头)编辑这一类型的状态码,代表请求已成功被服务器接收、理解、并接受[1] 。 200 OK请求已成功,请求所希望的响应头或数据体将随此响应返回。 201 Created请求已经被实现,而且有一个新的资源已经依据请求的需要而建立,且其 URI 已经随Location 头信息返回。假如需要的资源无法及时建立的话,应当返回 ‘202 Accept ...
ES6相关知识记录
ES6相关知识记录持续更新… :imp: 展开运算符展开运算符(spread)是三个点(…),可以将数组转为用逗号分隔的参数序列。在数组合并、函数传参,会快捷很多。 let arr = [2,3,4]console.log([1,...arr,5]);//[1,2,3,4,5]//函数传参function myFunction(x, y, z) { }let args = [0, 1, 2];myFunction(...args);//数据解构let cold = ['autumn', 'winter'];let warm = ['spring', 'summer'];// 析构数组let otherSeasons, autumn;[autumn, ...otherSeasons] = cold;otherSeasons // => ['winter'] 模板字符串ES6引入了一种新型的字符串字面量语法,我们称之为模板字符串(template strings)。除了使用反撇号字符 ` 代替普通字符串的引号 ‘ 或 “ 外,它们看起来与普通字符串并无二致。在最简单的情况下,它们与普通字符串的表现一致: let str = `Ceci n'est pas une chaîne.`;typeof str //"string" 它为JavaScript提供了简单的字符串插值功能,从此以后,你可以通过一种更加美观、更加方便的方式向字符串中插值了。 let name = 'Tom';console.log(`my name is ${name}`);//my name is Tom 模板字符串的一些细节: 模板占位符中的代码可以是任意JavaScript表达式,所以函数调用、算数运算等这些都可以作为占位符使用,你甚至可以在一个模 ...
知识记录
块级元素(哪些是块级元素)div、p(paragraph)、form、h1,2…、menu、blockquote 、ol(order list)、ul(unorder list)、pre(格式化文本)等都是块级元素。 块级元素:block element每个块级元素默认占一行高度,一行内添加一个块级元素后无法一般无法添加其他元素(float浮动后除外)。两个块级元素连续编辑时,会在页面自动换行显示。块级元素一般可嵌套块级元素或行内元素; 块级元素一般作为容器出现,用来组织结构,但并不全是如此。有些块级元素,如只能包含块级元素。其他的块级元素则可以包含 行级元素如.也有一些则既可以包含块级,也可以包含行级元素。 行内元素:inline element也叫内联元素、内嵌元素等;行内元素一般都是基于语义级 (semantic) 的基本元素,只能容纳文本或其他内联元素,常见内联元素 “a”。比如 SPAN 元素,IFRAME元素和元素样式的 display : inline 的都是行内元素。例如文字这类元素,各个字母 之间横向排列,到最右端自动折行。 元素继承不可继承的:display、margin、border、padding、background、height、min-height、max- height、width、min-width、max-width、overflow、position、left、right、top、 bottom、z-index、float、clear、table-layout、vertical-align、page-break-after、 page-bread-before和unicode-bidi。 所有元素可继承:visibility和cursor。 内联元素可继承:letter-spacing、word-spacing、white-spac ...
javascript中call
call() 方法调用一个函数, 其具有一个指定的this值和分别地提供的参数(参数的列表)。 语法fun.call(thisArg[, arg1[, arg2[, …]]]) 参数thisArg在fun函数运行时指定的this值。需要注意的是,指定的this值并不一定是该函数执行时真正的this值,如果这个函数处于非严格模式下,则指定为null和undefined的this值会自动指向全局对象(浏览器中就是window对象),同时值为原始值(数字,字符串,布尔值)的this会指向该原始值的自动包装对象。 arg1, arg2, …指定的参数列表。 返回值返回结果包括指定的this值和参数。 描述可以让call()中的对象调用当前对象所拥有的function。你可以使用call()来实现继承:写一个方法,然后让另外一个新的对象来继承它(而不是在新对象中再写一次这个方法)。 示例使用call方法调用父构造函数在一个子构造函数中,你可以通过调用父构造函数的 call 方法来实现继承,类似于Java中的写法。下例中,使用 Food 和 Toy 构造函数创建的对象实例都会拥有在 Product 构造函数中添加的 name 属性和 price 属性,但 category 属性是在各自的构造函数中定义的。 function Product(name, price) { this.name = name; this.price = price; if (price < 0) { throw RangeError('Cannot create product ' + this.name + ' with a negative price'); }}function Food(name, p ...
HTTP缓存
介绍缓存的好文 HTTP报文浏览器向服务器请求数据,发送请求(request)报文;服务器向浏览器返回数据,返回响应(response)报文。报文信息主要分为两部分 1.包含属性的首部(header)————————–附加信息(cookie,缓存信息等)与缓存相关的规则信息,均包含在header中 2.包含数据的主体部分(body)———————–HTTP请求真正想要传输的部分 缓存规则HTTP缓存有多种规则,根据是否需要重新向服务器发起请求来分类,可将其分为两大类(强制缓存,对比缓存) 强制缓存如果生效,不需要再和服务器发生交互,而对比缓存不管是否生效,都需要与服务端发生交互。 两类缓存规则可以同时存在,强制缓存优先级高于对比缓存,也就是说,当执行强制缓存的规则时,如果缓存生效,直接使用缓存,不再执行对比缓存规则。 强制缓存对于强制缓存来说,响应header中会有两个字段来标明失效规则(Expires/Cache-Control) Expires Expires的值为服务端返回的到期时间,即下一次请求时,请求时间小于服务端返回的到期时间,直接使用缓存数据。不过Expires 是HTTP 1.0的东西,现在默认浏览器均默认使用HTTP 1.1,所以它的作用基本忽略。另一个问题是,到期时间是由服务端生成的,但是客户端时间可能跟服务端时间有误差,这就会导致缓存命中的误差。所以HTTP 1.1 的版本,使用Cache-Control替代。 Cache-ControlCache-Control 是最重要的规则。常见的取值有private、public、no-cache、max-age,no-store,默认为private。private: 客户端可以缓存public: 客户端和代理服务器都可缓存(前端的同学,可以认为public ...