跨域创建Cookie

  |  
 阅读次数

跨域创建Cookie

要想浏览器处理 CORS 跨域中的 Cookie 只需要分别在网页以及服务端作出一点点改变:

1.前端,对于跨域的 XMLHttpRequest 请求,需要设置 withCredentials 属性为 true

前端xhr设置

1
2
3
4
5
6
7
8
url: settings_1.settings.pathAPI + path,
method: 'post',
data: { },
transformRequest: [
function (data) { }
],
withCredentials: true, // [开启 跨站点 证书 访问控制]
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }

开启 跨站点 证书 访问控制


2.服务端,响应中必须携带 Access-Control-Allow-Credentials: true 首部。
如果服务端的响应中未携带Access-Control-Allow-Credentials: true 首部,浏览器将不会把响应的内容返回给发送者。

服务器跨域设置

1
2
3
4
5
6
7
8
let url = requestData.getHeader("Origin");
// console.log("OriginUrl::", url);

responseData.setHeader('Access-Control-Allow-Origin', url)
responseData.setHeader('Access-Control-Allow-Methods', 'POST')
responseData.setHeader('Access-Control-Allow-Headers', 'x-requested-with,content-type')
responseData.setHeader("Access-Control-ALLOW-Credentials", "true") // 跨域设置cookie
responseData.renderJSON(callback)


总结要想设置和获取跨域 Cookie,上面提到的两点缺一不可。
另外有一点需要注意的是:规范中提到,如果 XMLHttpRequest 请求设置了 withCredentials 属性,那么服务器不得设置 Access-Control-Allow-Origin的值为* ,否则浏览器将会抛出The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' 错误。


参考文献

作者:ken_ljq; 來源:简书

Docker-mongo

  |  
 阅读次数

Docker下的mongo操作

DockerShell访问和查看MongoDB日志
docker exec命令允许您在docker容器中运行命令。下面的命令行将在mongo容器中为您提供一个bash shell:

docker ps // 查看docker进程管理器获得进程NAMES
$ docker exec -it [some-mongo] bash

The MongoDB Server log is available through Docker’s container log:

> $ docker logs [some-mongo]

原文连接

WebPack

  |  
 阅读次数

webpack详解

原文出处: WsmDyj

webpack是一个打包工具,他的宗旨是一切静态资源即可打包
有人就会问为什么要webpack?webpack是现代前端技术的基石,常规的开发方式,比如jquery,html,css静态网页开发已经落后了(也可以配合webpack技术开发)。现在是MVVM的时代,数据驱动界面。webpack将现代js开发中的各种新型有用的技术,集合打包。

webpack生态圈:
webpack生态圈

webpack4.0的配置(实际上是Node干活)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
const path = require('path'); //引入node的path模块
const webpack = require('webpack'); //引入webpack,使用lodash
const HtmlWebpackPlugin = require('html-webpack-plugin') //将html打包
const ExtractTextPlugin = require('extract-text-webpack-plugin') //打包的css拆分,将一部分抽离出来
const CopyWebpackPlugin = require('copy-webpack-plugin')
// console.log(path.resolve(__dirname,'dist')); // 物理地址拼接
module.exports = {
entry: './src/index.js', //入口文件 在vue-cli main.js
output: { //webpack如何输出
path: path.resolve(__dirname, 'dist'), //定位,输出文件的目标路径
filename: '[name].js'
},
module: { //模块的相关配置
rules: [ //根据文件的后缀提供一个loader,解析规则
{
test: /\.js$/, //es6 => es5
include: [
path.resolve(__dirname, 'src')
],
// exclude:[], 不匹配选项(优先级高于test和include)
use: 'babel-loader'
},
{
test: /\.less$/,
use: ExtractTextPlugin.extract({
fallback: 'style-loader',
use: [
'css-loader',
'less-loader'
]
})
},
{ //图片loader
test: /\.(png|jpg|gif)$/,
use: [
{
loader: 'file-loader' //根据文件地址加载文件
}
]
}
]
},
resolve: { // 解析模块的可选项
// modules: [ ] // 模块的查找目录 配置其他的css等文件
extensions: [".js", ".json", ".jsx", ".less", ".css"], //用到文件的扩展名
alias: { //模快别名列表
utils: path.resolve(__dirname, 'src/utils')
}
},
plugins: [ // 插进的引用, 压缩,分离美化
new ExtractTextPlugin('[name].css'), // [name] 默认 也可以自定义name 声明使用
new HtmlWebpackPlugin({ // 将模板的头部和尾部添加css和js模板,dist 目录发布到服务器上,项目包。可以直接上线
file: 'index.html', // 打造单页面运用 最后运行的不是这个
template: 'src/index.html' // vue-cli放在根目录下
}),
new CopyWebpackPlugin([ // src下其他的文件直接复制到dist目录下
{
from: 'src/assets/favicon.ico',
to: 'favicon.ico'
}
]),
new webpack.ProvidePlugin({ //引用框架 jquery lodash工具库是很多组件会复用的,省去了import
'_': 'lodash' //引用webpack
})
],
devServer: { //服务于webpack-dev-server 内部封装了一个express
port: '8080',
before(app) {
app.get('/api/test.json', (req, res) => {
res.json({
code: 200,
message: 'Hello World'
})
})
}
}
}

