91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

Java怎么實現登錄token令牌

發布時間:2022-05-23 09:39:45 來源:億速云 閱讀:172 作者:zzz 欄目:開發技術

本文小編為大家詳細介紹“Java怎么實現登錄token令牌”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Java怎么實現登錄token令牌”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

一、流程圖

Java怎么實現登錄token令牌

二、Token

1、token是一種客戶端認證機制,是一個經過加密的字符串,安全性強,支持跨域

2、用戶第一次登錄,服務器通過數據庫校驗其UserId和Password合法,則再根據隨機數字+userid+當前時間戳再經過DES加密生成一個token串

  • 當然具體生成token的方式是開發自己定義的   

3、token的生成一般是采用uuid保證唯一性,當用戶登錄時為其生成唯一的token,存儲一般保存在數據庫中

  • token過期時間采用把token二次保存在cookie或session里面,根據cookie和session的過期時間去維護token的過期時間

4、Token是在服務端產生的。如果前端使用用戶名/密碼向服務端請求認證,服務端認證成功,那么在服務端會返回Token給前端。前端可以在每次請求的時候帶上Token證明自己的合法地位

5、Token,就是令牌,最大的特點就是隨機性,不可預測。一般黑客或軟件無法猜測出來

三、分析

建立一個token令牌,在用戶登錄時候給用戶一個獨特得令牌值,登錄時候嘚賦值這個令牌

在SpringBoot項目中建立一個Util文件夾

文件夾下建立TokenUtil.java文件

public class TokenUtil {  
    private static Map<String, User> tokenMap = new HashMap<>();  
    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);
    }
 
    public static User gentUser(String token){
        return tokenMap.get(token);
    }
 
    public static void main(String[] args) {
        for (int i = 0; i < 20; i++){
            System.out.println(UUID.randomUUID().toString());
        }
    } 
}

用戶登錄得UserController.java

@Api( tags = {"用戶模塊接口"})
@RestController
@RequestMapping("user")
public class UserController {
    @Autowired
    private UserService userService;
 
    @Autowired
    private HttpSession session;
    @ApiOperation("登錄接口")
    @RequestMapping(value = "login",method ={RequestMethod.POST,RequestMethod.GET})
    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 userDb = userService.getOne(queryWrapper);
        if(userDb != null){
            String token= TokenUtil.generateToken(userDb);
            map.put("code",1);
            map.put("data",userDb);
            map.put("token",token);
            session.setAttribute("username",userDb.getUsername());
        }else{
            map.put("msg","用戶名或密碼錯誤!");
        }
        return map;
    }
    @ApiImplicitParams(
            {
            @ApiImplicitParam(name = "id",
                    value = "用戶id", required = true,
                    dataType = "Long"),
            @ApiImplicitParam(name = "name",
                    value = "測試名字",
                    dataType = "string")
            }
    )
    @ApiOperation("根據id查詢用戶信息")
    @RequestMapping(value="getById",method ={RequestMethod.POST,RequestMethod.GET})
    public  User getById(Long id ,String name){
        System.out.println(name);
        return userService.getById(id);
    }
 
}

在攔截器上操作 interceptor下面LoginInterceptor.java

public class LoginInterceptor implements HandlerInterceptor {
 
    @Autowired
    private HttpSession httpSession;
 
    //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的方法
         *  需要配置靜態資源不攔截時,添加這塊邏輯  => 前后端分離項目
         *
         */
        // 是我們的conrtoller中的方法
        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....");
    }
}

四、運行結果

http://localhost:8080/

Java怎么實現登錄token令牌

 http://localhost:8080/user/login?username=admin&password=123456

Java怎么實現登錄token令牌

 記住這個令牌    

60227b0e-bdbb-47d9-9df4-f56163cb529d

在postman中

Java怎么實現登錄token令牌

寫入令牌,輸出成功

Java怎么實現登錄token令牌

讀到這里,這篇“Java怎么實現登錄token令牌”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

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

AI

建湖县| 望江县| 济南市| 安陆市| 治县。| 星座| 兴仁县| 海阳市| 兴隆县| 隆昌县| 彩票| 万载县| 平乡县| 通许县| 陕西省| 柞水县| 宁河县| 辽阳县| 永嘉县| 霍山县| 寿宁县| 扬中市| 徐州市| 怀来县| 定州市| 西畴县| 南漳县| 霞浦县| 台中市| 酉阳| 台山市| 都昌县| 库车县| 绥阳县| 栖霞市| 门源| 威远县| 罗源县| 西乡县| 盖州市| 辉县市|