互聯網服務離不開用戶認證,下面我們來講解一下Json web Token的使用方法
簡單介紹一下:
- 用戶向服務器發送用戶名和密碼。
- 服務器驗證通過後,在當前對話(session)裏面保存相關數據,比如用戶角色、登錄時間等等。
- 服務器向用戶返回一個 session_id,寫入用戶的 Cookie。
- 用戶隨後的每一次請求,都會通過 Cookie,將 session_id 傳回服務器。
- 服務器收到 session_id,找到前期保存的數據,由此得知用戶的身份。
JWT 的原理:
JWT 的原理是,服務器認證以後,生成一個 JSON 對象,發回給用戶,就像下面這樣。
{ "姓名": "張三", "角色": "管理員", "到期時間": "2018年7月1日0點0分" }
以後,用戶與服務端通信的時候,都要發回這個 JSON 對象。服務器完全只靠這個對象認定用戶身份。
爲了防止用戶篡改數據,服務器在生成這個對象的時候,會加上簽名。
服務器就不保存任何 session 數據了,也就是說,服務器變成無狀態了,從而比較容易實現擴展。
關實現簽名:
加入JWT的mave相關依賴後,我們在來寫算法
<!-- JWT相關 -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.7.0</version>
</dependency>
下面代碼中就是JWT的工具類,裏面寫了一個生成方法及校驗方法,簡單易懂
package net.xdclass.xdvideo.utils;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import net.xdclass.xdvideo.domain.User;
import java.util.Date;
/**
* jwt工具類
*/
public class JwtUtils {
public static final String SUBJECT = "xdclass";
public static final long EXPIRE = 1000*60*60*24*7; //過期時間,毫秒,一週
//祕鑰
public static final String APPSECRET = "xd666";
/**
* 生成jwt
* @param user
* @return
*/
public static String geneJsonWebToken(User user){
if(user == null || user.getId() == null || user.getName() == null
|| user.getHeadImg()==null){
return null;
}
String token = Jwts.builder().setSubject(SUBJECT)
.claim("id",user.getId())
.claim("name",user.getName())
.claim("img",user.getHeadImg())
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis()+EXPIRE))
.signWith(SignatureAlgorithm.HS256,APPSECRET).compact();
return token;
}
/**
* 校驗token
* @param token
* @return
*/
public static Claims checkJWT(String token ){
try{
final Claims claims = Jwts.parser().setSigningKey(APPSECRET).
parseClaimsJws(token).getBody();
return claims;
}catch (Exception e){ }
return null;
}
}