一、前端环境搭建

使用 npmyarn 来安装 webpack

1
2
3
npm install `webpack` `webpack-cli` -g 
# 或者 ||
yarn global add `webpack` `webpack-cli`

为什么webpack分为两个文件呢?
webpack3中,webpack本身和它的cli以前都是在同一个包中;
但在第4版中,他们已经将两者分开来更好地管理它们。

新建一个webpack的文件夹,在其下新建一个try-webpack ( 防止init时项目名和安装包同名 ) 并初始化和配置webpack。

npm init -y // -y 默认所有的配置

yarn add webpack webpack-cli -D // -D webpack安装在devDependencies环境中

二、部署webpack

在上面搭建好的环境项目中,我们来到package.json里配置我们的scripts,让webpack

1
2
3
4
5
6
7
8
9
{
"scripts": {
"build": "webpack --mode production" //我们在这里配置,就可以使用npm run build 启动我们的webpack
},
"devDependencies": {
"webpack": "^4.16.0",
"webpack-cli": "^3.0.8"
}
}

配置好我们webpack的运行环境时,联想下vue-cli
平时使用vue-cli会自动帮我们配置并生成项目。
我们在src下进行项目的开发,最后 npm run build 打包生成我们的dist的目录。
不知道你是否还记得,还是让我们进入下一节让我们感受下这其中的整个流程吧。

三、npm run build 发生了什么

在我们的根项目下try-webpack新建一个src目录。在src目录下新建一个index.js文件。
在里面我们可以写任意的代码,以案例为主:

const a = 1;

写完后, 在终端运行命令 npm run build ;会发现新增了一个dist目录,里面存放着webpack打包好的main.js文件。
这和我们在vue-cli里操作是一样的。

四、webpackp配置流程篇

我们在开发是一般会打包src下的什么文件呢?我们可以回忆一下,其实vue-cli项目src下不就这几点嘛:

  • 发布时需要的html,css,js
  • css预编译器stylus,less,sass
  • es6的高级语法
  • 图片资源.png,.gif,.ico,.jpg
  • 文件间的require
  • 别名@等修饰符

分几点来讲解webpack中webpack.config.js的配置,跟着脚步,一步一步的来完成我们的流程线。

✍️Html在webpack中的配置

在项目的根目录try-webpack下新建webpack.config.js文件,以commonJS模块化机制向外输出,并且新建一个index.html

module.exports = { }

配置我们的入口entry,在vue-cli里相当于根目录下的main.js,我们的出口output
我们可以把webpack理解为一个工厂,进入相当于把各种各样的原料放进我们的工厂了,然后工厂进行一系列的打包操作把打包好的东西,向外输出,然后就可以去出售了(上线)。

