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

SpringBoot使用Jwt處理跨域認(rèn)證問題的教程詳解

 更新時間:2020年06月17日 09:36:27   作者:陳大帥哥Ray  
這篇文章主要介紹了SpringBoot使用Jwt處理跨域認(rèn)證問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

  在前后端開發(fā)時為什么需要用戶認(rèn)證呢?原因是由于HTTP協(xié)定是不存儲狀態(tài)的,這意味著當(dāng)我們透過賬號密碼驗證一個使用者時,當(dāng)下一個request請求時他就把剛剛的資料忘記了。于是我們的程序就不知道誰是誰了。 所以為了保證系統(tǒng)的安全,就需要驗證用戶是否處于登陸狀態(tài)。

一、JWT的組成

JWT由Header、Payload、Signature三部分組成,分別用.分隔。

下面就是一個jwt真實的樣子,說白了就是一個字符串,但是里面卻存儲了很重要的信息。

eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJyYXljaGVuIiwiaWQiOjIsIm5hbWUiOiJyYXkiLCJwYXNzd29yZCI6IjMyMSIsImlhdCI6MTU5MDI5OTU0OCwiZXhwIjoxNTkwMzg1OTQ4fQ.ORJNldDIfffg7D3_xu0_dBWb16y4fPLtw_r6qgScFpQ

Header:

第一部分是請求頭由兩部分組成,algtyp,第一個指定的是算法,第二指定的是類型。

Payload

第二部分是主體信息組成,用來存儲JWT基本信息,或者是我們的信息。

Signature

第三部分主要是給第一部分跟第二部進(jìn)行簽名使用的,用來驗證是否是我們服務(wù)器發(fā)起的Token,secret是我們的密鑰。

二、在springboot項目中使用jwt做驗證

具體流程:

  •  把用戶的用戶名和密碼發(fā)到后端
  •  后端進(jìn)行校驗,校驗成功會生成token, 把token發(fā)送給客戶端
  •  客戶端自己保存token, 再次請求就要在Http協(xié)議的請求頭中帶著token去訪問服務(wù)端,和在服務(wù)端保存的token信息進(jìn)行比對校驗。

1.先引入jar包

<dependency>
  <groupId>io.jsonwebtoken</groupId>
  <artifactId>jjwt</artifactId>
  <version>0.9.1</version>
</dependency>

2.使用工具類生成token和驗證token(生成token方法中存入了用戶的信息)

public class JwtUtils {

  //發(fā)行者
  public static final String SUBJECT="raychen";
  //過期時間 一天
  public static final long EXPIRE=1000*60*60*24;
  //密鑰
  public static final String APPSECRET="raychen11";

  /**
   * 生成jwt
   * @param user
   * @return
   */
  public static String geneJsonWebToken(User user){
    if(user==null || user.getId()==null || user.getName()==null || user.getPassword()==null){
      return null;
    }
    String token=Jwts.builder().setSubject(SUBJECT)
        .claim("id",user.getId())
        .claim("name",user.getName())
        .claim("password",user.getPassword())
        .setIssuedAt(new Date())
        .setExpiration(new Date(System.currentTimeMillis()+EXPIRE))
        .signWith(SignatureAlgorithm.HS256,APPSECRET).compact();

    return token;
  }

  /**
   * 校驗token
   * @param token
   * @return
   */
  public static Claims checkJWT(String token){
    //仿造的token或者已過期就會報錯
    try {
      final Claims claims=Jwts.parser().setSigningKey(APPSECRET).parseClaimsJws(token).getBody();
      return claims;
    }catch (Exception e){
      System.out.println("catch...");
    }
    return null;
  }
}

3.自定義注解(進(jìn)行token驗證)

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

4.編寫config,將后臺所有請求先去攔截器(攔截器返回了true,用戶才可以請求到接口)

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {


  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(authenticationInterceptor())
        .addPathPatterns("/**");  // 攔截所有請求,通過判斷是否有 @LoginRequired 注解 決定是否需要登錄
  }

  @Bean
  public AuthenticationInterceptor authenticationInterceptor() {
    return new AuthenticationInterceptor();
  }
}

5.定義攔截器(對需要token驗證的請求,進(jìn)行驗證,驗證成功返回true,失敗返回false無法請求到接口)

public class AuthenticationInterceptor implements HandlerInterceptor {

  public static final Gson gson=new Gson();
  /**
   * 進(jìn)入controller之前進(jìn)行攔截
   * @param request
   * @param response
   * @param object
   * @return
   */
  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws Exception {
    // 如果不是映射到方法直接通過
    if (!(object instanceof HandlerMethod)) {
      return true;
    }

    HandlerMethod handlerMethod = (HandlerMethod) object;
    Method method = handlerMethod.getMethod();
    //檢查是否有LoginToken注釋,有則跳過認(rèn)證
    if (method.isAnnotationPresent(LoginToken.class)) {
      LoginToken loginToken = method.getAnnotation(LoginToken.class);
      if (loginToken.required()) {
        return true;
      }
    }

    //前面是不需要token驗證的 從 http 請求頭中取出 token
    String token = request.getHeader("token");
    //檢查有沒有需要用戶權(quán)限的注解
    if (method.isAnnotationPresent(CheckToken.class)) {
      CheckToken checkToken = method.getAnnotation(CheckToken.class);
      if (checkToken.required()) {
        if(token!=null){
          Claims claims= JwtUtils.checkJWT(token);
          if(null==claims){
            sendJsonMessage(response, JsonData.buildError("token有誤"));
            return false;
          }
          Integer userId= (Integer) claims.get("id");
          String name = (String) claims.get("name");

          request.setAttribute("userId",userId);
          request.setAttribute("name",name);
          return true;
        }
        //token為null的話 返回一段json給前端
        sendJsonMessage(response, JsonData.buildError("請登錄"));
        return false;
      }
    }
    //沒有使用注解的方法 直接返回true
    return true;
  }

