後臺實戰——使用者登入之JWT
現在的app往往會有登入功能,一般移動端app登入後都會得到一個token,今天就將token的一種實現方式Json Web Token(JWT),對於不瞭解JWT的同學可以參考這裡,這裡還有一個線上的的JWT生成器。
在java中要使用jwt,需要pom.xml中新增如下依賴
- <dependency>
- <groupId>com.auth0</groupId>
- <artifactId>java-jwt</artifactId>
- <version>2.2.0</version>
- </dependency>
首先建立工具類JWT
具體程式碼如下:
- package com.xt.tutorial.utils;
- import java.util.HashMap;
- import java.util.Map;
- import com.auth0.jwt.JWTSigner;
- import com.auth0.jwt.JWTVerifier;
- import com.auth0.jwt.internal.com.fasterxml.jackson.databind.ObjectMapper;
- public class JWT {
- private static final String SECRET = "XX#$%()(#*!()!KL<><MQLMNQNQJQK sdfkjsdrow32234545fdf>?N<:{LWPW";
- private static final String EXP = "exp";
- private static final String PAYLOAD = "payload";
- /**
- * get jwt String of object
- * @param object
- * the POJO object
- * @param maxAge
- * the milliseconds of life time
- * @return the jwt token
- */
- public static <T> String sign(T object, long maxAge) {
- try {
- final JWTSigner signer = new JWTSigner(SECRET);
- final Map<String, Object> claims = new HashMap<String, Object>();
- ObjectMapper mapper = new ObjectMapper();
- String jsonString = mapper.writeValueAsString(object);
- claims.put(PAYLOAD, jsonString);
- claims.put(EXP, System.currentTimeMillis() + maxAge);
- return signer.sign(claims);
- } catch(Exception e) {
- return null;
- }
- }
- /**
- * get the object of jwt if not expired
- * @param jwt
- * @return POJO object
- */
- public static<T> T unsign(String jwt, Class<T> classT) {
- final JWTVerifier verifier = new JWTVerifier(SECRET);
- try {
- final Map<String,Object> claims= verifier.verify(jwt);
- if (claims.containsKey(EXP) && claims.containsKey(PAYLOAD)) {
- long exp = (Long)claims.get(EXP);
- long currentTimeMillis = System.currentTimeMillis();
- if (exp > currentTimeMillis) {
- String json = (String)claims.get(PAYLOAD);
- ObjectMapper objectMapper = new ObjectMapper();
- return objectMapper.readValue(json, classT);
- }
- }
- return null;
- } catch (Exception e) {
- return null;
- }
- }
- }
新建UsersController用於測試登入
建立User模型
UsersController程式碼如下
- package com.xt.tutorial.v1.controllers;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.PostMapping;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestParam;
- import org.springframework.web.bind.annotation.ResponseBody;
- import com.xt.tutorial.models.User;
- import com.xt.tutorial.utils.JWT;
- import com.xt.tutorial.utils.ResponseData;
- @Controller
- @RequestMapping("/users")
- public class UsersController {
- @PostMapping("/login")
- @ResponseBody
- public ResponseData login(@RequestParam String username, @RequestParam String password) {
- if ("imjack".equals(username) && "123456".equals(password)) {
- ResponseData responseData = ResponseData.ok();
- User user = new User();
- user.setId(1);
- user.setUsername(username);
- user.setPassword(password);
- responseData.putDataValue("user", user);
- String token = JWT.sign(user, 30L * 24L * 3600L * 1000L);
- if (token != null) {
- responseData.putDataValue("token", token);
- }
- return responseData;
- }
- return ResponseData.customerError().putDataValue(ResponseData.ERRORS_KEY, new String[] { "使用者名稱或者密碼錯誤" });
- }
- }
User模型程式碼如下
- package com.xt.tutorial.models;
- public class User {
- private long id;
- private String username;
- private String password;
- public long getId() {
- return id;
- }
- public void setId(long id) {
- this.id = id;
- }
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- }
為了驗證我們的JWT是否真的可以工作,我們再設計一個MeController裡面有一個get_info介面
具體程式碼如下
- package com.xt.tutorial.v1.controllers;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.GetMapping;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestParam;
- import org.springframework.web.bind.annotation.ResponseBody;
- import com.xt.tutorial.models.User;
- import com.xt.tutorial.utils.JWT;
- import com.xt.tutorial.utils.ResponseData;
- @Controller
- @RequestMapping("/me")
- public class MeController {
- @GetMapping("/get_info")
- @ResponseBody
- public ResponseData getInfo(@RequestParam String token) {
- User user = JWT.unsign(token, User.class);
- if (user != null) {
- return ResponseData.ok().putDataValue("user", user);
- }
- return ResponseData.customerError().putDataValue(ResponseData.ERRORS_KEY, new String[] { "token不合法" });
- }
- }
右擊專案【Run As->Maven build】執行專案
這樣一個簡單完整的jwt就完成了,下一篇將繼續介紹jwt
專案完整地址:https://github.com/imchenglibin/spring-web-tutorial
文章轉載自:https://blog.csdn.net/jackcheng_ht/article/details/52670211
相關文章
- 實戰模擬│JWT 登入認證JWT
- Laravel5.6 實現後臺管理登入(自定義使用者表登入)Laravel
- jwt以及如何使用jwt實現登入JWT
- Laravel JWT 多表多使用者登入LaravelJWT
- 實戰!Spring Boot Security+JWT前後端分離架構登入認證!Spring BootJWT後端架構
- 實戰!spring Boot security+JWT 前後端分離架構認證登入!Spring BootJWT後端架構
- jwt加meta元資訊實現登入後校驗JWT
- JWT登入鑑權:避免在使用者操作的過程中JWT到期跳轉登入JWT
- 網站登入JWT的實現網站JWT
- 使用者登入前臺之後,無法退出如何解決?謝謝
- 部落格後臺登入,使用者,說說等功能實現
- Spring Cloud實戰系列(十) - 單點登入JWT與Spring Security OAuthSpringCloudJWTOAuth
- zblog升級之後不能登入後臺怎麼回事
- JWT實現登入認證例項JWT
- golang 中使用 JWT 實現登入驗證GolangJWT
- 深入Vue後臺管理開發之登入驗證Vue
- 一次奇妙的任意使用者登入實戰
- 登入模組 使用者認證 SpringSecurity +Oauth2+JwtSpringGseOAuthJWT
- 使用 Laravel5.7 許可權管理系統後臺及前後臺使用者登入Laravel
- golang 基於 jwt 實現的登入授權GolangJWT
- MFC 之使用者登入介面
- express基於JWT實現使用者登陸授權ExpressJWT
- Python爬蟲實戰之(五)| 模擬登入wechatPython爬蟲
- C#分散式登入——jwtC#分散式JWT
- Laravel 5.5 不同使用者表登入認證 (前後臺分離)Laravel
- jwt登入後重新整理頁面 使用者資訊為什麼也會重新整理JWT
- 實現基於JWT的Token登入驗證功能JWT
- cookie之登入使用者憑證Cookie
- PbootCMS後臺登陸密碼忘記/找回後臺登入密碼外掛boot密碼
- 實戰:Mailivery 模擬登入AI
- jwt與session的登入鑑權JWTSession
- JWT登入認證-專案BotBattleJWTBAT
- Fastadmin隱藏後臺登入入口地址?AST
- JWT+SpringBoot實戰JWTSpring Boot
- JWT+Interceptor實現無狀態登入和鑑權JWT
- 手把手帶你使用JWT實現單點登入JWT
- 帝國cms登入後臺提示“登入成功”,接著又提示“您還未登入”
- Django2 Web 實戰02-使用者註冊登入退出DjangoWeb