亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java如何實(shí)現(xiàn)登錄token令牌

 更新時(shí)間:2022年05月21日 14:36:00   作者:叫我老伯  
這篇文章主要介紹了Java如何實(shí)現(xiàn)登錄token令牌,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

一、流程圖

二、Token

1、token是一種客戶端認(rèn)證機(jī)制,是一個(gè)經(jīng)過加密的字符串,安全性強(qiáng),支持跨域

2、用戶第一次登錄,服務(wù)器通過數(shù)據(jù)庫(kù)校驗(yàn)其UserId和Password合法,則再根據(jù)隨機(jī)數(shù)字+userid+當(dāng)前時(shí)間戳再經(jīng)過DES加密生成一個(gè)token串

  • 當(dāng)然具體生成token的方式是開發(fā)自己定義的   

3、token的生成一般是采用uuid保證唯一性,當(dāng)用戶登錄時(shí)為其生成唯一的token,存儲(chǔ)一般保存在數(shù)據(jù)庫(kù)中

  • token過期時(shí)間采用把token二次保存在cookie或session里面,根據(jù)cookie和session的過期時(shí)間去維護(hù)token的過期時(shí)間

4、Token是在服務(wù)端產(chǎn)生的。如果前端使用用戶名/密碼向服務(wù)端請(qǐng)求認(rèn)證,服務(wù)端認(rèn)證成功,那么在服務(wù)端會(huì)返回Token給前端。前端可以在每次請(qǐng)求的時(shí)候帶上Token證明自己的合法地位

5、Token,就是令牌,最大的特點(diǎn)就是隨機(jī)性,不可預(yù)測(cè)。一般黑客或軟件無法猜測(cè)出來

三、分析

建立一個(gè)token令牌,在用戶登錄時(shí)候給用戶一個(gè)獨(dú)特得令牌值,登錄時(shí)候嘚賦值這個(gè)令牌

在SpringBoot項(xiàng)目中建立一個(gè)Util文件夾

文件夾下建立TokenUtil.java文件

public class TokenUtil {  
    private static Map<String, User> tokenMap = new HashMap<>();  
    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);
    }
 
    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","用戶名或密碼錯(cuò)誤!");
        }
        return map;
    }
    @ApiImplicitParams(
            {
            @ApiImplicitParam(name = "id",
                    value = "用戶id", required = true,
                    dataType = "Long"),
            @ApiImplicitParam(name = "name",
                    value = "測(cè)試名字",
                    dataType = "string")
            }
    )
    @ApiOperation("根據(jù)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邏輯執(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)目
         *
         */
        // 是我們的conrtoller中的方法
        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....");
    }
}

四、運(yùn)行結(jié)果

http://localhost:8080/

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

 記住這個(gè)令牌    

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

在postman中

寫入令牌,輸出成功

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • springboot結(jié)合mybatis-plus快速生成項(xiàng)目模板的方法

    springboot結(jié)合mybatis-plus快速生成項(xiàng)目模板的方法

    Mybatis-Plus是一個(gè) Mybatis 的增強(qiáng)工具,在 Mybatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡(jiǎn)化開發(fā)、提高效率而生,接下來通過本文給大家分享springboot結(jié)合mybatis-plus快速生成項(xiàng)目模板的方法,感興趣的朋友一起看看吧
    2021-06-06
  • 你都理解創(chuàng)建線程池的參數(shù)嗎?

    你都理解創(chuàng)建線程池的參數(shù)嗎?

    這篇文章主要介紹了創(chuàng)建線程池參數(shù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 詳解關(guān)于springboot-actuator監(jiān)控的401無權(quán)限訪問

    詳解關(guān)于springboot-actuator監(jiān)控的401無權(quán)限訪問

    本篇文章主要介紹了詳解關(guān)于springboot-actuator監(jiān)控的401無權(quán)限訪問,非常具有實(shí)用價(jià)值,有興趣的可以了解一下
    2017-09-09
  • Java對(duì)List進(jìn)行排序的兩種實(shí)現(xiàn)方法

    Java對(duì)List進(jìn)行排序的兩種實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于Java對(duì)List進(jìn)行排序的兩種實(shí)現(xiàn)方法,第一種是實(shí)體類自己實(shí)現(xiàn)比較,第二種是借助比較器進(jìn)行排序,下面開一起看看詳細(xì)的介紹吧,有需要的朋友們可以參考借鑒。
    2016-12-12
  • Java算法實(shí)戰(zhàn)之排一億個(gè)隨機(jī)數(shù)

    Java算法實(shí)戰(zhàn)之排一億個(gè)隨機(jī)數(shù)

    我們?cè)谏钪薪?jīng)常遇見一些這樣的需求,隨機(jī)點(diǎn)名、公司年會(huì)抽獎(jiǎng)、微信拼手氣紅包等,還有一些游戲比如打地鼠小游戲、俄羅斯方塊等,這些場(chǎng)景中都會(huì)用到一種算法:隨機(jī),這篇文章主要給大家介紹了關(guān)于Java算法實(shí)戰(zhàn)之排一億個(gè)隨機(jī)數(shù)的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • Spring Boot整合mybatis使用注解實(shí)現(xiàn)動(dòng)態(tài)Sql、參數(shù)傳遞等常用操作(實(shí)現(xiàn)方法)

    Spring Boot整合mybatis使用注解實(shí)現(xiàn)動(dòng)態(tài)Sql、參數(shù)傳遞等常用操作(實(shí)現(xiàn)方法)

    這篇文章主要介紹了Spring Boot整合mybatis使用注解實(shí)現(xiàn)動(dòng)態(tài)Sql、參數(shù)傳遞等常用操作(實(shí)現(xiàn)方法),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 基于IDEA建立module操作步驟解析

    基于IDEA建立module操作步驟解析

    這篇文章主要介紹了基于IDEA建立module操作步驟解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 簡(jiǎn)單實(shí)現(xiàn)Java通訊錄系統(tǒng)

    簡(jiǎn)單實(shí)現(xiàn)Java通訊錄系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了如何簡(jiǎn)單實(shí)現(xiàn)Java通訊錄系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Redisson 分布式延時(shí)隊(duì)列 RedissonDelayedQueue 運(yùn)行流程

    Redisson 分布式延時(shí)隊(duì)列 RedissonDelayedQueue 運(yùn)行流程

    這篇文章主要介紹了Redisson分布式延時(shí)隊(duì)列 RedissonDelayedQueue運(yùn)行流程,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • Spring @Configuration和@Component的區(qū)別

    Spring @Configuration和@Component的區(qū)別

    今天小編就為大家分享一篇關(guān)于Spring @Configuration和@Component的區(qū)別,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12

最新評(píng)論