vue实现登录拦截

需求:用户只有登录了,用户名存储在本地储存时,才能进入首页,如果本地存储没有用户名,就不能进入首页
1、登录页面的实现

<template>
  <div class="htmleaf-container">
  <div class="demo form-bg">
         <div class="container">
             <div class="row">
                 <div class="col-md-offset-3 col-md-6">
                     <form class="form-horizontal">
                         <span class="heading">用户登录</span>
                         <div class="form-group">
                             <input type="text" class="form-control" id="inputtxt" placeholder="用户名" v-model="username" @blur="inputUserBlur" @focus="inputFocus">
                             <i class="fa fa-user"></i>
                         </div>
                         <div class="form-group help">
                             <input type="password" class="form-control" id="inputPassword3" placeholder="密码" v-model="psd" @blur="inputPsdBlur">
                             <i class="fa fa-lock"></i>
                             <a href="#" rel="external nofollow" class="fa fa-question-circle"></a>
                         </div>
                         <div class="form-group">
                             <div class="main-checkbox">
                                 <input type="checkbox" value="None" id="checkbox1" name="check"/>
                                 <label for="checkbox1"></label>
                             </div>
                             <span class="text">记住我</span>
                            <button type="button" class="btn btn-default" @click="loginBtn">立刻登录</button>
                         </div>
                     </form>
                 </div>
             </div>
         </div>
     </div>
 </div>
</template>
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
<style lang="less" scoped>
@import 'http://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css';
 @import 'http://cdn.bootcss.com/font-awesome/4.6.3/css/font-awesome.min.css';
@import '.././assets/login/css/index.css';
.form-bg{
      padding: 2em 0;
  }
  .form-horizontal{
      background: #fff;
      padding-bottom: 40px;
      border-radius: 15px;
      text-align: center;
  }
  .form-horizontal .heading{
      display: block;
      font-size: 35px;
      font-weight: 700;
      padding: 35px 0;
      border-bottom: 1px solid #f0f0f0;
      margin-bottom: 30px;
  }
  .form-horizontal .form-group{
      padding: 0 40px;
      margin: 0 0 25px 0;
      position: relative;
  }
  .form-horizontal .form-control{
      background: #f0f0f0;
      border: none;
      border-radius: 20px;
      box-shadow: none;
      padding: 0 20px 0 45px;
      height: 40px;
      transition: all 0.3s ease 0s;
  }
  .form-horizontal .form-control:focus{
      background: #e0e0e0;
      box-shadow: none;
      outline: 0 none;
  }
  .form-horizontal .form-group i{
      position: absolute;
      top: 12px;
      left: 60px;
      font-size: 17px;
      color: #c8c8c8;
      transition : all 0.5s ease 0s;
  }
  .form-horizontal .form-control:focus + i{
      color: #00b4ef;
  }
  .form-horizontal .fa-question-circle{
      display: inline-block;
      position: absolute;
      top: 12px;
      right: 60px;
      font-size: 20px;
      color: #808080;
      transition: all 0.5s ease 0s;
  }
  .form-horizontal .fa-question-circle:hover{
      color: #000;
  }
  .form-horizontal .main-checkbox{
      float: left;
      width: 20px;
      height: 20px;
      background: #11a3fc;
      border-radius: 50%;
      position: relative;
      margin: 5px 0 0 5px;
      border: 1px solid #11a3fc;
  }
  .form-horizontal .main-checkbox label{
      width: 20px;
      height: 20px;
      position: absolute;
      top: 0;
      left: 0;
      cursor: pointer;
  }
  .form-horizontal .main-checkbox label:after{
      content: "";
      width: 10px;
      height: 5px;
      position: absolute;
      top: 5px;
      left: 4px;
      border: 3px solid #fff;
      border-top: none;
      border-right: none;
      background: transparent;
      opacity: 0;
      -webkit-transform: rotate(-45deg);
      transform: rotate(-45deg);
  }
  .form-horizontal .main-checkbox input[type=checkbox]{
      visibility: hidden;
  }
  .form-horizontal .main-checkbox input[type=checkbox]:checked + label:after{
      opacity: 1;
  }
  .form-horizontal .text{
      float: left;
      margin-left: 7px;
      line-height: 20px;
      padding-top: 5px;
      text-transform: capitalize;
  }
  .form-horizontal .btn{
      float: right;
      font-size: 14px;
      color: #fff;
      background: #00b4ef;
      border-radius: 30px;
      padding: 10px 25px;
      border: none;
      text-transform: capitalize;
      transition: all 0.5s ease 0s;
        }
  @media only screen and (max-width: 479px){
      .form-horizontal .form-group{
          padding: 0 25px;
      }
      .form-horizontal .form-group i{
          left: 45px;
      }
      .form-horizontal .btn{
          padding: 10px 20px;
      }
  }