    /**
     * 響應(yīng)數(shù)據(jù)給前端
     * @param response
     * @param obj
     * @throws IOException
     */
    public static void sendJsonMessage (HttpServletResponse response, Object obj) throws IOException {
      response.setContentType("application/json; charset=utf-8");
      PrintWriter writer = response.getWriter();
      writer.print(gson.toJson(obj));
      writer.close();
      response.flushBuffer();
    }
}

用戶登錄成功后,使用工具類生成token。token在服務(wù)端不做存儲,直接將token返回給客戶端,客戶端下次請求服務(wù)端時,使用工具類來驗證header里的token是否合法。

總結(jié)

到此這篇關(guān)于SpringBoot使用Jwt處理跨域認(rèn)證問題的文章就介紹到這了,更多相關(guān)SpringBoot處理跨域認(rèn)證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解JAVA 反射機制

    詳解JAVA 反射機制

    這篇文章主要介紹了JAVA 反射機制的相關(guān)知識,文中講解的非常細(xì)致,代碼幫助大家更好的理解學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • Java中for循環(huán)內(nèi)修改集合的常見陷阱與最佳實踐

    Java中for循環(huán)內(nèi)修改集合的常見陷阱與最佳實踐

    在Java編程中,for循環(huán)是遍歷集合(如List、Set)的常用方式,本文主要介紹了Java在for循環(huán)內(nèi)修改集合的常見陷阱與最佳實踐,希望對大家有所幫助
    2025-06-06
  • Spring應(yīng)用中使用acutator/refresh刷新屬性不生效的問題分析及解決

    Spring應(yīng)用中使用acutator/refresh刷新屬性不生效的問題分析及解決

    在Spring應(yīng)用收到/actuator/refresh的POST請求后,標(biāo)注了@RefreshScope以及@ConfiguratioinProperties的bean會被Spring容器重新加載,但是,在實際應(yīng)用中,并沒有按照預(yù)期被Spring容器加載,本文將討論導(dǎo)致這種未按預(yù)期刷新的一種原因,感興趣的朋友可以參考下
    2024-01-01
  • SpringMVC中的DispatcherServlet初始化流程詳解

    SpringMVC中的DispatcherServlet初始化流程詳解

    這篇文章主要介紹了SpringMVC中的DispatcherServlet初始化流程詳解,DispatcherServlet這個前端控制器是一個Servlet,所以生命周期和普通的Servlet是差不多的,在一個Servlet初始化的時候都會調(diào)用該Servlet的init()方法,需要的朋友可以參考下
    2023-12-12
  • Java如何實現(xiàn)登錄token令牌

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

    這篇文章主要介紹了Java如何實現(xiàn)登錄token令牌,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • SpringSecurity集成圖片驗證碼的詳細(xì)過程

    SpringSecurity集成圖片驗證碼的詳細(xì)過程

    SpringSecurity是通過過濾器鏈來完成的,接下來的驗證碼,可以嘗試創(chuàng)建一個過濾器放到Security的過濾器鏈中,在自定義的過濾器中比較驗證碼,本文通過實例代碼介紹SpringSecurity集成圖片驗證碼的詳細(xì)過程,感興趣的朋友一起看看吧
    2023-12-12
  • mybatis-plus與mybatis共存的實現(xiàn)

    mybatis-plus與mybatis共存的實現(xiàn)

    本文主要介紹了mybatis-plus與mybatis共存的實現(xiàn),文中根據(jù)實例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Java數(shù)據(jù)結(jié)構(gòu)之有向圖設(shè)計與實現(xiàn)詳解

    Java數(shù)據(jù)結(jié)構(gòu)之有向圖設(shè)計與實現(xiàn)詳解

    有向圖是具有方向性的圖,由一組頂點和一組有方向的邊組成,每條方向的邊都連著一對有序的頂點。本文為大家介紹的是有向圖的設(shè)計與實現(xiàn),需要的可以參考一下
    2022-11-11
  • Spring?Boot用戶注冊驗證的實現(xiàn)全過程記錄

    Spring?Boot用戶注冊驗證的實現(xiàn)全過程記錄

    最近在設(shè)計自己的博客系統(tǒng),涉及到用戶注冊與登錄驗證,所以下面這篇文章主要給大家介紹了關(guān)于Spring?Boot用戶注冊驗證的實現(xiàn)全過程,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-01-01
  • java實現(xiàn)文件的上傳功能

    java實現(xiàn)文件的上傳功能

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)文件的上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評論