中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

在SpringBoot中使用JWT的實現方法

發布時間:2020-08-27 03:37:30 來源:腳本之家 閱讀:282 作者:固安李慶海 欄目:編程語言

JWT簡介

簡介

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

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

JWT的格式

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

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

B由JWT用到的身份驗證信息json數據加密得到

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

怎樣使用token?

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

流程圖

在SpringBoot中使用JWT的實現方法

jwt流程圖.png

JWT 實戰

加入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, "未授權或者授權已經過期");
             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的用法,在實際應用時可以根據具體的業務需要加入不同的或者更多的參數,一并作為claims進行參數傳遞。

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;
  }
}

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

向AI問一下細節

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

AI

洪泽县| 子长县| 德庆县| 开江县| 平陆县| 华蓥市| 乌苏市| 恩平市| 乌鲁木齐县| 永顺县| 安平县| 青川县| 金昌市| 台北市| 宿松县| 安塞县| 吉隆县| 白水县| 探索| 磴口县| 江源县| 铁岭市| 高淳县| 闽清县| 左云县| 塔河县| 中西区| 天祝| 五台县| 龙川县| 双桥区| 萨迦县| 陕西省| 榆社县| 和田市| 青田县| 敦煌市| 大姚县| 霍林郭勒市| 隆尧县| 渭源县|