最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springBoot整合jwt實現(xiàn)token令牌認證的示例代碼

 更新時間:2024年08月12日 10:19:15   作者:小白寫代碼hh  
實施Token驗證的方法挺多的,還有一些標準方法,比如JWT,本文主要介紹了springBoot整合jwt實現(xiàn)token令牌認證的示例代碼,具有一定的參考價值,感興趣的可以了解一下

1. 什么token

作為計算機術語時,是“令牌”的意思。Token是服務端生成的一串字符串,以作客戶端進行請求的一個令牌,當?shù)谝淮蔚卿浐螅掌魃梢粋€Token便將此Token返回給客戶端,以后客戶端只需帶上這個Token前來請求數(shù)據(jù)即可,無需再次帶上用戶名和密碼。

使用token機制的身份驗證方法,在服務器端不需要存儲用戶的登錄記錄。

大概的流程:

1   客戶端使用用戶名和密碼請求登錄。

2   服務端收到請求,驗證用戶名和密碼。

3   驗證成功后,服務端會生成一個token,然后把這個token發(fā)送給客戶端。

4   客戶端收到token后把它存儲起來,可以放在cookie或者Local Storage(本地存儲)里。

5   客戶端每次向服務端發(fā)送請求的時候都需要帶上服務端發(fā)給的token。

6    服務端收到請求,然后去驗證客戶端請求里面帶著token,如果驗證成功,就向客戶端返回請求的數(shù)據(jù)

2. jwt是什么

實施 Token 驗證的方法挺多的,還有一些標準方法,比如 JWT,讀作:jot ,表示:JSON Web Tokens 。JWT 標準的 Token 有三個部分:

1. header(頭部),頭部信息主要包括(參數(shù)的類型--JWT,簽名的算法--HS256)
2. poyload(負荷),負荷基本就是自己想要存放的信息(因為信息會暴露,不應該在載荷里面加入任      何敏感的數(shù)據(jù))
3. sign(簽名),簽名的作用就是為了防止惡意篡改數(shù)據(jù),

例如:中間用點分隔開,并且都會使用 Base64 編碼,所以真正的 Token 看起來像這樣:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.//頭部
eyJpZCI6IjIiLCJleHAiOjE3MDI0NDE3MDcsInVzZXJuYW1lIjoiYWRtaW4ifQ.//負載
k8F9h5GQB1-rTVi-8hs9jOWnfpJALSk2Y08xeZb7YlE//簽名

3. jwt的依賴坐標

springboot引入jwt:

<dependency>
     <groupId>com.auth0</groupId>
     <artifactId>java-jwt</artifactId>
     <version>3.4.1</version>
</dependency>

4. springboot整合token

在這里只是給大家一個演示,
首先要知道如何生成一個token 那就是上面講到的請求頭+負載+簽名

package com.hyh.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.hyh.domain.User;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.Calendar;
import java.util.Date;

public class JwtUtil {
    // 生成token
    // Algorithm.HMAC256():使用HS256生成token,密鑰則是用戶的密碼
    private static final String SING = "MusicProject";

    public String getToken(User user) {
        //System.out.println(String.valueOf(user.getId()));
        // 設置token過期時間
        Calendar instance= Calendar.getInstance();
        instance.add(Calendar.DATE,7);
        String token="";
        token= JWT.create()
                .withClaim("id",String.valueOf(user.getId())) //設置載荷
                .withClaim("username",user.getUsername())
                .withExpiresAt(instance.getTime()) //設置令牌過期的時間
                .sign(Algorithm.HMAC256(SING));

        return token;
    }
    /**,
     * 驗證token  合法性
     */
    public static DecodedJWT verify(String token) {
        return JWT.require(Algorithm.HMAC256(SING)).build().verify(token);
    }
}

我把生成token的方法和驗證方法弄成了一個工具類 
在這里我定義的簽名是靜態(tài)變量 可以根據(jù)自己需求來定義 這里的id是從數(shù)據(jù)庫里面拿到的 這里的驗證token符合的話就放行,否則就拋異常。

接下來就需要配置一個攔截器 對于攔截請求資源