1
2
3
4
5
6
7
8
9
const path = require('path'); // 引入我们的node模块里的path
// 测试下 console.log(path.resolve(__dirname,'dist')); // 物理地址拼接
module.exports = {
entry: './src/index.js', // 入口文件 在vue-cli main.js
output: { // webpack如何向外输出
path: path.resolve(__dirname, 'dist'), // 定位,输出文件的目标路径
filename: '[name].js' // 文件名[name].js默认,也可自行配置
},
}

HTML打包 需要 安装/引入 html-webpack-plugin

yarn add html-webpack-plugin -D // 在开发环境中安装

const HtmlWebpackPlugin = require(‘html-webpack-plugin’) //引入打包我们的HTML

在module.exports里配置我们的plugins(插件):

1
2
3
4
5
6
plugins: [  //插进的引用, 压缩,分离美化
new HtmlWebpackPlugin({ // 将模板的头部和尾部添加css和js模板, dist 目录发布到服务器上,项目包。可以直接上线
file: 'index.html', // 打造单页面运用 最后运行的不是这个
template: 'src/index.html' // vue-cli放在跟目录下
}),
],

配置好后,在终端输入npm run dev后webpack将我们的html打包好并且自动将js引进来。

1
2
3
4
<body>
<p class="main">Hello World</p>
<script type="text/javascript" src="main.js"></script>
</body>

live-sever 我们的dist目录,启动一个8080端口,我们就可以看到我们的Hello World了。这就是我们上线版的页面。

css在webpack中的配置

vue-cli里,我们可以使用css去写我们的样式,也可以使用高级stylus,less,sass等预编译器。这里就以less为例,看看webpack怎么将他打包成一个css。

1
2
3
.main {
color: red;
}

src目录下新建我们的style.less文件,在配置之前我们需要npm安装我们的css-loadersass-loadersass、less

yarn add css-loader less less-loader style-loader -D

执行完上述命令我们在 packge.json 里可以看到我们的配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
"devDependencies": {

"css-loader": "^1.0.0",

"html-webpack-plugin": "^3.2.0",

"sass": "^1.9.0",

"sass-loader": "^7.0.3",

"webpack": "^4.16.0",

"webpack-cli": "^3.0.8"

}

安装好后,开始配置webpack.config.js文件。
这里申明一下,css 在 dist 目录下 需要和 HTML分离,还需引入extract-text-webpack-plugin,先安装

yarn add extract-text-webpack-plugin -D

npm install extract-text-webpack-plugin -D

这里有一个坑,extract-text-webpack-plugin4.0并不支持这样的安装,可自行chrome。
换一种方式,选择4.00-beta.0版本

yarn add extract-text-webpack-plugin@last -D

来到我们的module.exports里,完成moudel的配置


阅读原文

剖析JS属性、方法

  |  
 阅读次数

剖析JS属性、方法

玩转JavaScript,得有很扎实的基础,基础体现在哪?其中一个最重要的点就是对JavaScript的属性和方法有足够的了解和认识。这里,我会带大家一起来彻底消灭这些盲点(对JavaScript属性和方法的分类还存在模糊的印象)。

一、属性

JS属性四种类型:私有属性原型属性实例属性类属性

区别和使用:

1
2
3
4
5
6
var a = function () {
var x = 'a'; // 私有属性
this.z = 'c'; // 实例属性
}
a.y = 'b'; // 类属性
a.prototype.m = 'd'; // 原型属性

1
2
3
4
5
6
7
8
9
10
var t1 = new a();
console.log(t1.x) // undefined [`实例`不能访问`私有变量`,私有变量只在`函数内`使用]
console.log(t1.y) // undefined [`实例`不能访问`类属性`,类属性只有类本身才能访问,实例不能访问]
console.log(t1.z) // c [`实例`访问`实例属性`]
console.log(t1.m) // d [`实例`访问`原型属性`]

console.log(a.x) // undefined [`类`不能访问`私有变量`,私有变量只在`函数内`使用]
console.log(a.y) // b [`类属性`只有类本身才能访问]
console.log(a.z) // undefined [`类`本身无法访问`实例属性`]
console.log(a.m) // undefined [`类`本身无法访问`原型属性`]

