前几天写了一个登陆页面,考虑到未登录情况下要对一些数据接口进行拦截避免信息外泄,下面就简单介绍一下:
在成功登陆后,将isLogin的状态改成true,保存在session中
req.session.isLogin = true
app.js
如果isLogin的状态为false,我们判断路径是否为登录,退出,获取验证码路径,如果不是发送状态401
//登录拦截器
app.use((req, res, next)=>{
if(req.session.isLogin) {
next();
} else {
if (req.originalUrl == '/root/users/login' || req.originalUrl == '/root/users/logout' || req.originalUrl == '/root/code') {
next();
}else {
res.status(401)
res.json({
status: '401',
msg: '当前未登录!',
result: ''
})
res.end()
}
}
})
客户端中进行接口回调拦截,状态为401时,提示未登录
router/axios.js
// 回调拦截
axios.interceptors.response.use(res => { // 401的情况下表示验证未通过直接到error
const status = Number(res.status) || 200
const message = res.data.msg || '未知错误'
const urlWhiteList = [
'/api/root/code'
]
// 如果是白名单类型放入catch自行处理
if (status !== 200) return Promise.reject(res)
// 如果statusCode为200且res.code为200则放过,否者默认统一处理
if ((status !== 200 || (status === 200 && res.data.code !== 200)) && !urlWhiteList.includes(res.config.url)) {
Message({
message: message,
type: 'error'
})
return Promise.reject(new Error(message))
} else {
return res
}
}, error => {
if (error.response.status === 401) {
router.push({ path: '/login' })
Message.error('用户未登录, 请先登陆!')
}
return Promise.reject(new Error(error))
})
不要忘记在main.js中引用
import axios from '@/router/axios'