public class AuthenticationInterceptor implements HandlerInterceptor {
    @Autowired
    UserService userService;

    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object object) throws Exception {
        String token = httpServletRequest.getHeader("token");// 從 http 請求頭中取出 token
        // 如果不是映射到方法直接通過
        if (!(object instanceof HandlerMethod)) {
            return true;
        }
        HandlerMethod handlerMethod = (HandlerMethod) object;
        Method method = handlerMethod.getMethod();

        //檢查有沒有需要用戶權限的注解
        if (method.isAnnotationPresent(TokenRequired.class)) {
            TokenRequired userLoginToken = method.getAnnotation(TokenRequired.class);
            if (userLoginToken.required()) {

                Map<String,Object> map = new HashMap<>();
                // 獲取請求頭中令牌
                System.out.println(token);
                try {
                    // 驗證令牌
                    JwtUtil.verify(token);
                    return true;  // 放行請求
                } catch (SignatureVerificationException e) {
                    e.printStackTrace();
                    map.put("msg","無效簽名!");
                }catch (TokenExpiredException e){
                    e.printStackTrace();
                    map.put("msg","token過期");
                }catch (AlgorithmMismatchException e){
                    e.printStackTrace();
                    map.put("msg","算法不一致");
                }catch (Exception e){
                    e.printStackTrace();
                    map.put("msg","token無效!");
                }
                map.put("state",false);  //設置狀態(tài)
                // 將map以json的形式響應到前臺  map --> json  (jackson)
                String json = new ObjectMapper().writeValueAsString(map);
                httpServletResponse.setContentType("application/json;charset=UTF-8");
                httpServletResponse.getWriter().println(json);
                return false;

            }
        }
        return true;
    }

在這里面 useservice是我自己的實現(xiàn)類,里面可以查到用戶id

把攔截器注冊:

@Configuration  // 配置類
public class InterceptorConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new AuthenticationInterceptor())
                .addPathPatterns("/api/**")  // 攔截所有請求
                .excludePathPatterns("/api/login","/api/register");  // 放行登錄 注冊
    }
}

這里因為攔截了所有請求 但是我們可以自己定義一個注解來判斷當我們請求資源的時候需不需呀token驗證。

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface TokenRequired {
    boolean required() default true;
}

當我們在某個資源上加上了這個注解 說明這個資源需要token驗證

這是我寫的一個登錄接口 集成了驗證碼功能

/*
     * @description: 用戶的登錄
     * @param: User user
     * @return:result
     * @author
     * @date: 2023/9/28 10:03
     */
    @PostMapping("/login")
    public Result login(@RequestBody User user,HttpSession httpSession,HttpServletResponse response){
        String checkCode = (String) httpSession.getAttribute("checkCode");
        System.out.println(checkCode);
        if (user.getCheCode() == null || !user.getCheCode().equalsIgnoreCase(checkCode)) {
            return new Result(Code.Err, null, "驗證碼錯誤");
        }

        boolean flag = userService.selectUsernamePwd(user);
        boolean is_exist = userService.selectByName(user.getUsername());
        if (flag) {
            JwtUtil jwtUtil = new JwtUtil();
            User user1 = userService.selectByNameToken(user.getUsername());
            String token = jwtUtil.getToken(user1);
            user.setToken(token);
            Cookie cookie = new Cookie("username",user.getUsername());
            cookie.setMaxAge(60*60*24*7);
            cookie.setPath("/");
            response.addCookie(cookie);
            httpSession.setAttribute("username", user.getUsername());
            return new Result(Code.Ok,user,"登錄成功");
        }else if(!is_exist){
            return new Result(Code.Err,user,"登錄失敗 用戶不存在");
        }else{
            return new Result(Code.Err,user,"登錄失敗");
        }
    }

這個資源是需要token驗證訪問的資源 加了注解 @TokenRequired

   @GetMapping
    @TokenRequired
    public Result selectAllSingers(HttpServletRequest request) {
        List<Singer> singers = songService.selectSingerAll();
        Integer code = singers != null ? Code.Ok : Code.Err;
        String msg = singers != null ? "" : "數(shù)據(jù)查詢失敗 請重試";
        return new Result(code, singers, msg);
    }

當我們沒有token的時候正常訪問一下:

可以看到是無法訪問的 

我們可以先登錄獲取token 在進行訪問試一下

因為我把token封裝在user里面 所以返回了token 現(xiàn)在把token放到剛剛無法訪問的url的請求頭里,再次訪問一下:

現(xiàn)在訪問有數(shù)據(jù)了 這些數(shù)據(jù)都是我自己封裝好的,你自己可以隨便寫寫字符串返回來進行測試。

