1、token與cookie相比較的優點
一、支持跨域訪問,將token置於請求頭中,而cookie是不支持跨域訪問的;java
二、無狀態化,服務端無需存儲token,只須要驗證token信息是否正確便可,而session須要在服務端存儲,通常是經過cookie中的sessionID在服務端查找對應的session;算法
三、無需綁定到一個特殊的身份驗證方案(傳統的用戶名密碼登錄),只須要生成的token是符合咱們預期設定的便可;小程序
四、更適用於移動端(Android,iOS,小程序等等),像這種原平生臺不支持cookie,好比說微信小程序,每一次請求都是一次會話,固然咱們能夠每次去手動爲他添加cookie,詳情請查看博主另外一篇博客;微信小程序
五、避免CSRF跨站僞造攻擊,仍是由於不依賴cookie;跨域
2、基於JWT的token認證明現
JWT:JSON Web Token,其實token就是一段字符串,由三部分組成:Header,Payload,Signature微信
一、引入依賴cookie
<dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.8.2</version> </dependency>
二、設置密鑰和生存時間session
//設置過時時間 private static final long EXPIRE_DATE=30*60*100000; //token祕鑰 private static final String TOKEN_SECRET = "ZCEQIUBFKSJBFJH2020BQWE";
三、實現簽名方法工具
public static String token (String username,String password){ String token = ""; try { //過時時間 Date date = new Date(System.currentTimeMillis()+EXPIRE_DATE); //祕鑰及加密算法 Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET); //設置頭部信息 Map<String,Object> header = new HashMap<>(); header.put("typ","JWT"); header.put("alg","HS256"); //攜帶username,password信息,生成簽名 token = JWT.create() .withHeader(header) .withClaim("username",username) .withClaim("password",password).withExpiresAt(date) .sign(algorithm); }catch (Exception e){ e.printStackTrace(); return null; } return token; }
四、驗證token測試
public static boolean verify(String token){ /** * @desc 驗證token,經過返回true * @create 2019/1/18/018 9:39 * @params [token]須要校驗的串 **/ try { Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET); JWTVerifier verifier = JWT.require(algorithm).build(); DecodedJWT jwt = verifier.verify(token); return true; }catch (Exception e){ e.printStackTrace(); return false; } }
五、測試
1)、直接用生成的token去驗證,成功
public static void main(String[] args) { String username ="zhangsan"; String password = "123"; String token = token(username,password); System.out.println(token); boolean b = verify(token); System.out.println(b); }
package xxx.utils; //你的包 import com.auth0.jwt.JWT; import com.auth0.jwt.JWTVerifier; import com.auth0.jwt.algorithms.Algorithm; import com.auth0.jwt.interfaces.DecodedJWT; import java.util.Date; import java.util.HashMap; import java.util.Map; /** * @desc 使用token驗證用戶是否登陸 * @author zm **/ public class TokenUtils { //設置過時時間 private static final long EXPIRE_DATE=30*60*100000; //token祕鑰 private static final String TOKEN_SECRET = "ZCfasfhuaUUHufguGuwu2020BQWE"; public static String token (String username,String password){ String token = ""; try { //過時時間 Date date = new Date(System.currentTimeMillis()+EXPIRE_DATE); //祕鑰及加密算法 Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET); //設置頭部信息 Map<String,Object> header = new HashMap<>(); header.put("typ","JWT"); header.put("alg","HS256"); //攜帶username,password信息,生成簽名 token = JWT.create() .withHeader(header) .withClaim("username",username) .withClaim("password",password).withExpiresAt(date) .sign(algorithm); }catch (Exception e){ e.printStackTrace(); return null; } return token; } public static boolean verify(String token){ /** * @desc 驗證token,經過返回true * @params [token]須要校驗的串 **/ try { Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET); JWTVerifier verifier = JWT.require(algorithm).build(); DecodedJWT jwt = verifier.verify(token); return true; }catch (Exception e){ e.printStackTrace(); return false; } } public static void main(String[] args) { String username ="zhangsan"; String password = "123"; String token = token(username,password); System.out.println(token); boolean b = verify("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXNzd22yZCI6IjEyMyIsImV4cCI6MTU3ODE5NzQxMywidXNlcm5hbWUiOiJ6aGFuZ3NhbiJ9.IyTZT0tISQQZhGhsNuaqHGV8LD7idjUYjn3MGbulmJg"); System.out.println(b); } }