</style>
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
index.css

/* @font-face {
 font-family: 'icomoon';
 src:url('../fonts/icomoon.eot?rretjt');
 src:url('../fonts/icomoon.eot?#iefixrretjt') format('embedded-opentype'),
  url('../fonts/icomoon.woff?rretjt') format('woff'),
  url('../fonts/icomoon.ttf?rretjt') format('truetype'),
  url('../fonts/icomoon.svg?rretjt#icomoon') format('svg');
 font-weight: normal;
 font-style: normal;
} */

[class^="icon-"], [class*=" icon-"] {
 font-family: 'icomoon';
 speak: none;
 font-style: normal;
 font-weight: normal;
 font-variant: normal;
 text-transform: none;
 line-height: 1;

/* Better Font Rendering =========== */
 -webkit-font-smoothing: antialiased;
 -moz-osx-font-smoothing: grayscale;
}

body, html { font-size: 100%;  padding: 0; margin: 0;}

/* Reset */
*,
*:after,
*:before {
 -webkit-box-sizing: border-box;
 -moz-box-sizing: border-box;
 box-sizing: border-box;
}

/* Clearfix hack by Nicolas Gallagher: http://nicolasgallagher.com/micro-clearfix-hack/ */
.clearfix:before,
.clearfix:after {
 content: " ";
 display: table;
}

.clearfix:after {
 clear: both;
}

