前言

前端用什么框架都可以,这里选择小巧的vuejs。

要实现的功能很简单:
1、登录功能,成功将服务器返回的token存在本地
2、使用带token的header访问服务器的一个资源

本次实验环境:

"dependencies": {
"vue": "^2.2.1"
},
"devDependencies": {
"babel-core": "^6.0.0",
"babel-loader": "^6.0.0",
"babel-preset-latest": "^6.0.0",
"cross-env": "^3.0.0",
"css-loader": "^0.25.0",
"file-loader": "^0.9.0",
"vue-loader": "^11.1.4",
"vue-template-compiler": "^2.2.1",
"webpack": "^2.2.0",
"webpack-dev-server": "^2.2.0"
}

开发IDE:Atom

首先建一个项目

使用webpack构建

/Atom# vue init webpack-simple vue-jwt-demo
...
/Atom# cd vue-jwt-demo/
/Atom/vue-jwt-demo# cnpm install
/Atom/vue-jwt-demo# npm run dev

安装插件

/Atom/vue-jwt-demo# cnpm install vue-router

/Atom/vue-jwt-demo# cnpm install vue-resource

整体目录


auth.js

完成token的存取


const SERVER_URL = 'http://localhost:8081'
const LOGIN_URL = SERVER_URL+'/login2' export default{
data:{
authenticated:false
},
login(context,info){
context.$http.post(LOGIN_URL,info).then(function(data){
console.log(data.bodyText)
localStorage.setItem('token',data.bodyText);
this.authenticated = true
//跳到home页
this.$router.push('home')
},function(err){
console.log(err+","+err.body.message)
context.error = err.body.message
})
},
getAuthHeader(){
return {
'Authorization':'Bearer '+localStorage.getItem('token')
}
},
checkAuth(){
var token = localStorage.getItem('token')
if(token){
this.authenticated = true
}else{
this.authenticated = false
}
}
}

main.js

程序入口:完成路由和初始化

import Vue from 'vue'
import App from './App.vue'
import Login from './component/Login.vue'
import Home from './component/Home.vue'
import VueRouter from 'vue-router'
import VueResource from 'vue-resource'
import auth from './auth/auth' Vue.use(VueRouter)
Vue.use(VueResource) //在启动APP时进行校验是否有token
auth.checkAuth() const routes= [
{
path:'/',redirect:'/login'
},
{
path:'/login',component:Login
},
{
path:'/home',component:Home
}
] const router = new VueRouter({
routes
})
new Vue({
router,
render: h => h(App)
}).$mount('#app')

App.vue

页面载体

<template>
<div id="app">
<h1>{{msg}}</h1>
<router-view></router-view>
</div>
</template> <script>
export default {
name: 'app',
data () {
return {
msg: 'Vue前后端分离demo'
}
}
}
</script>

Login.vue

登录页面

<template>
<div>
<h2>登录</h2>
<p>{{ error }}</p>
<div>
<input
type="text"
placeholder="Enter your username"
v-model="info.username"
>
</div>
<div>
<input
type="password"
placeholder="Enter your password"
v-model="info.password"
>
</div>
<button @click="submit()">登录</button>
</div>
</template> <script>
import auth from '../auth/auth' export default { data() {
return {
info: {
username: '',
password: ''
},
error: ''
}
},
methods: {
submit() {
var info = {
username: this.info.username,
password: this.info.password
}
auth.login(this, info)
}
}
}
</script>

效果:丑是丑了点


Home.vue

主页面,访问一个获取邮箱的请求

<template>
<div id="home">
<h1>{{msg}}</h1>
<button @click="getEmail()">Get Email</button>
<h2>Email:{{email}}</h2>
</div>
</template> <script>
import auth from '../auth/auth' export default {
name: 'home',
data () {
return {
msg: '欢迎您登录成功',
email:''
}
},
beforeCreate(){
//如果没有token的话需要重新登录
if(!auth.authenticated){
this.$router.push('login')
}
},
methods:{
getEmail(){
this.$http.get('http://localhost:8081/user/getEmail',{
headers:auth.getAuthHeader()
}).then(function(re){
this.email = re.bodyText
},function(){
console.log("get email error")
})
}
}
}
</script> <style>
#app {
font-family: 'Avenir', Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
} h1, h2 {
font-weight: normal;
} a {
color: #42b983;
}
</style>

对应在服务端:

@GetMapping("/getEmail")
public String getEmail() {
return "xxxx@qq.com";
}

可看到浏览器的本地存储:

