中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot如何實現token登錄

發布時間:2022-03-25 13:36:34 來源:億速云 閱讀:336 作者:小新 欄目:開發技術

這篇文章主要為大家展示了“SpringBoot如何實現token登錄”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“SpringBoot如何實現token登錄”這篇文章吧。

為什么引入token機制?

在進行登錄驗證時,我們需要session或cookie會話進行驗證,客戶端包括瀏覽器、app、微信小程序、公眾號,只有瀏覽器有session和cookie機制,當我們脫離瀏覽器用app等向服務端發請求就沒有session和cookie機制,這時我們就需要使用token令牌進行登錄驗證。

SpringBoot如何實現token登錄

代碼實現

先建個util包,并創建TokenUtil類用于生成token

SpringBoot如何實現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 {
    /**
     * 創建map用于存儲所有的令牌
     *
     * token  -  User
     */
    private static Map<String, User> tokenMap=new HashMap<>();
 
    /**
     * 生成token,存儲token-user對應關系
     * 返回token令牌
     * @param user
     * @return
     */
    public static String generateToken(User user){
        //生成唯一不重復的字符串
        String token = UUID.randomUUID().toString();
        tokenMap.put(token,user);
        return token;
    }
 
    /**
     * 驗證token是否合法
     * @param token
     * @return
     */
    public static boolean verify(String token){
        return tokenMap.containsKey(token);
    }
 
    /**
     * 根據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邏輯執行之前
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle....");
        String uri = request.getRequestURI();
        System.out.println("當前路徑"+uri);
 
        /**
         * HandlerMethod=>Controller中標注@RequestMapping的方法
         *  需要配置靜態資源不攔截時,添加這塊邏輯  => 前后端分離項目
         */
        if (!(handler instanceof HandlerMethod)) {
            return true;
        }
 
        String token=request.getHeader("qcby-token");
 
        if (!TokenUtil.verify(token)) {
            // 未登錄跳轉到登錄界面
            throw  new RuntimeException("no login!");
        } else {
            return true;
        }
    }
 
    //Controller邏輯執行完畢但是視圖解析器還未進行解析之前
    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle....");
    }
 
    //Controller邏輯和視圖解析器執行完畢
    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        System.out.println("afterCompletion....");
    }
}

實現類

@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","用戶名或密碼錯誤!");
        }
        return map;
    }
}

攔截器類可以參考這篇文章,這個token驗證就是在攔截器上改動的。

SpringBoot攔截器實現登錄攔截 

需要有postman驗證

SpringBoot如何實現token登錄

SpringBoot如何實現token登錄

SpringBoot如何實現token登錄

以上是“SpringBoot如何實現token登錄”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

犍为县| 伊春市| 汽车| 嵊州市| 观塘区| 微山县| 长宁区| 黔南| 南通市| 屏东县| 文山县| 扶绥县| 合肥市| 区。| 渑池县| 桓台县| 武川县| 鹿邑县| 新龙县| 临江市| 卓尼县| 通化市| 鸡东县| 广丰县| 大埔县| 周口市| 长宁区| 定州市| 汽车| 米泉市| 枣阳市| 万安县| 丹阳市| 启东市| 马公市| 琼海市| 瑞安市| 改则县| 余姚市| 嘉黎县| 长子县|