Java大白话—–Token入门案例(附demo下载)

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>

项目下载地址:http://download.csdn.net/detail/a8250852/9848448

猜你喜欢

转载自my.oschina.net/u/3787897/blog/1632897