这里对token的简单的使用进行测试和描述
其原理就不在这里描述了!
具体测试流程:用户在前端请求登录——>在后台验证通过后根据用户ID生成token——>请求返回时将token带给前端并存在前端——>以后前端再次请求时需要带上token
——>后台接受到token并验证,如果验证通过,返回true,否则false(实际情况下就是验证通过,这次请求成功,否则这次请求无效)
1、数据库里面建立一个用户表,用于存储用户登录的账号和密码,用于用户登录测试
2、后台生成token的代码类JavaWebToken(网上可以查到)
1 importio.jsonwebtoken.Jwts;2 importio.jsonwebtoken.SignatureAlgorithm;3 importorg.slf4j.Logger;4 importorg.slf4j.LoggerFactory;5
6 importjavax.crypto.spec.SecretKeySpec;7 importjavax.xml.bind.DatatypeConverter;8 importjava.security.Key;9 importjava.util.Map;10
11 public classJavaWebToken {12 private static Logger log = LoggerFactory.getLogger(JavaWebToken.class);13
14 //该方法使用HS256算法和Secret:bankgl生成signKey
15 private staticKey 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 = newSecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());20 returnsigningKey;21 }22
23 //使用HS256签名算法和生成的signingKey最终的Token,claims中是有效载荷
24 public static String createJavaWebToken(Mapclaims) {25 returnJwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS256, getKeyInstance()).compact();26 }27
28 //解析Token,同时也能验证Token,当验证失败返回null
29 public static MapparserJavaWebToken(String jwt) {30 try{31 Map jwtClaims =
32 Jwts.parser().setSigningKey(getKeyInstance()).parseClaimsJws(jwt).getBody();33 returnjwtClaims;34 } catch(Exception e) {35 log.error("json web token verify failed");36 return null;37 }38 }39 }
使用前需要导入依赖包,在项目的pom.xml文件中加入:
io.jsonwebtoken
jjwt
0.7.0
测试的控制层代码:
/*** 登录验证 login
*@paramrc 前端请求类(包含前端用户输入的账号和密码)
*@paramresponse
*@returnLoginInfo 用户信息类(包含用户的ID,账号和密码和生成token字符串信息)*/@RequestMapping(value= "/login")publicLoginInfo 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= newLoginInfo();
Map m = new HashMap();
m.put("userId",userInf.getId());
String token= JavaWebToken.createJavaWebToken(m); //根据存在用户的id生成token字符串
loginInfo.setUserInf(userInf);
loginInfo.setToken(token);//存在对象中并返回给前端
returnloginInfo;
}/*** token验证方法
*@paramrc
*@paramresponse
*@return
*/@RequestMapping(value= "/tokenConfirm")publicLoginInfo tokenConfirm(RequestClass rc,HttpServletResponse response){
response.setHeader("Access-Control-Allow-Origin","*");
LoginInfo loginInfo= newLoginInfo();
System.out.println(rc.getToken());if (JavaWebToken.parserJavaWebToken(rc.getToken()) != null){ //根据前端带回来的token验证
loginInfo.setTokenMark("true"); //验证通过
}else{
loginInfo.setTokenMark("false"); //验证失败
}returnloginInfo;
}
3、前台测试页面如下:
前端代码:
{{ title }}
账号
密码
登录
访问后台
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){varobj=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){varobj=response.data;
console.log(obj);
})
.catch(function(){
console.log(error);
});
}
},
mounted(){
}
}
h1, h2{font-weight:normal;
}ul{list-style-type:none;padding:0;
}li{display:inline-block;margin:0 10px;
}a{color:#42b983;
}
其中,引用的Cookie.js:
functionsetCookie(token){
document.cookie=token;
}functiongetCookie(){returndocument.cookie;
}
export {setCookie,getCookie}
4、开始测试,在页面输入用户的账号密码,点击登录按钮
后台验证成功,在页面控制台输出可以看到后台返回的token
再点击访问后台请求的按钮,后台验证这个token并返回结果为true
假设我们这里改变了这个token,并发送给后台,则后台对token验证失败会返回false
点击访问后台按钮
到此,简单的token使用验证