该项目是利用了Github提供的个人标记作为登录令牌,通过令牌访问你的库列表。通过这个项目学习如何实现一个前端项目中所需要的登录及拦截,登出,令牌失效的拦截及对应axios拦截器的使用。
你需要先生成自己的Github的个人标记(,生成牌)。令牌生成后访问演示,即可查看你的<代码>库。
代码>列表
├──README.md ├──dist//打包构建后的文件夹 │├──build.js │└──build.js.map ├──index . html ├──package.json ├──src │├──App.vue │├──资产 ││├──css.css ││├──icon.css ││└──logo.png │├──常数 ││└──api。js//配置api接口文件 │├──http。js//封装取回,帖子请求及http拦截器配置文件 │├──index.vue │├──login.vue │├──main.js │├──repository.vue │├──路由器。js//路由配置文件 │└──商店 │├──store.js │└──类型。js//vuex类型 └──webpack.config.js
-
<李> Vue 2.0 李>
<李> vue-router李>
<李> vuex李>
<李> axios李>
<李> vue-material
李>
第一步:路由拦截
首先在定义路由的时候就需要多添加一个自定义字段<代码>,requireAuth> 代码,用于判断该路由的访问是否需要登录。如果用户已经登录,则顺利进入路由,否则就进入登录页面。
const路线=[ { 路径:“/? 名称:“/? 组件:指数 }, { 路径:/库, 名称:“库”, 元:{ requireAuth:真的,//添加该字段,表示进入这个路由是需要登录的 }, 组件:库 }, { 路径:/登录, 名称:“登录”, 组件:登录 });
定义完路由后,我们主要是利用,<代码> vue-router> 代码提供的钩子函数<代码>,beforeEach() 代码>对路由进行判断。
路由器。beforeEach(下),从=比;{ 如果(to.meta.requireAuth){//判断该路由是否需要登录权限 如果(store.state.token){//通过vuex国家获取当前的令牌是否存在 next (); } 其他{ 下一个({ 路径:/登录, 查询:{重定向:。fullPath}//将跳转的路由路径作为参数,登录成功后跳转到该路由 }) } } 其他{ next (); } })
每个钩子方法接收三个参数:
-
<李>:路线:即将要进入的目标路由对象李>
<李>:路线:当前导航正要离开的路由李>
<李>:功能:一定要调用该方法来解决这个钩子。执行效果依赖一方法的调用参数。
李> <李> next():进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是证实(确认的)。李> <李>下(错误):中断当前的导航。如果浏览器的URL改变了(可能是用户手动或者浏览器后退按钮),那么URL地址会重置到从路由对应的地址。李> <李> next(“/?或者<代码>下({路径:'/'}):代码>跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。李>
确保要调用一方法,否则钩子就不会被解决。
完整的方法见,<代码>/src/router.js 代码>
其中,<代码>。元> 代码中是我们自定义的数据,其中就包括我们刚刚定义的,<代码> requireAuth> 代码字段。通过这个字段来判断该路由是否需要登录权限。需要的话,同时当前应用不存在令牌,则跳转到登录页面,进行登录。登录成功后跳转到目标路由。
登录拦截到这里就结束了吗?并没有。这种方式只是简单的前端路由控制,并不能真正阻止用户访问需要登录权限的路由。还有一种情况便是:当前令牌失效了,但令牌是依然保存在本地。这时候你去访问需要登录权限的路由时,实际上应该让用户重新登录。这时候就需要结合http拦截器+后端接口返回的http状态码来判断。
第二步:拦截器
要想统一处理所有http请求和响应,就得用上axios的拦截器。通过配置,<代码> http响应inteceptor> 代码,当后端接口返回,401年未授权(未授权),让用户重新登录。
//http请求拦截器 axios.interceptors.request.use ( 配置=比;{ 如果(store.state.token){//判断是否存在令牌,如果存在的话,则每个http头都加上令牌 config.headers。授权='牌$ {store.state.token} '; } 返回配置; }, 呃=比;{ 返回Promise.reject (err); });//http响应拦截器 axios.interceptors.response.use ( 响应=比;{ 返回响应; }, 错误=比;{ 如果(error.response) { 开关(error.response.status) { 401年情况://返回401年清除牌信息并跳转到登录页面 store.commit (types.LOGOUT); router.replace ({ 路径:“登录”, 查询:{重定向:router.currentRoute.fullPath} }) } } 返回Promise.reject (error.response.data)//返回接口返回的错误信息 });Vue前端实现登陆拦截及axios拦截器的使用