後臺實戰——使用者登入之JWT

itKingOne發表於2018-03-26

現在的app往往會有登入功能,一般移動端app登入後都會得到一個token,今天就將token的一種實現方式Json Web Token(JWT),對於不瞭解JWT的同學可以參考這裡這裡還有一個線上的的JWT生成器。

在java中要使用jwt,需要pom.xml中新增如下依賴

[html] view plain copy
  1. <dependency>  
  2.     <groupId>com.auth0</groupId>  
  3.     <artifactId>java-jwt</artifactId>  
  4.     <version>2.2.0</version>  
  5. </dependency>  

首先建立工具類JWT


具體程式碼如下:

[java] view plain copy
  1. package com.xt.tutorial.utils;  
  2.   
  3. import java.util.HashMap;  
  4. import java.util.Map;  
  5.   
  6. import com.auth0.jwt.JWTSigner;  
  7. import com.auth0.jwt.JWTVerifier;  
  8. import com.auth0.jwt.internal.com.fasterxml.jackson.databind.ObjectMapper;  
  9.   
  10. public class JWT {  
  11.   
  12.     private static final String SECRET = "XX#$%()(#*!()!KL<><MQLMNQNQJQK sdfkjsdrow32234545fdf>?N<:{LWPW";  
  13.       
  14.     private static final String EXP = "exp";  
  15.       
  16.     private static final String PAYLOAD = "payload";  
  17.   
  18.     /** 
  19.      * get jwt String of object 
  20.      * @param object 
  21.      *            the POJO object 
  22.      * @param maxAge 
  23.      *            the milliseconds of life time 
  24.      * @return the jwt token 
  25.      */  
  26.     public static <T> String sign(T object, long maxAge) {  
  27.         try {  
  28.             final JWTSigner signer = new JWTSigner(SECRET);  
  29.             final Map<String, Object> claims = new HashMap<String, Object>();  
  30.             ObjectMapper mapper = new ObjectMapper();  
  31.             String jsonString = mapper.writeValueAsString(object);  
  32.             claims.put(PAYLOAD, jsonString);  
  33.             claims.put(EXP, System.currentTimeMillis() + maxAge);  
  34.             return signer.sign(claims);  
  35.         } catch(Exception e) {  
  36.             return null;  
  37.         }  
  38.     }  
  39.       
  40.       
  41.     /** 
  42.      * get the object of jwt if not expired 
  43.      * @param jwt 
  44.      * @return POJO object 
  45.      */  
  46.     public static<T> T unsign(String jwt, Class<T> classT) {  
  47.         final JWTVerifier verifier = new JWTVerifier(SECRET);  
  48.         try {  
  49.             final Map<String,Object> claims= verifier.verify(jwt);  
  50.             if (claims.containsKey(EXP) && claims.containsKey(PAYLOAD)) {  
  51.                 long exp = (Long)claims.get(EXP);  
  52.                 long currentTimeMillis = System.currentTimeMillis();  
  53.                 if (exp > currentTimeMillis) {  
  54.                     String json = (String)claims.get(PAYLOAD);  
  55.                     ObjectMapper objectMapper = new ObjectMapper();  
  56.                     return objectMapper.readValue(json, classT);  
  57.                 }  
  58.             }  
  59.             return null;  
  60.         } catch (Exception e) {  
  61.             return null;  
  62.         }  
  63.     }  
  64. }  



新建UsersController用於測試登入


建立User模型


UsersController程式碼如下

[java] view plain copy
  1. package com.xt.tutorial.v1.controllers;  
  2.   
  3. import org.springframework.stereotype.Controller;  
  4. import org.springframework.web.bind.annotation.PostMapping;  
  5. import org.springframework.web.bind.annotation.RequestMapping;  
  6. import org.springframework.web.bind.annotation.RequestParam;  
  7. import org.springframework.web.bind.annotation.ResponseBody;  
  8.   
  9. import com.xt.tutorial.models.User;  
  10. import com.xt.tutorial.utils.JWT;  
  11. import com.xt.tutorial.utils.ResponseData;  
  12.   
  13. @Controller  
  14. @RequestMapping("/users")  
  15. public class UsersController {  
  16.   
  17.     @PostMapping("/login")  
  18.     @ResponseBody  
  19.     public ResponseData login(@RequestParam String username, @RequestParam String password) {  
  20.         if ("imjack".equals(username) && "123456".equals(password)) {  
  21.             ResponseData responseData = ResponseData.ok();  
  22.             User user = new User();  
  23.             user.setId(1);  
  24.             user.setUsername(username);  
  25.             user.setPassword(password);  
  26.             responseData.putDataValue("user", user);  
  27.             String token = JWT.sign(user, 30L * 24L * 3600L * 1000L);  
  28.             if (token != null) {  
  29.                 responseData.putDataValue("token", token);  
  30.             }  
  31.             return responseData;  
  32.         }  
  33.         return ResponseData.customerError().putDataValue(ResponseData.ERRORS_KEY, new String[] { "使用者名稱或者密碼錯誤" });  
  34.     }  
  35. }  

User模型程式碼如下

[java] view plain copy
  1. package com.xt.tutorial.models;  
  2.   
  3. public class User {  
  4.     private long id;  
  5.     private String username;  
  6.     private String password;  
  7.   
  8.     public long getId() {  
  9.         return id;  
  10.     }  
  11.   
  12.     public void setId(long id) {  
  13.         this.id = id;  
  14.     }  
  15.   
  16.     public String getUsername() {  
  17.         return username;  
  18.     }  
  19.   
  20.     public void setUsername(String username) {  
  21.         this.username = username;  
  22.     }  
  23.   
  24.     public String getPassword() {  
  25.         return password;  
  26.     }  
  27.   
  28.     public void setPassword(String password) {  
  29.         this.password = password;  
  30.     }  
  31. }  
右擊專案【Run As->Maven build】執行專案


為了驗證我們的JWT是否真的可以工作,我們再設計一個MeController裡面有一個get_info介面


具體程式碼如下

[java] view plain copy
  1. package com.xt.tutorial.v1.controllers;  
  2.   
  3. import org.springframework.stereotype.Controller;  
  4. import org.springframework.web.bind.annotation.GetMapping;  
  5. import org.springframework.web.bind.annotation.RequestMapping;  
  6. import org.springframework.web.bind.annotation.RequestParam;  
  7. import org.springframework.web.bind.annotation.ResponseBody;  
  8.   
  9. import com.xt.tutorial.models.User;  
  10. import com.xt.tutorial.utils.JWT;  
  11. import com.xt.tutorial.utils.ResponseData;  
  12.   
  13. @Controller  
  14. @RequestMapping("/me")  
  15. public class MeController {  
  16.   
  17.     @GetMapping("/get_info")  
  18.     @ResponseBody  
  19.     public ResponseData getInfo(@RequestParam String token) {  
  20.         User user = JWT.unsign(token, User.class);  
  21.         if (user != null) {  
  22.             return ResponseData.ok().putDataValue("user", user);  
  23.         }  
  24.         return ResponseData.customerError().putDataValue(ResponseData.ERRORS_KEY, new String[] { "token不合法" });  
  25.     }  
  26. }  

右擊專案【Run As->Maven build】執行專案


這樣一個簡單完整的jwt就完成了,下一篇將繼續介紹jwt

專案完整地址:https://github.com/imchenglibin/spring-web-tutorial

文章轉載自:https://blog.csdn.net/jackcheng_ht/article/details/52670211

相關文章