注意总结

  1. 私有变量只能在函数内使用。
  2. 实例属性原型属性拥有相同变量时,优先访问实例属性
  3. 如上变量y,只有类本身才能访问`类属性,实例不能访问。

二、方法

方法类型:静态方法实例方法内部方法

  1. 静态方法(不能被实例对象调用)

    1
    2
    3
    4
    5
    6
    7
    8
    var b = function() {}
    b.f1 = function() { // 定义一个`静态方法`
    console.log('静态方法')
    }
    b.f1() // 静态方法

    var c = new b()
    c.f1() // c.f1 is not a function
  2. 实例方法(注意访问优先级)

JS定义一个实例方法有三种方式:
① 构造函数中使用this
② 直接绑定在实例
③ 绑定在原型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var b = function() {
this.method1 = function() {
console.log('this')
}
} // 构造函数`this`

var c = new b()
c.method1 = function() {
console.log('instance')
} // `实例`绑定

b.prototype.method1 = function() {
console.log('prototype')
} // `原型`绑定

总结

上述代码展示了三种方式定义实例方法

执行顺序:实例上绑定的优先级高于this上绑定的,this上绑定的高于原型上绑定的实例方法。

实例上绑定 > this上绑定 > 原型上绑定

  1. 内部方法(只能内部调用)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    var b = function() {
    var method1 = function() {
    console.log('method1')
    }
    var method2 = function() {
    console.log('method2')
    method1()
    }
    this.method3 = function() {
    method2()
    }
    }

    var c = new b()
    c.method1() // c.method1 is not a function
    c.method3() // method2 method1

上面代码定义了两个内部方法method1method2。由运行结果可知,内部方法method1和method2只能在函数内部调用,外部通过实例对象无法找到该方法。

最后总结一下:

通过这篇文章,我们知道了属性的定义,属性分私有属性原型属性实例属性类属性,这四种,它们各自是怎么定义,及访问原则。同时我们也知道了方法的定义,方法分静态方法实例方法内部方法三种,主要注意一下它们的调用,及实例方法的三种创建形式

属性的定义[4种]
1· 私有属性
2· 原型属性
3· 实例属性
4· 类属性

方法的定义[3种]
1· 静态方法
2· 实例方法
3· 内部方法

知乎-跳槽有术

  |  
 阅读次数

在这个高度不确定的时代,我们到底该如何跳槽?

序言:

“这是最好的时代,也是最坏的时代,这是智慧的时代,也是愚蠢的时代;这是信仰的时期,也是怀疑的时期;这是光明的季节,也是黑暗的季节;这是希望之春,也是失望之冬;我们拥有一切,我们一无所有;有人直登天堂,有人坠入地狱。”英国作家狄更斯在100多年前的名著《双城记》中写下的这段话,放在今天的中国职场,依然无比贴切。

这确实是一个剧烈变化、节奏飞快、充满了不确定性的时代,对职场人而言尤其如此。那种一个企业待到老,一直工作到退休的时代已经一去不复返了,取而代之的是频繁的跳槽。

LinkedIn(领英)《2018中国人才招聘趋势报告》显示,中国职场人跳槽周期逐年缩短,平均在职时间从两年前的34个月缩短到22个月,也就意味着很多人不到2年就会换一次工作,而就笔者这十几年招聘工作的一线观察,90后跳槽的频率更高,很多刚毕业的年轻人每年都会换一次工作,一年换2-3次工作的也为数不少。于是,有人戏称,职场人不是在跳槽的路上,就是在准备跳槽。

国企 打破 终身制,中国中小企业的平均寿命只有2.5年

职场人来说,跳槽换工作是所有职场人的必修课

企业来说,员工跳槽、人才流动也是所有企业都必须面对的残酷现实。

很多人都明白跳槽是不可避免的,但是:

1
2
3
4
5
6
7
8
9
10
11
12
13
怎么跳槽才能跳的更好?

怎么跳槽才能不跳到坑里?

什么时间跳槽比较合适?

如何高效的跳槽?

如何规避跳槽的各种风险?

如何在跳槽时为自己争取一份更好的薪水?

如何应对背景调查等等一系列问题

正文阅读


2018年7月23日 17:08:05 待续