vue通過vue-router攔截實現登入驗證
在實際開發中,有些頁面需要登入之後才能訪問,採用vue-router+vuex+elememt-ui+axios的方式實現。
以下是案列程式碼:
login.vue
<template>
<div class="login">
<el-input type="text" v-model="username" placeholder="請輸入使用者名稱"></el-input>
<el-input type="password" v-model="userpsd" placeholder="請輸入密碼"></el-input>
<el-button type="primary" @click="toLogin">登入</el-button>
</div>
</template>
<script>
import {mapActions,mapState} from 'vuex'
export default {
name: 'login',
props: [''],
data() {
return {
username: "",
userpsd: "",
};
},
computed: {
...mapState(["userinfo", "isLogin"])
},
mounted() {
console.log(this.$route.params.path);
},
methods: {
...mapActions(["getUserInfo"]),
toLogin() {
if (this.username == "") {//自行驗證使用者名稱規則
return;
} else if (this.userpsd == "") {//自行驗證密碼規則
return;
} else {
let data = {};
data.username = this.username;
data.password = this.userpsd;
this.getUserInfo(data).then(() => {
if (this.isLogin) {
//若是使用使用者資訊,則本地儲存使用者資訊,根據需求自行使用本地儲存方式
sessionStorage.setItem("userinfo", JSON.stringify(this.userinfo));
//是否登入的標誌位
sessionStorage.setItem("isLogin", true);
//登入成功後返回訪問的頁面
this.$router.push({
path: this.$route.params.path
});
} else {//登入未成功to do sth
sessionStorage.setItem("userinfo", '');
sessionStorage.setItem("isLogin", '');
}
})
.catch(err => {
console.log(err);
});
}
},
}
}
</script>
<style lang='' scoped>
.login .el-input {
margin: .5rem 0;
}
.login .el-button--primary {
width: 100%;
margin: .5rem 0;
}
</style>
router/index.js
import Vue from 'vue'
import Router from 'vue-router'
import store from '../store/index'
const home = r => require.ensure([], () => r(require('@/components/home')), 'home');
const personCenter= r => require.ensure([], () => r(require('@/components/personCenter')), 'personCenter');
const login = r => require.ensure([], () => r(require('@/components/login')), 'login');
const notFound = r => require.ensure([], () => r(require('@/components/notFound')), 'notFound');
Vue.use(Router);
const router = new VueRouter({
routes: [{
path: '/home',
name: 'home',
component: home
},
{
path: '/personCenter',
name: 'personCenter',
component: personCenter,
meta: {
need2Login: true
}
},
{
path: '/login',
name: 'login',
component: login,
},
{
path: "/404",
name: "notFound",
component: notFound
},
{
path: "*", // 此處需特別注意置於最底部
redirect: "/404"
},
]
})
router.beforeEach((to, from, next) => { //全域性鉤子函式
to.matched.some((route) => {
// to.matched.forEach((route) => {
if (route.meta.need2Login) { //通過此操作可以判斷哪些頁面需要登入
if (store.state.isLogin || sessionStorage.getItem('isLogin')) {
next()
} else {
next({ name: 'login', params: { path: route.path } })
}
} else {
next();
}
});
});
export default router;
store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
import mutations from './mutations'
import actions from './action'
Vue.use(Vuex);
const state = {
userinfo: {}, //登入資訊
isLogin: '', //是否已登入
}
export default new Vuex.Store({
state,
actions,
mutations,
})
store/mutation-types.js
export const GETUSERINFO = 'GETUSERINFO'
store/action.js
import {login} from '@/service/api'
export default {
async getUserInfo({ state, commit }, payload) {
let res = await login(payload);
if (res.result.code === 10000) {//登入成功dispatch
commit('GETUSERINFO', { info: res.data, isLogin: true })
} else {
commit('GETUSERINFO', { info: res, isLogin: false })
}
}
}
store/mutations.js
import { GETUSERINFO } from './mutation-types'
export default {
[GETUSERINFO](state, { info, isLogin }) {
state.userinfo = info;
state.isLogin = isLogin;
}
}
service/api.js
import ajax from './apiConfig';
export const login = (data) => {
return ajax.post('/app/login', data)
}
service/apiConfig.js
import axios from 'axios';
import qs from 'qs';
// 設定 POST 請求頭
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
// 在向伺服器傳送前,修改請求資料(只能用在 'PUT', 'POST' 和 'PATCH' 這幾個請求方法)
axios.defaults.transformRequest = [(data) => { return qs.stringify(data) }]
// 在傳遞給 then/catch 前,允許修改響應資料
// axios.defaults.transformResponse = [(data) => { return JSON.parse(data) }]
// 配置 CORS 跨域
// 表示跨域請求時是否需要使用憑證
axios.defaults.withCredentials = true;
axios.defaults.crossDomain = true;
// 設定超時
axios.defaults.timeout = 40000;
// 攔截器的說明
// 1、interceptor必須在請求前設定才有效。
// 2、直接為axios全域性物件建立interceptor, 會導致全域性的axios發出的請求或接收的響應都會被攔截到, 所以應該使用axios.create() 來建立單獨的axios例項。
//設定地址
const baseUrl='';
// 建立axios例項
let instance = axios.create({
baseURL: baseUrl
})
// Add a request interceptor
instance.interceptors.request.use(function(config) {
return config;
}, function(error) {
return Promise.reject(error);
});
// Add a response interceptor
instance.interceptors.response.use(function(response) {
// Do something with response data
return response.data;
}, function(error) {
// Do something with response error
return Promise.reject(error);
});
export { instance };
相關文章
- SSM專案使用攔截器實現登入驗證功能SSM
- 前端架構之vue+axios 前端實現登入攔截(路由攔截、http攔截)前端架構VueiOS路由HTTP
- 通過selenium突破極驗驗證實現登入
- 前後端實現登入token攔截校驗後端
- SpringBoot 整合 Shiro 實現登入攔截Spring Boot
- vue實現簡訊驗證碼登入Vue
- vue.js新增攔截器,實現token認證(使用axios)Vue.jsiOS
- SpringMVC(六) 攔截器和使用者登入校驗SpringMVC
- SpringBoot-shiro登入攔截.使用者認證.整合MybatisSpring BootMyBatis
- Go語言WEB框架:使用wego攔截器驗證使用者的登入狀態GoWeb框架
- golang 中使用 JWT 實現登入驗證GolangJWT
- uniapp 實現簡訊驗證碼登入APP
- node實現登入圖片驗證碼
- springboot2.0+jsp+登入攔截器Spring BootJS
- 鴻蒙Navigation攔截器實現頁面跳轉登入鑑權方案鴻蒙Navigation
- vue登入註冊,帶token驗證Vue
- SpringBoot實現過濾器、攔截器與切片Spring Boot過濾器
- django與小程式實現登入驗證功能Django
- 自動化驗證碼登入如何實現?
- Springboot通過攔截器攔截請求資訊收集到日誌Spring Boot
- SpringBoot 2.X配置登入攔截器Spring Boot
- vue中使用el-dialog + axios 實現攔截器VueiOS
- 用Abp實現兩步驗證(Two-Factor Authentication,2FA)登入(三):免登入驗證
- 實現基於JWT的Token登入驗證功能JWT
- layui使用html+servlet+ajax實現登入驗證UIHTMLServlet
- Java實現的攔截器Java
- sql 注入越過登入驗證例項SQL
- SpringBoot中的過濾器和攔截器的實現Spring Boot過濾器
- java視窗登入介面實現隨機驗證碼Java隨機
- Flutter下實現WebView攔截載入離線資源FlutterWebView
- .net core 登入全域性驗證過濾器過濾器
- 深入Vue後臺管理開發之登入驗證Vue
- 說說如何在登入頁實現生成驗證碼功能
- Spring Security Oauth2.0 實現簡訊驗證碼登入SpringOAuth
- 直播系統程式碼,登入時常用驗證方式實現
- 登入驗證碼生成kaptcha(輸入驗證碼)APT
- Spring Boot使用過濾器和攔截器分別實現REST介面簡易安全認證Spring Boot過濾器REST
- 攔截過濾器模式過濾器模式