body{
 background: #494A5F;
 font-weight: 500;
 font-size: 1.05em;
 font-family: "Microsoft YaHei","Segoe UI", "Lucida Grande", Helvetica, Arial,sans-serif;
}
a{ color: rgba(255, 255, 255, 0.6);outline: none;text-decoration: none;-webkit-transition: 0.2s;transition: 0.2s;}
a:hover,a:focus{color:#74777b;text-decoration: none;}
.htmleaf-container{
 margin: 0 auto;
}

.bgcolor-1 { background: #f0efee; }
.bgcolor-2 { background: #f9f9f9; }
.bgcolor-3 { background: #e8e8e8; }/*light grey*/
.bgcolor-4 { background: #2f3238; color: #fff; }/*Dark grey*/
.bgcolor-5 { background: #df6659; color: #521e18; }/*pink1*/
.bgcolor-6 { background: #2fa8ec; }/*sky blue*/
.bgcolor-7 { background: #d0d6d6; }/*White tea*/
.bgcolor-8 { background: #3d4444; color: #fff; }/*Dark grey2*/
.bgcolor-9 { background: #ef3f52; color: #fff;}/*pink2*/
.bgcolor-10{ background: #64448f; color: #fff;}/*Violet*/
.bgcolor-11{ background: #3755ad; color: #fff;}/*dark blue*/
.bgcolor-12{ background: #3498DB; color: #fff;}/*light blue*/
.bgcolor-20{ background: #494A5F;color: #D5D6E2;}
/* Header */
.htmleaf-header{
 padding: 1em 190px 1em;
 letter-spacing: -1px;
 text-align: center;
 background: #66677c;
}
.htmleaf-header h1 {
 color: #D5D6E2;
 font-weight: 600;
 font-size: 2em;
 line-height: 1;
 margin-bottom: 0;
}
.htmleaf-header h1 span {
 display: block;
 font-size: 60%;
 font-weight: 400;
 padding: 0.8em 0 0.5em 0;
 color: #c3c8cd;
}
/*nav*/
.htmleaf-demo a{color: #fff;text-decoration: none;}
.htmleaf-demo{width: 100%;padding-bottom: 1.2em;}
.htmleaf-demo a{display: inline-block;margin: 0.5em;padding: 0.6em 1em;border: 3px solid #fff;font-weight: 700;}
.htmleaf-demo a:hover{opacity: 0.6;}
.htmleaf-demo a.current{background:#1d7db1;color: #fff; }
/* Top Navigation Style */
.htmleaf-links {
 position: relative;
 display: inline-block;
 white-space: nowrap;
 font-size: 1.5em;
 text-align: center;
}

.htmleaf-links::after {
 position: absolute;
 top: 0;
 left: 50%;
 margin-left: -1px;
 width: 2px;
 height: 100%;
 background: #dbdbdb;
 content: '';
 -webkit-transform: rotate3d(0,0,1,22.5deg);
 transform: rotate3d(0,0,1,22.5deg);
}

.htmleaf-icon {
 display: inline-block;
 margin: 0.5em;
 padding: 0em 0;
 width: 1.5em;
 text-decoration: none;
}

.htmleaf-icon span {
 display: none;
}

.htmleaf-icon:before {
 margin: 0 5px;
 text-transform: none;
 font-weight: normal;
 font-style: normal;
 font-variant: normal;
 font-family: 'icomoon';
 line-height: 1;
 speak: none;
 -webkit-font-smoothing: antialiased;
}
/* footer */
.htmleaf-footer{width: 100%;padding-top: 10px;}
.htmleaf-small{font-size: 0.8em;}
.center{text-align: center;}
/****/
.related {
 color: #fff;
 background: #494A5F;
 text-align: center;
 font-size: 1.25em;
 padding: 0.5em 0;
 overflow: hidden;
}

.related > a {
 vertical-align: top;
 width: calc(100% - 20px);
 max-width: 340px;
 display: inline-block;
 text-align: center;
 margin: 20px 10px;
 padding: 25px;
 font-family: "Microsoft YaHei","宋体","Segoe UI", "Lucida Grande", Helvetica, Arial,sans-serif, FreeSans, Arimo;
}
.related a {
 display: inline-block;
 text-align: left;
 margin: 20px auto;
 padding: 10px 20px;
 opacity: 0.8;
 -webkit-transition: opacity 0.3s;
 transition: opacity 0.3s;
 -webkit-backface-visibility: hidden;
}

.related a:hover,
.related a:active {
 opacity: 1;
}

.related a img {
 max-width: 100%;
 opacity: 0.8;
 border-radius: 4px;
}
.related a:hover img,
.related a:active img {
 opacity: 1;
}
.related h3{font-family: "Microsoft YaHei", sans-serif;font-size: 1.2em}
.related a h3 {
 font-size: 0.85em;
 font-weight: 300;
 margin-top: 0.15em;
 color: #fff;
}
/* icomoon */
.icon-htmleaf-home-outline:before {
 content: "\e5000";
}

.icon-htmleaf-arrow-forward-outline:before {
 content: "\e5001";
}

@media screen and (max-width: 1024px) {
 .htmleaf-header {
  padding: 2em 10% 2em;
 }
 .htmleaf-header h1 {
        font-size:1.4em;
    }
    .htmleaf-links{font-size: 1.4em}
}

@media screen and (max-width: 960px) {
 .htmleaf-header {
  padding: 2em 10% 2em;
 }
 .htmleaf-header h1 {
        font-size:1.2em;
    }
    .htmleaf-links{font-size: 1.2em}
    .related h3{font-size: 1em;}
 .related a h3 {
  font-size: 0.8em;
 }
}

@media screen and (max-width: 766px) {
 .htmleaf-header h1 {
        font-size:1.3em;
    }
    .htmleaf-links{font-size: 1.3em}
}

@media screen and (max-width: 640px) {
 .htmleaf-header {
  padding: 2em 10% 2em;
 }
 .htmleaf-header h1 {
        font-size:1em;
    }
    .htmleaf-links{font-size: 1em}
    .related h3{font-size: 0.8em;}
 .related a h3 {
  font-size: 0.6em;
 }
}
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253

首先首页需要用户登录成功,且本地有username的存储,才能进入首页,那么就要在首页的路由中配置拦截。
1、首页路由

{
    path: '/',
    name: 'home',
    component: Home,
    meta: {
        requireAuth: true //配置拦截
      },
  },
1
2
3
4
5
6
7
8
2、登录页面路由

{
    path: '/login',
    name: 'login',
    component: () => import(/* webpackChunkName: "about" */ '../views/Login.vue')
  }
1
2
3
4
5
路由钩子函数

router.beforeEach((to,from,next)=>{
  if(to.meta.requireAuth){
    if(localStorage.getItem('username')){
      next();
    }else{
      next({
        path:'/login'
      })
    }
  }else{
    next();
  }
})
1
2
3
4
5
6
7
8
9
10
11
12
13
登录页面的验证:

<script>
export default {
    name: 'login',
    data() {
        return {
            username:"",
            psd:'',
            userKey:false,
            psdKey:false
        }
    },
   
    methods: {
        //用户名验证
        inputUserBlur(){
            let filter = /^[a-zA-Z0-9_]{6,16}$/;
            console.log('blur');
            if(this.username.trim() == ''){
               this.$message.error('用户名不能为空');
            }else if(!filter.test(this.username)){
                this.$message({
                 message: '用户名格式错误(6到16位,字母数字下划线,减号,中间不能有空格)',
                 type: 'warning'
                });
            }else{
                this.userKey = true;//用户名格式正确
            }
        },
        //密码验证
        inputPsdBlur(){
            let filter = /^(?![0-9]+$)(?![a-z]+$)(?![A-Z]+$)(?!([^(0-9a-zA-Z)])+$).{6,20}$/;
            console.log('blur');
            if(this.psd.trim() == ''){
               this.$message.error('密码不能为空');
            }else if(!filter.test(this.psd)){
                this.$message({
                 message: '密码格式错误(密码包含 数字,英文,字符中的两种以上,长度6-20)',
                 type: 'warning'
                });
            }else{
                this.psdKey = true;//密码格式正确
            }
        },
        //登录
        loginBtn(){
            console.log(this.userKey,this.psdKey)
            if(this.userKey && this.psdKey){
                this.$message({
                message: '恭喜你,登录成功',
                type: 'success'
                });
                localStorage.setItem('username',JSON.stringify(this.username));
                this.username = '';
                this.psd = '';
                this.$router.push('/')
            }else{
                this.$message.error('用户名和密码不能为空');
            }
        }
    },
}
</script>

时间: 2020-06-26

vue+axios实现登录拦截的实例代码

一个项目学会vue全家桶+axios实现登录.拦截.登出功能,以及利用axios的http拦截器拦截请求和响应. 前言 该项目是利用了Github 提供的personal token作为登录token,通过token访问你的Repository List.通过这个项目学习如何实现一个前端项目中所需要的 登录及拦截.登出.token失效的拦截及对应 axios 拦截器的使用. 准备你需要先生成自己的 Github Personal Token( 生成Token). Token 生成后 访问Demo

vue axios登录请求拦截器

当我们在做接口请求时,比如判断登录超时时候,通常是接口返回一个特定的错误码,那如果我们每个接口都去判断一个耗时耗力,这个时候我们可以用拦截器去进行统一的http请求拦截. 1.安装配置axios cnpm install --save axios  我们可以建一个js文件来做这个统一的处理,新建一个axios.js,如下 import axios from 'axios' import { Indicator } from 'mint-ui'; import { Toast } from 'mi

vue+axios 前端实现登录拦截的两种方式(路由拦截、http拦截)

一.路由拦截 登录拦截逻辑 第一步:路由拦截 首先在定义路由的时候就需要多添加一个自定义字段requireAuth,用于判断该路由的访问是否需要登录.如果用户已经登录,则顺利进入路由, 否则就进入登录页面. const routes = [ { path: '/', name: '/', component: Index }, { path: '/repository', name: 'repository', meta: { requireAuth: true, // 添加该字段,表示进入这个

Vue添加请求拦截器及vue-resource 拦截器使用

一.现象 统一处理错误及配置请求信息 二.解决 1.安装 axios  , 命令: npm install axios --save-dev 2.在根目录的config目录下新建文件 axios.js  ,内容如下: import axios from 'axios' // 配置默认的host,假如你的API host是:http://api.htmlx.club axios.defaults.baseURL = 'http://api.htmlx.club' // 添加请求拦截器 axios.

vue axios请求拦截实例代码

axios 简介 axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端,它本身具有以下特征: 从浏览器中创建 XMLHttpRequest 从 node.js 发出 http 请求 支持 Promise API 拦截请求和响应 转换请求和响应数据 取消请求 自动转换JSON数据 客户端支持防止 CSRF/XSRF 下面代码给大家介绍vue axios 请求拦截,具体代码如下所示: import axios from 'axios';//引入axios依赖 imp

vue-resource请求实现http登录拦截或者路由拦截的方法

本文介绍了vue-resource请求实现http登录拦截或者路由拦截的方法,分享给大家,具体如下: 项目需求 项目是前后台分离,前端负责数据对接,以及业务逻辑的处理,后台只需要给相应的接口即可 后台会控制接口的授权情况(即,未登录的接口,统一返回401未授权状态码,前端根据vue-resource的拦截器拦截符合条件的状态,并做出相应的处理.) 以下为两个系统的登录页面,作为请求超时或者登录拦截的跳转页面 以上是登录超时,登录弹窗框自动弹出来 代码片段 路由文件 export default

Vue中axios拦截器如何单独配置token

在了解到cookie.session.token的作用后学习token的使用 cookie cookie是随着url将参数发送到后台,安全性最低,并且大小受限,不超过4kb左右,它的数据保存在客户端 session session数据保存在服务端,在内存中开辟空间存储数据,session文件名即sessionID保存在cookie内,随cookie传送到服务端后在服务端匹配session文件 token token是服务端的一种算法,如果登录成功,服务端就会根据算法生成一个字符串,将字符串传递回

vue下axios拦截器token刷新机制的实例代码

//创建http.js文件,以下是具体代码: //引入安装的axios插件 import axios from 'axios' import router from '@/router'; import Vue from 'vue' const qs = require("qs"); let _this = new Vue(); let isLock = false; let refreshSubscribers = []; //判断token是否过期 function isToken

Express+Nodejs 下的登录拦截实现代码

原来一直不知道怎么在Express+Nodejs里面添加类似于Struts2的拦截器(因为要使用登录拦截的功能). 以前一直以为在router这块添加类似一下的转移路由控制权代码的(每个都加很麻烦) app.get('/show', controllers.checkLogin);//登录验证 app.get('/show', controllers.showList);//实际跳转 又或者是像某些项目里面给每个controller的方法里面加以下这种验证(太繁琐了) if (!req.sess

Spring MVC实现的登录拦截器代码分享

之前接触过struts拦截器,但是没有使用过Spring MVC拦截器,今天花了一天时间好好研究了一下. 本文首先介绍了拦截器的基本概念,然后向大家阐述拦截器与过滤器的简要区别,通过HandlerInterceptor 接口中定义的三个方法实现拦截器功能,最后介绍了配置相关的代码,接下来看看具体内容. 定义拦截器 SpringMVC 中的Interceptor 拦截请求是通过HandlerInterceptor 来实现的.在SpringMVC 中定义一个Interceptor 非常简单,主要有两