这里对token的简单的使用进行测试和描述

其原理就不在这里描述了!

具体测试流程:用户在前端请求登录——>在后台验证通过后根据用户ID生成token——>请求返回时将token带给前端并存在前端——>以后前端再次请求时需要带上token

——>后台接受到token并验证,如果验证通过,返回true,否则false(实际情况下就是验证通过,这次请求成功,否则这次请求无效)

1、数据库里面建立一个用户表,用于存储用户登录的账号和密码,用于用户登录测试

2、后台生成token的代码类JavaWebToken(网上可以查到)

 import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
import java.security.Key;
import java.util.Map; public class JavaWebToken {
private static Logger log = LoggerFactory.getLogger(JavaWebToken.class); //该方法使用HS256算法和Secret:bankgl生成signKey
private static Key getKeyInstance() {
//We will sign our JavaWebToken with our ApiKey secret
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary("bankgl");
Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());
return signingKey;
} //使用HS256签名算法和生成的signingKey最终的Token,claims中是有效载荷
public static String createJavaWebToken(Map<String, Object> claims) {
return Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS256, getKeyInstance()).compact();
} //解析Token,同时也能验证Token,当验证失败返回null
public static Map<String, Object> parserJavaWebToken(String jwt) {
try {
Map<String, Object> jwtClaims =
Jwts.parser().setSigningKey(getKeyInstance()).parseClaimsJws(jwt).getBody();
return jwtClaims;
} catch (Exception e) {
log.error("json web token verify failed");
return null;
}
}
}

使用前需要导入依赖包,在项目的pom.xml文件中加入:

<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.7.0</version>
</dependency>

测试的控制层代码:

 /**
* 登录验证 login
* @param rc 前端请求类(包含前端用户输入的账号和密码)
* @param response
* @return LoginInfo 用户信息类(包含用户的ID,账号和密码和生成token字符串信息)
*/
@RequestMapping(value = "/login")
public LoginInfo login(RequestClass rc, HttpServletResponse response){
response.setHeader("Access-Control-Allow-Origin","*");
UserInf userInf = ls.uerLogin(rc.getUserName(),rc.getPassWord()); //根据前端传送过来的账号和密码进行验证
if( userInf == null) //用户不存在,返回null
return null;
LoginInfo loginInfo = new LoginInfo();
Map<String,Object> m = new HashMap<String,Object>();
m.put("userId",userInf.getId());
String token = JavaWebToken.createJavaWebToken(m); // 根据存在用户的id生成token字符串
loginInfo.setUserInf(userInf);
loginInfo.setToken(token); //存在对象中并返回给前端
return loginInfo;
} /**
* token验证方法
* @param rc
* @param response
* @return
*/
@RequestMapping(value = "/tokenConfirm")
public LoginInfo tokenConfirm(RequestClass rc,HttpServletResponse response){
response.setHeader("Access-Control-Allow-Origin","*");
LoginInfo loginInfo = new LoginInfo();
System.out.println(rc.getToken());
if (JavaWebToken.parserJavaWebToken(rc.getToken()) != null){ //根据前端带回来的token验证
loginInfo.setTokenMark("true"); //验证通过
}else{
loginInfo.setTokenMark("false"); //验证失败
}
return loginInfo;
}

3、前台测试页面如下:

前端代码:

<template>
<div >
<h1>{{ title }}</h1>
<div>
<span>账号</span>
<input type="text" name="username" v-model = "username">
</div>
<div>
<span>密码</span>
<input type="password" name="password" v-model = "password">
</div>
<div>
<button @click = "loginConfirm">登录</button>
<button @click = "tokenConfirm">访问后台</button>
</div>
</div>
</template> <script> import {setCookie,getCookie} from '../common/Cookie.js' export default{
data(){
return{
title:'登录测试页面!!!',
username:'',
password:''
}
},
methods:{
loginConfirm(){
console.log('username:'+this.username+" password:"+this.password);
var _this = this;
this.axios.get('http://localhost:8080/login', {
params: {
userName: _this.username,
passWord:_this.password
}
})
.then(function(response){
var obj = response.data;
console.log(obj.token);
setCookie(obj.token);
})
.catch(function (error) {
console.log(error);
});
},
tokenConfirm(token){
var _this = this;
var _token = getCookie(token);
this.axios.get('http://localhost:8080/tokenConfirm',{
params:{
token:_token
}
})
.then(function(response){
var obj = response.data;
console.log(obj);
})
.catch(function(){
console.log(error);
});
}
},
mounted(){ }
}
</script>
<style scoped>
h1, h2 {
font-weight: normal;
}
ul {
list-style-type: none;
padding: 0;
}
li {
display: inline-block;
margin: 0 10px;
}
a {
color: #42b983;
}
</style>

其中,引用的Cookie.js:

function setCookie(token){
document.cookie = token;
} function getCookie(){
return document.cookie;
}
export {setCookie,getCookie}