到此這篇關于springBoot整合jwt實現(xiàn)token令牌認證的示例代碼的文章就介紹到這了,更多相關springBoot token令牌認證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 淺談Java中的LinkedHashSet哈希鏈表

    淺談Java中的LinkedHashSet哈希鏈表

    這篇文章主要介紹了淺談Java中的LinkedHashSet哈希鏈表,LinkedHashSet 是 Java 中的一個集合類,它是 HashSet 的子類,并實現(xiàn)了 Set 接口,與 HashSet 不同的是,LinkedHashSet 保留了元素插入的順序,并且具有 HashSet 的快速查找特性,需要的朋友可以參考下
    2023-09-09
  • maven繼承父工程統(tǒng)一版本號的實現(xiàn)

    maven繼承父工程統(tǒng)一版本號的實現(xiàn)

    這篇文章主要介紹了maven繼承父工程統(tǒng)一版本號的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • win10 下 idea2020安裝 JetBrains-agent.jar 包后閃退的問題及解決辦法

    win10 下 idea2020安裝 JetBrains-agent.jar 包后閃退的問題及解決辦法

    這篇文章主要介紹了win10 下 idea2020安裝 JetBrains-agent.jar 包后閃退的解決辦法,本文給大家?guī)碓蚍治黾敖鉀Q方法,需要的朋友可以參考下
    2020-08-08
  • Maven如何打入依賴中指定的部分jar包

    Maven如何打入依賴中指定的部分jar包

    當項目運行的環(huán)境里已經(jīng)有一個jar包是pom文件依賴其他項目的jar包,所以最后得到的項目jar包中還需要打入其他項目的最新代碼,接下來通過本文給大家介紹Maven打入依賴jar包的操作工程,需要的朋友參考下吧
    2021-06-06
  • Java中管理資源的引用隊列相關原理解析

    Java中管理資源的引用隊列相關原理解析

    這篇文章主要介紹了Java中管理資源的引用隊列相關原理解析,涉及到Java的垃圾回收機制方面的知識,需要的朋友可以參考下
    2015-12-12
  • Spring spel表達式使用方法示例

    Spring spel表達式使用方法示例

    這篇文章主要介紹了Spring spel表達式使用方法示例,通過一些實例向大家展示了spel表達式的用法,需要的朋友可以了解下。
    2017-09-09
  • SpringMVC ajax請求的處理方法介紹

    SpringMVC ajax請求的處理方法介紹

    Ajax即異步的 JavaScript和XML,是一種無需重新加載整個網(wǎng)頁的情況下,能夠更新部分模塊的網(wǎng)頁技術,下面這篇文章主要給大家介紹了關于SpringMVC Ajax請求的處理,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-11-11
  • Java性能優(yōu)化之關于大對象復用的目標和注意點

    Java性能優(yōu)化之關于大對象復用的目標和注意點

    這篇文章主要介紹了Java性能優(yōu)化之關于大對象復用的目標和注意點,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 使用spring-task定時任務動態(tài)配置修改執(zhí)行時間

    使用spring-task定時任務動態(tài)配置修改執(zhí)行時間

    這篇文章主要介紹了使用spring-task定時任務動態(tài)配置修改執(zhí)行時間,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • SpringBoot項目實現(xiàn)日志打印SQL的常用方法(包括SQL語句和參數(shù))

    SpringBoot項目實現(xiàn)日志打印SQL的常用方法(包括SQL語句和參數(shù))

    有時候遇到問題需要根據(jù)我們編寫的SQL進行分析,但如果不進行一些開發(fā)或者配置的話,這些SQL是不會打印到控制臺的,它們默認是隱藏的。下面給大家介紹幾種常用的方法,感興趣的朋友跟隨小編一起看看吧
    2024-04-04

最新評論

宁德市| 隆化县| 东阳市| 疏勒县| 鲜城| 且末县| 海伦市| 韩城市| 阳城县| 华蓥市| 九寨沟县| 乌审旗| 商都县| 桦川县| 泸定县| 蓬溪县| 丰县| 肥西县| 汶上县| 洛扎县| 大连市| 读书| 丰原市| 墨脱县| 永福县| 黄平县| 资讯 | 成武县| 都江堰市| 苗栗市| 水富县| 吴江市| 棋牌| 海南省| 屏东县| 浏阳市| 黄冈市| 临清市| 浙江省| 小金县| 沙河市|