Vue+Jwt+SpringBoot+Ldap完成登录认证的示例代码(4)
4.前端Vue
4.1使用Vue-cli搭建项目,并使用vue-router和vue-resource,不了解的可以搜索下
4.2 main.js
// The Vue build version to load with the `import` command // (runtime-only or standalone) has been set in webpack.base.conf with an alias. import Vue from 'vue' import VueRouter from 'vue-router' import VueResource from 'vue-resource' import store from './store/store' import 'bootstrap/dist/css/bootstrap.css' import App from './App' import Login from './components/login' import Hello from './components/hello' Vue.use(VueRouter) Vue.use(VueResource) //Vue-resource默认以payload方式提交数据,这样设置之后以formData方式提交 Vue.http.options.emulateJSON = true; const routes = [ { path: '/login', component : Login },{ path: '/hello', component: Hello } ] const router = new VueRouter({ routes }) //默认导航到登录页 router.push('/login') /* 全局路由钩子 访问资源时需要验证localStorage中是否存在token 以及token是否过期 验证成功可以继续跳转 失败返回登录页重新登录 */ router.beforeEach((to, from, next) => { if(localStorage.token && new Date().getTime() < localStorage.tokenExpired){ next() } else{ next('/login') } }) new Vue({ el: '#app', template: '<App/>', components: { App }, router, store })
4.3 App.vue
<template> <div id="app"> <router-view></router-view> </div> </template> <script> export default { name: 'app', } </script> <style scoped> </style>
4.4 login.vue
<template> <div class="login-box"> <div class="login-logo"> <b>Admin</b>LTE </div> <div class="login-box-body"> <div class="input-group form-group has-feedback"> <span class="input-group-addon"><span class="glyphicon glyphicon-user"></span></span> <input v-model="username" type="text" class="form-control" placeholder="username"> <span class="input-group-addon">@minibox.com</span> </div> <div class="input-group form-group has-feedback"> <span class="input-group-addon"><span class="glyphicon glyphicon-lock"></span></span> <input v-model="password" type="password" class="form-control" placeholder="Password"> </div> <div class="row"> <div class="col-sm-6 col-sm-offset-3 col-md-6 col-md-offset-3"> <transition name="slide-fade"> <p v-if="show">用户名或密码错误</p> </transition> </div> </div> <div class="row"> <div class="col-sm-6 col-sm-offset-3 col-md-6 col-md-offset-3"> <button v-on:click="auth" class="btn btn-primary btn-block btn-flat">Sign In</button> </div> </div> </div> </div> </template> <script> //提供认证服务的restApi var authUrl = 'https://192.168.227.1:8443/auth' export default { name: 'app', data() { return { username: '', password: '', show: false } }, methods: { auth: function(){ var credentials = { username:this.username, password:this.password } /* post方法提交username和password 认证成功将返回的用户信息写入到localStorage,并跳转到下一页面 失败提示认证错误 */ this.$http.post(authUrl, credentials).then(response => { localStorage.token = response.data.token localStorage.tokenExpired = response.data.tokenExpired localStorage.userDisplayName = response.data.displayName this.$router.push('hello') }, response => { this.show = true }) } } } </script> <style scoped> p{ text-align: center } .slide-fade-enter-active { transition: all .8s ease; } .slide-fade-leave-active { transition: all .8s cubic-bezier(1.0, 0.5, 0.8, 1.0); } .slide-fade-enter, .slide-fade-leave-to /* .slide-fade-leave-active for <2.1.8 */ { transform: translateX(10px); opacity: 0; } @import '../assets/css/AdminLTE.min.css' </style>
内容版权声明:除非注明,否则皆为本站原创文章。