4、开始测试,在页面输入用户的账号密码,点击登录按钮

后台验证成功,在页面控制台输出可以看到后台返回的token

再点击访问后台请求的按钮,后台验证这个token并返回结果为true

假设我们这里改变了这个token,并发送给后台,则后台对token验证失败会返回false

点击访问后台按钮

到此,简单的token使用验证

token简单的使用的更多相关文章

  1. SpringBoot使用token简单鉴权

    本文使用SpringBoot结合Redis进行简单的token鉴权. 1.简介 刚刚换了公司,所以最近有些忙碌,所以一直没有什么产出,最近朋友问我登录相关的,所以这里先写一篇简单使用token鉴权的文 ...

  2. RESTful登录设计(基于Spring及Redis的Token鉴权)

    转载自:http://www.scienjus.com/restful-token-authorization/ http://m.blog.csdn.net/article/details?id=4 ...

  3. python 全栈开发,Day97(Token 认证的来龙去脉,DRF认证,DRF权限,DRF节流)

    昨日内容回顾 1. 五个葫芦娃和三行代码 APIView(views.View) 1. 封装了Django的request - request.query_params --> 取URL中的参数 ...

  4. token 案例,只是测试,功能并不完善(只是看看token 到底是何方神圣)

    token 简单理解就是 加密 解密的一个过程 JavaWebToken(加密解密工具) public class JavaWebToken { private static Logger log = ...

  5. (转)理解Keystone的四种Token

    Token 是什么 通俗的讲,token 是用户的一种凭证,需拿正确的用户名/密码向 Keystone 申请才能得到.如果用户每次都采用用户名/密码访问 OpenStack API,容易泄露用户信息, ...

  6. Django框架深入了解_03(DRF之认证组件、权限组件、频率组件、token)

    一.认证组件 使用方法: ①写一个认证类,新建文件:my_examine.py # 导入需要继承的基类BaseAuthentication from rest_framework.authentica ...

  7. 42.JSON Web Token认证

    JSON Web Token认证介绍 简称JWT认证,一般用于用户认证 JWT是一种相当新的标准,可用于基于token的身份验证 与内置的TokenAuthentication方案不同,JWT不需要使 ...

  8. Android学习笔记之Fast Json的使用

    PS:最近这两天发现了Fast Json 感觉实在是强大.. 学习内容: 1.什么是Fast Json 2.如何使用Fast Json 3.Fast Json的相关原理 4.Fast Json的优势, ...

  9. ueditor上传图片到七牛云存储(form api,java)

    转:http://my.oschina.net/duoduo3369/blog/174655 ueditor上传图片到七牛云存储 ueditor结合七牛传图片 七牛的试炼 开发前的准备与注意事项说明 ...

随机推荐

  1. hive的排序,分組练习

    hive的排序,分組练习 数据: 添加表和插入数据(数据在Linux本地中) create table if not exists tab1( IP string, SOURCE string, TY ...

  2. gevent模块学习(二)

    2. Queue类,常用用于Greenlet之间的异步共享 q = gevent.queue.Queue(maxsize=None, items=None) -> Queue 说明: 创建一个指 ...

  3. 小程序二层嵌套循环数据:微信小程序开发(交流QQ群:604788754)

    WXML: <view class="martop15"> <view class="titlebox"> .二层嵌套循环 </v ...

  4. PDF 补丁丁 0.6.0.3340 版发布(修复提取图片的问题)

    新的版本修复了两个导致提取图片颜色异常的问题.

  5. 大数据Hadoop入门视频教程:Hadoop的快如入门

    最新在学习hadoop .storm大数据相关技术,发现网上hadoop .storm 相关学习视频少之又少,这里整理了传智播客段海涛老师的hadoop学习视频,出来给大家学习交流. 视频下载地址:h ...

  6. 修改 input中的placeholder的字体样式和颜色

    placeholder属性是css3中新增加的属性, 由于是新加入的属性因此对各大浏览器都不兼容: 因此在使用的时候要加兼容性 火狐:-moz-placeholder { /* Mozilla Fir ...

  7. lnamp环境搭建博客、论坛

    实验环境:Centos6.5 源码安装Nginx yum安装Apache.php.Mysql Mysql: yum -y install mysql-server  安装Mysql数据库 /etc/i ...

  8. MSSQL转Mysql常用函数,语法等

    MSSQL转Mysql常用 一.字段类型 MSSQL Mysql 备注 "nchar" "char()" 最大长度为255 "nvarchar&quo ...

  9. LeetCode 547 朋友圈

    题目: 班上有 N 名学生.其中有些人是朋友,有些则不是.他们的友谊具有是传递性.如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友.所谓的朋友圈,是指所有朋友的 ...

  10. Git问题总结

    1 git push origin master 提示Everything up-to-date 表示本地仓库和远程仓库是一致的,没有更新,需要检查自己的提交. 2 git push origin m ...