Java大白话—–Token入门案例
Token入门案例今天为大家介绍一下Token的基本原理(以最直白的方式)
两片同样的钥匙
这是一家神奇的酒店,所有的客房居然都没有钥匙孔,可是每间房们前都做着一位钥匙匠。
这种革命性的酒店安全管理方式是这样的:
客人来到大厅,告诉前台他的账号与密码,前台给了他一把钥匙
他拿着钥匙来到房门前,钥匙匠询问了他的姓名,随即做出了一把钥匙,再与前台的钥匙进行比对,如果一致,用户就可以进门了。
从现在起,这家酒店成为了一家不需要保存用户账户信息的酒店!
以上就是基本概念了
再说说基本的技术实现路线:
1.用户在登录页面输入账号密码,提交后,java后台进行一次验证,如果正确,则为用户制作token令牌
具体制作过程:
将传过来的值进行一个加密就可以了制作成token令牌了,一般来说,选用md5加密方式,参数方面,可以使用用户名+秘钥
2.将加密后的字符串传给前端
3.前端使用cookie保存token和用户名
4.使用拦截器,获取用户名和token,使用用户名再制作token,然后比对,如果一致就可以放行了
好了现在我们来举个栗子
先简单介绍下项目结构
JFinal + mysql + jQuery
其实呢,JFinal这个框架还是很简单的,去网上找一个demo看看就好
先贴出login页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script src ="js/jquery-1.8.3.min.js"type="text/javascript"></script>
<script src ="js/jquery.cookie.js"type="text/javascript"></script>
<script src ="js/jquery.form.js"type="text/javascript"></script>
</head>
<body>
<form action="token/signIn" id = loginForm>
username:<br>
<input type="text" name="username" id = "username" value="Mickey">
<br>
password:<br>
<input type="text" name="password" id = "password" value="Mouse">
<br><br>
<input type = "button" id ="p" value="Submit">
</form>
</body>
<script type="text/javascript">
$(document).ready(function(){
$("#p").click(function(){
$("#loginForm").ajaxSubmit({
success : function(data) {
console.log(data);
if(data.flag){
$.cookie('userToken', data.token);
$.cookie('username',$("#username").val());
$.cookie('password',$("#password").val());
}
else alert("账号密码错误");
}
});
});
});
</script>
</html>
然后当然是这个页面的处理方法
package controller;
import java.util.HashMap;
import java.util.Map;
import util.SecurityUitl;
import com.jfinal.core.Controller;
import service.UserService;
public class TokenController extends Controller {
private UserService userService = new UserService();
public void signIn(){
String username = getPara("username");
String password = getPara("password");
System.out.print(username+password);
boolean loginCheck = userService.login(username, password);//向数据库验证用户名和密码
if(loginCheck){
//token逻辑
Map a = new HashMap();
a.put("username", username);
a.put("miyao", "111111");
Map token = new HashMap();
setAttr("flag",true);
setAttr("token",SecurityUitl.authentication(a));
renderJson();//向前端返回数据
}
else{
setAttr("flag",false);
renderJson();
}
}
public void userAu(){
String username = getPara("username");
String token = getPara("token");
Map a = new HashMap();
a.put("username", username);
a.put("miyao", "111111");
renderJson(SecurityUitl.judeAu(a, token));
}
}
具体的token加密实现我就不说了,网上大把,我上传的代码包里面也有。
到这一步,用户成功登陆后,token就已经保存到cookie中了。然后是token的验证
使用拦截器:
package interceptor;
import java.util.HashMap;
import java.util.Map;
import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;
import com.jfinal.config.Interceptors;
import com.jfinal.core.Controller;
import com.jfinal.render.Render;
import util.SecurityUitl;
public class AuthInterceptor implements Interceptor{
private String[] interceptList = {"/login.jsp","/token/signIn"};
@Override
public void intercept(Invocation invocation) {
// TODO Auto-generated method stub
System.out.println("拦截器");
//排除拦截,避免死循环
boolean flag = true;
for(int i = 0 ; i < interceptList.length ; i = i + 1){
if(invocation.getActionKey().equals(interceptList[i])) flag = false;
}
if(flag){
Controller controller = invocation.getController();
//controller.setSessionAttr("flag", true);
//Boolean loginUser = controller.getSessionAttr("flag");
System.out.println("getUserController:"+controller.getCookie("userToken"));
Map a = new HashMap();
a.put("username", controller.getCookie("username"));
a.put("miyao", "111111");
if(controller.getCookie("userToken").equals(SecurityUitl.authentication(a))){
System.out.println("token验证成功,进入主页");
invocation.invoke();
}
else{
System.out.println("跳转到登陆页面");
controller.redirect("/login.jsp");
}
}
else invocation.invoke();
}
}
然后写一个简单的index页来测试一下
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script src ="js/jquery-1.8.3.min.js"type="text/javascript"></script>
<script src ="js/jquery.cookie.js"type="text/javascript"></script>
</head>
<body>
我是主页
</body>
<script type="text/javascript">
alert($.cookie("userToken"));
</script>
</html>