<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          SpringBoot集成JWT

          共 10023字,需瀏覽 21分鐘

           ·

          2020-12-28 03:29

          點擊上方藍(lán)色字體,選擇“標(biāo)星公眾號”

          優(yōu)質(zhì)文章,第一時間送達

          ? 作者?|??Bruce.Chang.Lee

          來源 |? urlify.cn/aeiQvq

          66套java從入門到精通實戰(zhàn)課程分享

          1、什么是JWT?

          關(guān)于JWT的詳細(xì)介紹,請參考JSON Web Token 入門教程

          2、Spring Boot集成JWT

          2.1、pom.xml?文件中引入相關(guān)依賴包

          ??
          ????com.cnblogs.javalouvre
          ????spring-boot-tutorial
          ????1.0.0
          ??


          ??
          ????
          ??????org.apache.commons
          ??????commons-lang3
          ????


          ????
          ??????org.springframework.boot
          ??????spring-boot-starter-web
          ????

          ????
          ??????io.jsonwebtoken
          ??????jjwt
          ??????0.9.1
          ????

          ??

          2.2、aplication.yml?配置JWT相關(guān)參數(shù)

          #?token配置
          token:
          ????#?令牌自定義標(biāo)識
          ????header:?Authorization
          ????#?令牌密鑰(自定義)
          ????secret:?6F3931D35F0395DF82B032B8019AC57D
          ????#?令牌有效期(默認(rèn)30分鐘)
          ????expireTime:?30

          2.3、TokenService.java?設(shè)置Token生成與解析

          package?com.cnblogs.javalouvre.service;

          import?java.util.Calendar;
          import?java.util.Date;
          import?java.util.GregorianCalendar;

          import?org.springframework.beans.factory.annotation.Value;
          import?org.springframework.stereotype.Component;

          import?io.jsonwebtoken.Claims;
          import?io.jsonwebtoken.Jwts;
          import?io.jsonwebtoken.SignatureAlgorithm;

          @Component
          public?class?TokenService?{

          ????/**
          ?????*?生成Token
          ?????*
          ?????*?@param?sub
          ?????*?@return
          ?????*/
          ????public?String?createToken(String?sub)?{
          ????????Calendar?calendar?=?GregorianCalendar.getInstance();
          ????????Date?iat?=?calendar.getTime();
          ????????calendar.add(GregorianCalendar.MINUTE,?amount);
          ????????Date?exp?=?calendar.getTime();

          ????????return?Jwts.builder()//
          ????????????????.setHeaderParam("typ",?"JWT")//?令牌類型
          ????????????????.setSubject(sub)//?主題
          ????????????????.setIssuedAt(iat)?//?簽發(fā)時間
          ????????????????.setExpiration(exp)//?過期時間
          ????????????????.signWith(SignatureAlgorithm.HS512,?secretKey)//?簽名算法、秘鑰
          ????????????????.compact();
          ????}

          ????/**
          ?????*?獲取Token中注冊信息
          ?????*
          ?????*?@param?token
          ?????*?@return
          ?????*/
          ????public?Claims?getBody(String?token)?{
          ????????return?Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token).getBody();
          ????}

          ????/**
          ?????*?獲取簽發(fā)日期
          ?????*
          ?????*?@param?token
          ?????*?@return
          ?????*/
          ????public?Date?getIssuedAt(String?token)?{
          ????????return?getBody(token).getIssuedAt();
          ????}

          ????/**
          ?????*?獲取過期時間
          ?????*
          ?????*?@param?token
          ?????*?@return
          ?????*/
          ????public?Date?getExpiration(String?token)?{
          ????????return?getBody(token).getExpiration();
          ????}

          ????/**
          ?????*?獲取主題信息
          ?????*
          ?????*?@param?token
          ?????*?@return
          ?????*/
          ????public?String?getSubject(String?token)?{
          ????????return?getBody(token).getSubject();
          ????}

          ????//?令牌秘鑰
          ????@Value("${token.secret}")
          ????private?String?secretKey;

          ????//?令牌有效期(默認(rèn)30分鐘)
          ????@Value("${token.expireTime}")
          ????private?int????amount;
          }

          2.4、TokenHandlerInterceptor.java?定義攔截器

          package?com.cnblogs.javalouvre.interceptor;

          import?javax.servlet.http.HttpServletRequest;
          import?javax.servlet.http.HttpServletResponse;

          import?org.apache.commons.lang3.StringUtils;
          import?org.springframework.beans.factory.annotation.Autowired;
          import?org.springframework.beans.factory.annotation.Value;
          import?org.springframework.stereotype.Component;
          import?org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

          import?com.cnblogs.javalouvre.service.TokenService;

          import?io.jsonwebtoken.SignatureException;

          @Component
          public?class?TokenHandlerInterceptor?extends?HandlerInterceptorAdapter?{

          ????@Override
          ????public?boolean?preHandle(HttpServletRequest?request,?HttpServletResponse?response,?Object?handler)
          ????????????throws?Exception?{
          ????????String?uri?=?request.getRequestURI();
          ????????if?(uri.contains("/login"))?{
          ????????????return?true;
          ????????}

          ????????String?token?=?request.getHeader(header);
          ????????if?(StringUtils.isBlank(token))?{
          ????????????throw?new?SignatureException(StringUtils.EMPTY);
          ????????}

          ????????tokenService.getBody(token);

          ????????return?true;
          ????}

          ????@Autowired
          ????private?TokenService?tokenService;

          ????//?令牌自定義標(biāo)識
          ????@Value("${token.header}")
          ????private?String???????header;
          }

          2.5、ResourceConfig.java?配置攔截器

          package?com.cnblogs.javalouvre.config;

          import?org.springframework.beans.factory.annotation.Autowired;
          import?org.springframework.context.annotation.Configuration;
          import?org.springframework.web.servlet.config.annotation.InterceptorRegistry;
          import?org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

          import?com.cnblogs.javalouvre.interceptor.TokenHandlerInterceptor;

          @Configuration
          public?class?ResourceConfig?implements?WebMvcConfigurer?{

          ????@Override
          ????public?void?addInterceptors(InterceptorRegistry?registry)?{
          ????????registry.addInterceptor(tokenHandlerInterceptor).addPathPatterns("/**");
          ????}

          ????@Autowired
          ????private?TokenHandlerInterceptor?tokenHandlerInterceptor;
          }

          2.6、IndexController.java?登錄入口

          package?com.cnblogs.javalouvre.web;

          import?static?org.springframework.http.MediaType.APPLICATION_JSON_VALUE;

          import?org.springframework.beans.factory.annotation.Autowired;
          import?org.springframework.web.bind.annotation.GetMapping;
          import?org.springframework.web.bind.annotation.PostMapping;
          import?org.springframework.web.bind.annotation.RequestHeader;
          import?org.springframework.web.bind.annotation.RestController;

          import?com.cnblogs.javalouvre.dto.AjaxResult;
          import?com.cnblogs.javalouvre.service.TokenService;

          @RestController
          public?class?IndexController?{

          ????@PostMapping(path?=?"/login",?produces?=?APPLICATION_JSON_VALUE)
          ????public?AjaxResult?login(String?username,?String?password)?{
          ????????//?模擬數(shù)據(jù)庫操作
          ????????if?("admin".equals(username)?&&?"admin123".equals(password))?{
          ????????????return?AjaxResult.success("操作成功",?tokenService.createToken(username));
          ????????}

          ????????return?AjaxResult.error("賬號或密碼錯誤");
          ????}

          ????@GetMapping(path?=?"/index",?produces?=?APPLICATION_JSON_VALUE)
          ????public?AjaxResult?execute(@RequestHeader("Authorization")?String?token)?{
          ????????return?AjaxResult.success(tokenService.getSubject(token));
          ????}

          ????@Autowired
          ????private?TokenService?tokenService;
          }

          2.7、其他輔助類

          2.7.1、GlobalExceptionHandler.java?全局異常處理
          package?com.cnblogs.javalouvre.exception;

          import?org.springframework.web.bind.annotation.ExceptionHandler;
          import?org.springframework.web.bind.annotation.ResponseBody;
          import?org.springframework.web.bind.annotation.RestControllerAdvice;

          import?com.cnblogs.javalouvre.dto.AjaxResult;

          import?io.jsonwebtoken.ExpiredJwtException;
          import?io.jsonwebtoken.MalformedJwtException;
          import?io.jsonwebtoken.SignatureException;

          @RestControllerAdvice
          public?class?GlobalExceptionHandler?{

          ????@ExceptionHandler(SignatureException.class)
          ????@ResponseBody
          ????public?AjaxResult?signatureException()?{
          ????????return?AjaxResult.error("Token為空");
          ????}

          ????@ResponseBody
          ????@ExceptionHandler(ExpiredJwtException.class)
          ????public?AjaxResult?expiredJwtException()?{
          ????????return?AjaxResult.error("Token過期");
          ????}

          ????@ResponseBody
          ????@ExceptionHandler(MalformedJwtException.class)
          ????public?AjaxResult?malformedJwtException()?{
          ????????return?AjaxResult.error("Token數(shù)據(jù)錯誤");
          ????}
          }
          2.7.2、HttpStatus.java?返回消息狀態(tài)定義
          package?com.cnblogs.javalouvre.constants;

          public?final?class?HttpStatus?{

          ????public?static?final?int?OK????????????????????=?200;

          ????public?static?final?int?INTERNAL_SERVER_ERROR?=?500;

          ????private?HttpStatus()?{
          ?????//?DO?NOTHING
          ????}

          }
          2.7.3、AjaxResult.java?返回消息定義
          package?com.cnblogs.javalouvre.dto;

          import?java.util.HashMap;
          import?java.util.Objects;

          import?com.cnblogs.javalouvre.constants.HttpStatus;

          public?class?AjaxResult?extends?HashMap?{

          ????private?static?final?long???serialVersionUID?=?242180064461040653L;

          ????//?狀態(tài)碼
          ????private?static?final?String?CODE_TAG?????????=?"code";

          ????//?返回內(nèi)容
          ????private?static?final?String?MSG_TAG??????????=?"msg";

          ????//?數(shù)據(jù)對象
          ????private?static?final?String?DATA_TAG?????????=?"data";

          ????public?AjaxResult()?{
          ????????//?DO?NOTHING
          ????}

          ????public?AjaxResult(int?code,?String?msg)?{
          ????????super.put(CODE_TAG,?code);
          ????????super.put(MSG_TAG,?msg);
          ????}

          ????public?AjaxResult(int?code,?String?msg,?Object?data)?{
          ????????this(code,?msg);

          ????????if?(Objects.nonNull(data))?{
          ????????????super.put(DATA_TAG,?data);
          ????????}
          ????}

          ????public?static?AjaxResult?success()?{
          ????????return?AjaxResult.success("操作成功");
          ????}

          ????public?static?AjaxResult?success(Object?object)?{
          ????????return?AjaxResult.success("操作成功",?object);
          ????}

          ????public?static?AjaxResult?success(String?msg)?{
          ????????return?AjaxResult.success(msg,?null);
          ????}

          ????public?static?AjaxResult?success(String?msg,?Object?data)?{
          ????????return?new?AjaxResult(HttpStatus.OK,?msg,?data);
          ????}

          ????public?static?AjaxResult?error()?{
          ????????return?AjaxResult.success("操作失敗");
          ????}

          ????public?static?AjaxResult?error(Object?object)?{
          ????????return?AjaxResult.error("操作失敗",?object);
          ????}

          ????public?static?AjaxResult?error(String?msg)?{
          ????????return?AjaxResult.error(msg,?null);
          ????}

          ????public?static?AjaxResult?error(String?msg,?Object?data)?{
          ????????return?new?AjaxResult(HttpStatus.INTERNAL_SERVER_ERROR,?msg,?data);
          ????}
          }

          2.8、App.java?入口類

          package?com.cnblogs.javalouvre;

          import?org.springframework.boot.SpringApplication;
          import?org.springframework.boot.autoconfigure.SpringBootApplication;

          @SpringBootApplication
          public?class?App?{

          ????public?static?void?main(String[]?args)?{
          ????????SpringApplication.run(App.class,?args);
          ????}

          }

          3、目錄結(jié)構(gòu)

          │??pom.xml
          │??????
          └─src
          ????├─main
          ????│??├─java
          ????│??│??└─com
          ????│??│??????└─cnblogs
          ????│??│??????????└─javalouvre
          ????│??│??????????????│??App.java
          ????│??│??????????????│??
          ????│??│??????????????├─config
          ????│??│??????????????│??????ResourceConfig.java
          ????│??│??????????????│??????
          ????│??│??????????????├─constants
          ????│??│??????????????│??????HttpStatus.java
          ????│??│??????????????│??????
          ????│??│??????????????├─dto
          ????│??│??????????????│??????AjaxResult.java
          ????│??│??????????????│??????
          ????│??│??????????????├─exception
          ????│??│??????????????│??????GlobalExceptionHandler.java
          ????│??│??????????????│??????
          ????│??│??????????????├─interceptor
          ????│??│??????????????│??????TokenHandlerInterceptor.java
          ????│??│??????????????│??????
          ????│??│??????????????├─service
          ????│??│??????????????│??????TokenService.java
          ????│??│??????????????│??????
          ????│??│??????????????└─web
          ????│??│??????????????????????IndexController.java
          ????│??│??????????????????????
          ????│??└─resources
          ????│??????????application.yml
          ????│??????????
          ????└─test
          ????????├─java
          ????????└─resources





          粉絲福利:Java從入門到入土學(xué)習(xí)路線圖

          ???

          ?長按上方微信二維碼?2 秒


          感謝點贊支持下哈?

          瀏覽 68
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  靠逼视频网站在线观看 | 大屁股美女视频 | 日的好深好爽免费视频 | 麻豆成人在线 | 日韩午夜久久 |