工作闲暇的期间,会读一些博文,更多的是刷面筋,虽然已经工作稳定。但还是偶尔需要有危机感,去看看现在企业喜欢问什么问题。其实大部分面筋问题都还不是很会。会把知识盲区记录下来,然后整理成博文
这次差不多有Css超出省略
、企业SSO的实现原理
、自写Promis
css超出省略
css单行超出省略
1 | width: 100px; |
css多行超出省略
1 | overflow: hidden; |
企业sso(单点登陆的实现)
理解
1 | sso单点登录,我理解的就是,在一个专门登陆的系统登录后,此后所有类似的系统都不用再写登陆页登陆。 |
实现
1 | 1. 用户进入某应用(未登陆) |
场景
- 若
应用
与sso登陆
是在同域,
- cookie不能跨域
- 应用与sso后台的session也不能共享
1
2
3
4
5// sso登陆: sso.xxx.com;
// 应用: app.xxx.com
// cookie存储在顶域: xxx.com
// 多个系统session共享,如common session
- 若
应用
与sso登陆
不是在同一个域.1
2
3
4
5
61. 用户访问app系统
2. 跳转到cas server sso登陆页
3. 登陆成功,session存储在sso的后台中,浏览器中写入sso所在域的cookie
4. sso登陆系统完成后会生成一个service tickets,相当于一个门票。然后跳转到app页面,同时将这个门票作为参数。
5. app系统拿到这个门票后,从后台向sso发送请求(不会有跨域问题),判断这个门票是否有效
6. 通过验证后,就会在app所在域里也写入这个cookie,这样下次打开就不用再登陆。
自写promise
1 |
|
then 方法
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
Promise.prototype.then = function(onFuifilled, onRejected){
onFuifilled = typeof onFuifilled === "function" ? onFuifilled : (value)=>{ return value };
onReject = typeof onReject === "function" ? onReject : (error)=>{ throw error };
let self = this;
let promise2 = new Promise((resolve,reject)=>{
if(self.status === "pending"){
self.onResolveCallback.push(()=>{
setTimeout(()=>{
try {
let x = onFuifilled(self.value);
resolvePromise(promise2, x, resolve, reject);
}catch(err){
reject(err)
}
},0)
});
self.onRejectCallback.push(()=>{
setTimeout(()=>{
try {
let x = onRejected(self.reason);
resolvePromise(promise2, x, resolve, reject);
}catch(err){
reject(err);
}
},0)
})
}else if(self.status === "resolved"){
setTimeout(()=>{
try {
let x = onFuifilled(self.value);
resolvePromise(promise2, x, resolve, reject);
}
}, 0)
}else if(self.status === "rejected"){
setTimeout(()=>{
try {
let x = onRejected(self.reason);
resolvePromise(promise2, x, resolve, reject);
}
},0)
}
});
return promise2;
}catch 方法
1
2
3Promise.prototype.catch = (onRejected)=>{
return this.then(null,onRejected);
}finanlly 方法
1
2
3
4
5
6
7
8
9Promise.prototype.finanlly = function(fn){
return this.then((data)=>{
setTimeout(fn, 0);
return data;
},(reason)=>{
setTimeout(fn, 0);
throw reason
})
}
done 方法
1
2
3
4
5Promise.prototype.down = function(){
this.catch((err)=>{
throw(err)
})
}all 方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16Promise.prototype.all = function(promiseArray){
reutrn new Promise((resolve,reject)=>{
const results = [];
let count = 0;
for(let i=0; i<promiseArray.length; i++){
promiseArray[i].then((data)=>{
results[i] = data;
count++;
if(count === promiseArray.length){
resolve(results)
}
},reject)
}
})
}race方法
1
2
3
4
5
6
7
8
9Promise.race = function(promiseArr) {
return new Promise((resolve, reject) => {
for (let i = 0; i < promiseArr.length; i++) {
promiseArr[i].then((data) => {
resolve(data);
}, reject)
}
});
};resolve方法
1
2
3
4
5Promise.resolve = function(value){
return new Promise((resolve,reject)=>{
resolvePromise(promise,value,resolve,reject);
})
}reject方法
1
2
3
4
5Promise.reject = function(reason){
return new Promise((resolve,reject)=>{
reject(reason)
})
}defer方法
1
2
3
4
5
6
7
8Promise.defer = Promise.deferred = function(){
let dfd = {};
dfd.promise = new Promise((resolve, reject) => {
dfd.resolve = resolve;
dfd.reject = reject;
});
return dfd;
}