Java大白話—–Token入門案例javascript
Token入門案例今天爲你們介紹一下Token的基本原理(以最直白的方式)html
兩片一樣的鑰匙前端
這是一家神奇的酒店,全部的客房竟然都沒有鑰匙孔,但是每間房們前都作着一位鑰匙匠。java
這種革命性的酒店安全管理方式是這樣的:mysql
客人來到大廳,告訴前臺他的帳號與密碼,前臺給了他一把鑰匙jquery
他拿着鑰匙來到房門前,鑰匙匠詢問了他的姓名,隨即作出了一把鑰匙,再與前臺的鑰匙進行比對,若是一致,用戶就能夠進門了。ajax
從如今起,這家酒店成爲了一家不須要保存用戶帳戶信息的酒店!sql
以上就是基本概念了數據庫
再說說基本的技術實現路線:安全
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>