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

在SpringBoot中使用JWT的實現(xiàn)方法

 更新時間:2018年12月20日 17:15:22   作者:固安李慶海  
這篇文章主要介紹了在SpringBoot中使用JWT的實現(xiàn)方法,詳細的介紹了什么是JWT和JWT實戰(zhàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

JWT簡介

簡介

JSON Web token簡稱JWT, 是用于對應用程序上的用戶進行身份驗證的標記。也就是說, 使用 JWTS 的應用程序不再需要保存有關其用戶的 cookie 或其他session數(shù)據(jù)。此特性便于可伸縮性, 同時保證應用程序的安全。

在身份驗證過程中, 當用戶使用其憑據(jù)成功登錄時, 將返回 JSON Web token, 并且必須在本地保存 (通常在本地存儲中)。每當用戶要訪問受保護的路由或資源 (端點) 時, 用戶代理(user agent)必須連同請求一起發(fā)送 JWT, 通常在授權標頭中使用Bearer schema。后端服務器接收到帶有 JWT 的請求時, 首先要做的是驗證token。

JWT的格式

JWT就是一個字符串,經(jīng)過加密處理與校驗處理的字符串,形式為:A.B.C

A由JWT頭部信息header加密得到

B由JWT用到的身份驗證信息json數(shù)據(jù)加密得到

C由A和B加密得到,是校驗部分

怎樣使用token?

可以放到HTTP請求的請求頭中,通常是Authorization字段。

流程圖

jwt流程圖.png

JWT 實戰(zhàn)

加入Maven jwt 依賴

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

在application.proterties中加入配置

# 加密yan
jwt.secret=A0B1C2D3E4F5G6H7I8J9KALBMCNDOEPFQ0R1S2T3U4V5W6X7Y8Z9
# tocken 過期時間,單位秒
jwt.expire=300
# 需要認證的url,多個URL使用英文逗號,分割
jwt.authorised-urls=/apis/fis/redis/**

JwtHelper工具類

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import com.alibaba.fastjson.JSONObject;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

public class JwtHelper {
  private Long EXPIRATION_TIME;
  private String SECRET;
  private final String TOKEN_PREFIX = "Bearer";
  private final String HEADER_STRING = "Authorization";

  public JwtHelper(String secret, long expire) {
    this.EXPIRATION_TIME = expire;
    this.SECRET = secret;
    System.out.println("正在初始化Jwthelper,expire="+expire);
  }

  public JSONObject generateToken(Map<String, Object> claims) {
    Calendar c = Calendar.getInstance();
    c.setTime(new Date());
    c.add(Calendar.SECOND, EXPIRATION_TIME.intValue());
    Date d = c.getTime();
    String jwt = Jwts.builder()
        .setClaims(claims)
        .setExpiration(d)
        .signWith(SignatureAlgorithm.HS512, SECRET)
        .compact();
    JSONObject json = new JSONObject();
    json.put("token",TOKEN_PREFIX + " " + jwt);
    json.put("token-type", TOKEN_PREFIX);
    json.put("expire-time",new SimpleDateFormat("yyyy-MM-dd HH:ss:mm").format(d) );
    return json;
  }

  public Map<String, Object> validateTokenAndGetClaims(HttpServletRequest request) {
    String token = request.getHeader(HEADER_STRING);
    System.out.println("token is:"+token);
    if (token == null) {
      return null;
    } 
    Map<String, Object> body = Jwts.parser()
        .setSigningKey(SECRET)
        .parseClaimsJws(token.replace(TOKEN_PREFIX, ""))
        .getBody();
    return body;
  }
}

JWT過濾器JwtFilter

import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.http.HttpStatus;
import org.springframework.util.AntPathMatcher;

/**
 * JWT過濾器
 * 
 * @author 李慶海
 *
 */
public class JwtFilter implements Filter {
  private JwtHelper jwtHelper;
  private List<String> urls = null;
   private static final org.springframework.util.PathMatcher pathMatcher = new AntPathMatcher();
  public JwtFilter(JwtHelper jwtHelper, String[] authorisedUrls) {
    this.jwtHelper = jwtHelper;
    urls = Arrays.asList(authorisedUrls);
  }

  @Override
  public void init(FilterConfig filterConfig) throws ServletException {
    //SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, filterConfig.getServletContext());
  }

  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest httpRequest = (HttpServletRequest) request;
    HttpServletResponse httpResponse = (HttpServletResponse) response;
    httpResponse.setCharacterEncoding("UTF-8");
    httpResponse.setContentType("application/json; charset=utf-8");
    httpResponse.setHeader("Access-Control-Allow-Origin", "*");
    if ("OPTIONS".equals(httpRequest.getMethod())) {
      httpResponse.setStatus(HttpStatus.NO_CONTENT.value()); // HttpStatus.SC_NO_CONTENT = 204
      httpResponse.setHeader("Access-Control-Allow-Credentials", "true");
      httpResponse.setHeader("Access-Control-Allow-Headers", "Content-Type, x-requested-with, Token");
      httpResponse.setHeader("Access-Control-Allow-Methods", "OPTIONS,GET,POST,DELETE,PUT");
    }
    String spath = httpRequest.getServletPath();
    try {
      // 驗證受保護的接口
      for (String url : urls) {
        if (pathMatcher.match(url, spath)) {
          Object token = jwtHelper.validateTokenAndGetClaims(httpRequest);
          if (token != null) {
            chain.doFilter(request, response);
            return;
          }else{
             httpResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED, "未授權或者授權已經(jīng)過期");
             return;
          }
        }else{
          chain.doFilter(request, response);
          return;
        }
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
    chain.doFilter(request, response);
    return;
  }

  @Override
  public void destroy() {

  }
}

配置JWT

import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import cn.com.yd.fis.client.jwt.JwtFilter;
import cn.com.yd.fis.client.jwt.JwtHelper;

@Configuration
public class JwtConfig {

  @Value("${jwt.secret}")
  private String secret;

  @Value("${jwt.expire}")
  private long expire;

  @Value("${jwt.authorised-urls}")
  private String[] authorisedUrls;

  @Bean
  public JwtHelper jwtHelperBean() {
    return new JwtHelper(secret, expire);
  }

  @Bean
  public FilterRegistrationBean basicFilterRegistrationBean() {
    FilterRegistrationBean registrationBean = new FilterRegistrationBean();
    JwtFilter filter = new JwtFilter(jwtHelperBean(), authorisedUrls);
    registrationBean.setFilter(filter);
    List<String> urlPatterns = new ArrayList<String>();
    urlPatterns.add("/*");
    registrationBean.setUrlPatterns(urlPatterns);
    return registrationBean;
  }
}

在Controller中使用JWT

此處僅為說明jwt的用法,在實際應用時可以根據(jù)具體的業(yè)務需要加入不同的或者更多的參數(shù),一并作為claims進行參數(shù)傳遞。

import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import cn.com.yd.fis.client.jwt.JwtHelper;
import cn.com.yd.fis.client.util.JsonResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;

@RestController
@RequestMapping("${api-url}/auth")
public class AuthorizeController {

  @Autowired
  private JwtHelper jwtHelper;

  @PostMapping("/login")
  public Object login(String loginName,String password) throws Exception {
    Map<String, Object> claims = new HashMap<String, Object>();
    claims.put("loginName", loginName);
    if ("1".equals(password)) {
      return JsonResult.success(jwtHelper.generateToken(claims));
    } else {
      return JsonResult.fail("登錄帳號或者登錄密碼錯誤");
    }
  }
}

輔助工具類JsonResult

import com.alibaba.fastjson.JSONObject;

public class JsonResult {
  public static JSONObject success(Object obj) {
    JSONObject json = new JSONObject();
    json.put("state", true);
    json.put("msg", "成功");
    if (null != obj) {
      json.put("obj", obj);
    }
    return json;
  }

  public static JSONObject fail(Object obj) {
    JSONObject json = new JSONObject();
    json.put("state", false);
    json.put("msg", "失敗");
    if (null != obj) {
      json.put("obj", obj);
    }
    return json;
  }

  public static JSONObject toJSONObject(boolean state, String msg, Object obj) {
    JSONObject json = new JSONObject();
    json.put("state", state);
    json.put("msg", msg);
    if (null != obj) {
      json.put("obj", obj);
    }
    return json;
  }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 利用SpringMVC和Ajax實現(xiàn)文件上傳功能

    利用SpringMVC和Ajax實現(xiàn)文件上傳功能

    這篇文章主要為大家詳細介紹了利用SpringMVC和Ajax實現(xiàn)文件上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • springboot 啟動如何排除某些bean的注入

    springboot 啟動如何排除某些bean的注入

    這篇文章主要介紹了springboot 啟動如何排除某些bean的注入方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java線程池7個參數(shù)的含義

    Java線程池7個參數(shù)的含義

    這篇文章主要介紹了Java線程池7個參數(shù)的含義,所謂的線程池的?7?大參數(shù)是指,在使用?ThreadPoolExecutor?創(chuàng)建線程池時所設置的?7?個參數(shù),下文更多詳細內容,需要的小伙伴可以參考一下
    2022-05-05
  • springcloud?整合?openfeign的方法

    springcloud?整合?openfeign的方法

    openFeign 是springcloud對Feign進行了增強,使得Feign支持了springmvc的注解,并整合了Ribbon和Eureka,從而讓Feign的使用更加方便,這篇文章主要介紹了springcloud?整合?openfeign,需要的朋友可以參考下
    2022-09-09
  • SpringBoot+JavaMailSender實現(xiàn)騰訊企業(yè)郵箱配置

    SpringBoot+JavaMailSender實現(xiàn)騰訊企業(yè)郵箱配置

    這篇文章主要介紹了SpringBoot+JavaMailSender實現(xiàn)騰訊企業(yè)郵箱配置,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • java中request常用方法小結

    java中request常用方法小結

    這篇文章主要介紹了java中request常用方法小結,需要的朋友可以參考下
    2014-10-10
  • Java設計模式初識之備忘錄模式詳解

    Java設計模式初識之備忘錄模式詳解

    備忘錄設計模式(Memento Design Pattern)也叫作快照(Snapshot)模式,主要用于實現(xiàn)防丟失、撤銷、恢復等功能。本文將通過示例為大家介紹一些備忘錄模式的定義與使用,需要的可以參考一下
    2022-11-11
  • 基于Springboot商品進銷存管理系統(tǒng)的設計與實現(xiàn)

    基于Springboot商品進銷存管理系統(tǒng)的設計與實現(xiàn)

    本項目基于springboot實現(xiàn)一個進銷存管理系統(tǒng),主要用戶開設網(wǎng)店的相關商品的進貨、銷售、庫存的管理,功能比較完整,需要的可以參考一下
    2022-08-08
  • Java利用POI讀寫Excel文件工具類

    Java利用POI讀寫Excel文件工具類

    這篇文章主要為大家詳細介紹了Java利用POI讀寫Excel文件的工具類,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • 初探Java內部類的使用

    初探Java內部類的使用

    Java內部類一般可以分為以下三種:成員內部類、靜態(tài)內部類和匿名內部類。這篇文章主要帶大家初探一下Java內部類的使用,感興趣的可以了解一下
    2022-09-09

最新評論