2016-03-04 35 views

回答

7

JWT对象编码Base64URL。这意味着您可以通过手动Base64URL解码来读取标头和有效载荷。在这种情况下,您将忽略exp属性。

举例来说,你可以做这样的(我使用的是内置Base64类Java8,但你可以使用任何外部库,如Apache Commons Codec):

Base64.Decoder decoder = Base64.getUrlDecoder(); 
String src = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImV4cCI6IjEzMDA4MTkzODAifQ.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.2GpoV9q_uguSg0Ku6peI5aZ2qBxO5qOA42zaS25gq_c"; 
String[] parts = src.split("\\."); // Splitting header, payload and signature 
System.out.println("Headers: "+new String(decoder.decode(parts[0]))); // Header 
System.out.println("Payload: "+new String(decoder.decode(parts[1]))); // Payload 

,输出是:

Headers: {"alg":"HS256","typ":"JWT","exp":"1300819380"} 
Payload: {"sub":"1234567890","name":"John Doe","admin":true} 

请注意,exp属性设置为1300819380,这对应于16 january 2016

7

有一个更好的方法来做到这一点。 如果您看到JWT异常处理程序对象例如ExpiredJwtException,期望对象本身包含以下内容: - 标题,声明和消息

所以声明可以很容易地通过此对象提取,即e.getClaims().getId()其中e是ExpiredJwtException对象。

ExpiredJwtException consturct是如下: -

public ExpiredJwtException(Header header, Claims claims, String message) { 
     super(header, claims, message); 
} 

实施例: -

try{ 
     // executable code 
    }catch(ExpiredJwtException e){ 
     System.out.println("token expired for id : " + e.getClaims().getId()); 
    }