出于安全考虑,当用户登录后,本地浏览器需要保存保存服务器返回的token,并默认存储为头文件,在用户接下来访问每个界面时都携带着这个头部进行验证。若检测到非法登录状态,则进行路由拦截,无法正常访问资源+跳转至登录界面。
这里只记录前端板块,最基础的地方。
1.首先,登录验证,保存token
sessionStorage.setItem("token",res.data.token) //存储token
sessionStorage.setItem("userid",res.data.msg.userId) //存储用户名
//sessionStorage.getItem("token") 读取token。
这里的sessionStorage可以理解成(用户本地)浏览器临时保存的仓库,setItem设置以键值对形式存储。
注意点:
常用保存token的有两个:sessionStorage和localStorage
他们的功能相同,不同点在于:
- sessionStorage : 临时存储,当本界面关闭后所有数据都将清空。
- localStorage :永久存储,只要你没有手动删除就会一直存在。
本次选择sessionStorage 主要是为了方便测试,实际开发中肯定是localStorage 更常用,毕竟老要登录用户也会烦嘛~
(不过更正规的登录验证肯定是会设置token的实效性的)
2.添加请求拦截器
在config,js文件中配置请求拦截器,把token作为头部文件,当浏览器发送请求时把用户验证的头部加上去。(用于提交给后端验证)
import axios from 'axios'
//创建一个axios实例
const service =axios.create({
//请求超时
timeout:3000,
//baseURL:'/api'
})
//添加请求拦截器
service.interceptors.request.use(
config =>{
config.headers = { //设置头文件
"Authorization":"Bearer "+sessionStorage.getItem("token")
}
return config
},
err =>{
console.log(err)
}
)
service.interceptors.response.use(
response=>{
let res={}
res.status = response.status
res.data=response.data
return res
},
err => console.log(err)
)
export default service
3.添加跳转拦截器(前端)
在跳转到对应资源界面之前,进行一个简单的前端验证。
如果跳转向非登录界面,且没有token(即未登录状态),则改变路由跳转向登录界面。
在router/index.js中配置:
router.beforeEach((to,from,next) =>{
const token = sessionStorage.getItem('token')
console.log('token:',token)
if(to.name !='login' && !token){
next({
name:'login'
}) //没去登录页,还没token,跳转去登录页
}
else next() //正常跳转
})
这块其实写的还有问题,没有和后端交互验证,假如用户知道怎么自己加头部token,难道随便一个不合法token就让他上去了吗?
修改新增:
有请求拦截器,对应的便有响应拦截器。即响应时候拦截验证,假如登录状态不合法就跳去登录界面。
(在config,js中新增)
//响应拦截器
axios.interceptors.response.use(response => {
return response
}, error => {
this.$router.push({
path:'/'
})
return Promise.resolve(error.response)
})
service.interceptors.response.use(
response=>{
let res={}
res.status = response.status
res.data=response.data
return res
},
err => console.log(err)
)