Vue.js (Frontend & Backend)尝试前后端分离的更多相关文章

  1. Kitty基于Spring Boot、Spring Cloud、Vue.js、Element实现前后端分离的权限管理系统

    源码地址:https://gitee.com/liuge1988/kitty 软件架构 后端架构 开发环境 IDE : eclipse 4.x JDK : JDK1.8.x Maven : Maven ...

  2. nodeJS(express4.x)+vue(vue-cli)构建前后端分离详细教程(带跨域)

    好想再回到大学宿舍,当时床虽小,房随小,但是心确是满的 ----致  西安工程大学a-114舍友们 转载请注明出处:水车:http://www.cnblogs.com/xuange306/p/6185 ...

  3. 基于ThinkPHP 5.0与Vue.JS 2.x的前后端开源开发框架VueThink

    VueThink 项目介绍 VueThink是一套基于Vue全家桶(Vue2.x + Vue-router2.x + Vuex)+ Thinkphp的前后端分离框架. 脚手架构建也可以通过vue官方的 ...

  4. Yii框架和Vue的完美结合完成前后端分离项目

    背景说明 本文假设你对Yii和Vue都比较熟悉,至少都在项目里用过,另外笔者新人,以后不定时放一些干货,欢迎程序媛关注 Yii是一个PHP全端框架,典型的mvc的项目结构,后端接口都是一个控制器里放了 ...

  5. @vue/cli 4.0+express 前后端分离实践

    之前总结过一篇vue-cli 2.x+express+json-server实现前后端分离的帖子,@vue/cli3.0及4.0搭建的项目与vue-cli2.x的项目结构有很大的不同.这里对@vue/ ...

  6. vue + spring boot + spring security 前后端分离 携带 Cookie 登录实现 只写了个登录

    最近想弄一下vue 所以就自己给自己找坑入   结果弄的满身是伤 哈哈哈 首先我说下 前后端分离  跨域请求  我在网上找了一些  可是都是针对于 spring boot 的 我自己还有 securi ...

  7. Vue+Django2.0 restframework打造前后端分离的生鲜电商项目(2)

    1.restful api介绍 1.前后端分离的优缺点 1.为什么要用前后端分离 1.pc.app.pad多端适应 2.SPA(单页面应用)开发模式开始流行 3.前后端分离职责不清 4.开发效率问题, ...

  8. 用node.js和webpack做前后端分离的总结

    1.webpack打包的特点 (打包文件到指定地点,修改原文件里的引用路径为打包的地点) 涉及output的path/public path/dev-server里的public path等概念 we ...

  9. axios + mock.js模拟数据实现前后端分离开发的实例代码

    首先就是必须安装axios和mock.js npm install axios npm install mockjs 1. 然后在文档src中新建一个mock.js文件,如图 2. 在main.js中 ...

随机推荐

  1. remove ubuntu lvm

    sudo vgdisplay sudo vgremove groupname

  2. django-mysql表的增删改查

    1.增加数据 调用该路由执行ModelsCaozuo的处理方法 第一种实例化类 class ModelsCaozuo(View): ''' 数据库增加数据 ''' def get(self, requ ...

  3. HAproxy使用

    参考官网 安装HAproxy/ pull 官方镜像 本地安装:本地安装路径:/usr/local/haproxy/配置: 添加:/usr/local/haproxy/conf/haproxy.cfg添 ...

  4. zabbix 主动模式监控

    参考网站:  http://www.mamicode.com/info-detail-1724685.html http://www.cnblogs.com/dadonggg/p/8609674.ht ...

  5. 51. linux卸载jdk

    看有的资料上说有些Linux自带的有jdk1.4:如果自带的有jdk1.4的话首先要把jdk1.4卸载掉.具体做法: 输入命令: #rpm -qa | grep gcj 如果输出没有内容,说明没有jd ...

  6. 基于OpenGL编写一个简易的2D渲染框架-07 鼠标事件和键盘事件

    这次为程序添加鼠标事件和键盘事件 当检测到鼠标事件和键盘事件的信息时,捕获其信息并将信息传送到需要信息的对象处理.为此,需要一个可以分派信息的对象,这个对象能够正确的把信息交到正确的对象. 实现思路: ...

  7. conflicting types for ‘方法名’ 的错误

    将main()的实现写在drawShapes(),drawCircle(),drawRectangle()...之前. 结果编译的时候出现了  conflicting types for " ...

  8. avalon做的抽奖效果

    .sweepstake { color: orange; font-size: 24px; font-weight: bold; } 先来一个简单的 <style> .sweepstake ...

  9. 数据类型-Series

    数据类型-Series Series数据类型由一组数据和数据相关的索引组成,键 -> 值 Series数据类型可视为:一维 带标签 数组 Series基本操作类似数组和字典 Series数据类型 ...

  10. python闭包和装饰器(转)

    一.python闭包 1.内嵌函数 >>> def func1(): ... print ('func1 running...') ... def func2(): ... prin ...