token简单的使用
token简单的使用
这里对token的简单的使用进行测试和描述
其原理就不在这里描述了!
具体测试流程:
用户在前端请求登录——>在后台验证通过后根据用户ID生成token——>请求返回时将token带给前端并存在前端——>以后前端再次请求时需要带上token
——>后台接受到token并验证,如果验证通过,返回true,否则false(实际情况下就是验证通过,这次请求成功,否则这次请求无效)
1、数据库里面建立一个用户表,用于存储用户登录的账号和密码,用于用户登录测试
2、后台生成token的代码类JavaWebToken(网上可以查到)
1 import io.jsonwebtoken.Jwts; 2 import io.jsonwebtoken.SignatureAlgorithm; 3 import org.slf4j.Logger; 4 import org.slf4j.LoggerFactory; 5 6 import javax.crypto.spec.SecretKeySpec; 7 import javax.xml.bind.DatatypeConverter; 8 import java.security.Key; 9 import java.util.Map; 10 11 public class JavaWebToken { 12 private static Logger log = LoggerFactory.getLogger(JavaWebToken.class); 13 14 //该方法使用HS256算法和Secret:bankgl生成signKey 15 private static Key getKeyInstance() { 16 //We will sign our JavaWebToken with our ApiKey secret 17 SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; 18 byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary("bankgl"); 19 Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName()); 20 return signingKey; 21 } 22 23 //使用HS256签名算法和生成的signingKey最终的Token,claims中是有效载荷 24 public static String createJavaWebToken(Map<String, Object> claims) { 25 return Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS256, getKeyInstance()).compact(); 26 } 27 28 //解析Token,同时也能验证Token,当验证失败返回null 29 public static Map<String, Object> parserJavaWebToken(String jwt) { 30 try { 31 Map<String, Object> jwtClaims = 32 Jwts.parser().setSigningKey(getKeyInstance()).parseClaimsJws(jwt).getBody(); 33 return jwtClaims; 34 } catch (Exception e) { 35 log.error("json web token verify failed"); 36 return null; 37 } 38 } 39 }
使用前需要导入依赖包,在项目的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使用验证