SpringBoot實(shí)現(xiàn)token登錄的示例代碼
為什么引入token機(jī)制?
在進(jìn)行登錄驗(yàn)證時(shí),我們需要session或cookie會(huì)話進(jìn)行驗(yàn)證,客戶端包括瀏覽器、app、微信小程序、公眾號(hào),只有瀏覽器有session和cookie機(jī)制,當(dāng)我們脫離瀏覽器用app等向服務(wù)端發(fā)請(qǐng)求就沒有session和cookie機(jī)制,這時(shí)我們就需要使用token令牌進(jìn)行登錄驗(yàn)證。

代碼實(shí)現(xiàn)
先建個(gè)util包,并創(chuàng)建TokenUtil類用于生成token

TokenUtil類代碼
package com.qcby.util;
import com.qcby.entity.User;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public class TokenUtil {
/**
* 創(chuàng)建map用于存儲(chǔ)所有的令牌
*
* token - User
*/
private static Map<String, User> tokenMap=new HashMap<>();
/**
* 生成token,存儲(chǔ)token-user對(duì)應(yīng)關(guān)系
* 返回token令牌
* @param user
* @return
*/
public static String generateToken(User user){
//生成唯一不重復(fù)的字符串
String token = UUID.randomUUID().toString();
tokenMap.put(token,user);
return token;
}
/**
* 驗(yàn)證token是否合法
* @param token
* @return
*/
public static boolean verify(String token){
return tokenMap.containsKey(token);
}
/**
* 根據(jù)token獲取用戶信息
* @param token
* @return
*/
public static User getUser(String token){
return tokenMap.get(token);
}
}LoginInterceptor類代碼
package com.qcby.interceptor;
import com.qcby.util.TokenUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class LoginInterceptor implements HandlerInterceptor {
//Controller邏輯執(zhí)行之前
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle....");
String uri = request.getRequestURI();
System.out.println("當(dāng)前路徑"+uri);
/**
* HandlerMethod=>Controller中標(biāo)注@RequestMapping的方法
* 需要配置靜態(tài)資源不攔截時(shí),添加這塊邏輯 => 前后端分離項(xiàng)目
*/
if (!(handler instanceof HandlerMethod)) {
return true;
}
String token=request.getHeader("qcby-token");
if (!TokenUtil.verify(token)) {
// 未登錄跳轉(zhuǎn)到登錄界面
throw new RuntimeException("no login!");
} else {
return true;
}
}
//Controller邏輯執(zhí)行完畢但是視圖解析器還未進(jìn)行解析之前
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle....");
}
//Controller邏輯和視圖解析器執(zhí)行完畢
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("afterCompletion....");
}
}實(shí)現(xiàn)類
@RestController
@RequestMapping("user")
public class UserController {
@Autowired
private UserService userService;
@ApiOperation("用戶登錄接口")
@RequestMapping(value="login",method = {RequestMethod.GET,RequestMethod.POST})
public Map<String,Object>login(User user){
Map<String,Object> map=new HashMap<>();
map.put("code",0);
if(StringUtils.isEmpty(user.getUsername())||StringUtils.isEmpty(user.getPassword())){
map.put("msg","用戶或密碼為空!");
return map;
}
QueryWrapper<User> queryWrapper=new QueryWrapper<>();
queryWrapper.eq("username",user.getUsername())
.eq("password",user.getPassword());
User user1=userService.getOne(queryWrapper);
if(user1!=null){
String token= TokenUtil.generateToken(user1);
map.put("cod",1);
map.put("data",user1);
map.put("token",token);
}else {
map.put("msg","用戶名或密碼錯(cuò)誤!");
}
return map;
}
}攔截器類可以參考這篇文章,這個(gè)token驗(yàn)證就是在攔截器上改動(dòng)的。
SpringBoot攔截器實(shí)現(xiàn)登錄攔截
需要有postman驗(yàn)證



到此這篇關(guān)于SpringBoot實(shí)現(xiàn)token登錄的示例代碼的文章就介紹到這了,更多相關(guān)SpringBoot token登錄內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot框架集成token實(shí)現(xiàn)登錄校驗(yàn)功能
- SpringBoot JWT實(shí)現(xiàn)token登錄刷新功能
- SpringBoot整合Sa-Token實(shí)現(xiàn)登錄認(rèn)證的示例代碼
- springboot+jwt+微信小程序授權(quán)登錄獲取token的方法實(shí)例
- SpringBoot整合token實(shí)現(xiàn)登錄認(rèn)證的示例代碼
- SpringBoot登錄驗(yàn)證token攔截器的實(shí)現(xiàn)
- SpringBoot使用Sa-Token實(shí)現(xiàn)登錄認(rèn)證
- SpringBoot集成JWT實(shí)現(xiàn)Token登錄驗(yàn)證的示例代碼
- SpringBoot整合Mybatis-Plus、Jwt實(shí)現(xiàn)登錄token設(shè)置
相關(guān)文章
SpringBoot對(duì)Druid配置SQL監(jiān)控功能失效問題及解決方法
這篇文章主要介紹了SpringBoot對(duì)Druid配置SQL監(jiān)控功能失效問題的解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05
一文學(xué)會(huì)使用sa-token解決網(wǎng)站權(quán)限驗(yàn)證
這篇文章主要為大家介紹了使用sa-token解決網(wǎng)站權(quán)限驗(yàn)證方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
后端返回各種圖片形式在前端的轉(zhuǎn)換及展示方法對(duì)比
這篇文章主要給大家介紹了關(guān)于后端返回各種圖片形式在前端的轉(zhuǎn)換及展示方法對(duì)比的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-06-06
解決DataInputStream?read不等于-1,socket文件傳輸只能傳輸一個(gè)文件無法傳輸多個(gè)問題
這篇文章主要介紹了解決DataInputStream?read不等于-1,socket文件傳輸只能傳輸一個(gè)文件無法傳輸多個(gè)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
SpringBoot實(shí)現(xiàn)跨域的幾種常用方式總結(jié)
跨域是指一個(gè)域下的文檔或腳本試圖去請(qǐng)求另一個(gè)域下的資源,或者涉及到兩個(gè)不同域名的資源之間的交互,由于同源策略(Same Origin Policy)的限制,瀏覽器不允許跨域請(qǐng)求,本文小編給大家分享了SpringBoot實(shí)現(xiàn)跨域的幾種常用方式,需要的朋友可以參考下2023-09-09
springBoot配置國產(chǎn)達(dá)夢(mèng)數(shù)據(jù)庫的示例詳解
本文向大家介紹springBoot?配置國產(chǎn)達(dá)夢(mèng)數(shù)據(jù)庫的相關(guān)知識(shí),文章結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04
Java編程技巧:if-else優(yōu)化實(shí)踐總結(jié)歸納
這篇文章主要介紹了Java中避免過多if-else的幾種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2021-06-06
SpringBoot3讀取配置文件application.properties屬性值的幾種方式
這篇文章主要介紹了SpringBoot3讀取配置文件application.properties屬性值的幾種方式,文中通過代碼示例給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-11-11

