在SpringBoot中使用JWT的实现方法

  

  

  

JSON Web标记简称JWT,是用于对应用程序上的用户进行身份验证的标记,也就是说,使用JWT的应用程序不再需要保存有关其用户的饼干或其他会话数据。此特性便于可伸缩性,同时保证应用程序的安全。

  

在身份验证过程中,当用户使用其凭据成功登录时,将返回JSON Web标记,并且必须在本地保存(通常在本地存储中)。每当用户要访问受保护的路由或资源(端点)时,用户代理(用户代理)必须连同请求一起发送JWT,通常在授权标头中使用无记名模式。后端服务器接收到带有JWT的请求时,首先要做的是验证牌。

  

  

JWT就是一个字符串,经过加密处理与校验处理的字符串,形式为:A.B.C

  

由JWT头部信息头加密得到

  

B由JWT用到的身份验证信息json数据加密得到

  

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

  

  

可以放到HTTP请求的请求头中,通常是授权字段。

  

  

在SpringBoot中使用JWT的实现方法

  

jwt流程图中将

  

  

加入Maven jwt依赖

        & lt; dependency>   & lt; groupId> io.jsonwebtoken   & lt; artifactId> jjwt   & lt; version> 0.9.1   & lt;/dependency>      

在application.proterties中加入配置

        #加密严   jwt.secret=A0B1C2D3E4F5G6H7I8J9KALBMCNDOEPFQ0R1S2T3U4V5W6X7Y8Z9   # tocken过期时间,单位秒   jwt.expire=300   #需要认证的url,多个url使用英文逗号,分割   jwt.authorised-urls=/api/fis/复述,/* *   之前      

JwtHelper工具类

        进口java.text.SimpleDateFormat;   进口java.util.Calendar;   进口java.util.Date;   进口java.util.Map;   进口javax.servlet.http.HttpServletRequest;   进口com.alibaba.fastjson.JSONObject;   进口io.jsonwebtoken.Jwts;   进口io.jsonwebtoken.SignatureAlgorithm;      公开课JwtHelper {   私人长EXPIRATION_TIME;   私人秘密字符串;   私人最终字符串TOKEN_PREFIX=俺制比恕?   私人最终字符串HEADER_STRING=笆谌ā?      公共JwtHelper(字符串秘密,长到期){   这一点。EXPIRATION_TIME=到期;   这一点。秘密=秘密;   System.out.println(“正在初始化Jwthelper,到期=" +到期);   }      公共JSONObject generateToken (Map<字符串,Object>索赔){   日历c=Calendar.getInstance ();   c。凝固时间(新日期());   c.add(日历。第二,EXPIRATION_TIME.intValue ());   d=c.getTime日期();   字符串jwt=Jwts.builder ()   .setClaims(索赔)   .setExpiration (d)   .signWith (SignatureAlgorithm。HS512秘密)   .compact ();   JSONObject json=new JSONObject ();   json。put(“令牌”,TOKEN_PREFIX + " " + jwt);   json。把(“令牌类型”,TOKEN_PREFIX);   json。(“expire-time”,新的SimpleDateFormat (yyyy-MM-dd HH: ss: mm) .format (d));   返回json;   }      公共Map<字符串,Object>validateTokenAndGetClaims (HttpServletRequest请求){   字符串标记=request.getHeader (HEADER_STRING);   system . out。println(“令牌:“+令牌);   如果令牌==null) {   返回null;   }   Object> Map<字符串;身体=Jwts.parser ()   .setSigningKey(秘密)   .parseClaimsJws(令牌。替换(TOKEN_PREFIX”、“))   .getBody ();   恢复身体;   }   }      

JWT过滤器JwtFilter

        进口java.io.IOException;   进口java.util.Arrays;   进口并不知道;   进口javax.servlet.Filter;   进口javax.servlet.FilterChain;   进口javax.servlet.FilterConfig;   进口javax.servlet.ServletException;   与javax . servlet . servletrequest进口;   进口javax.servlet.ServletResponse;   进口javax.servlet.http.HttpServletRequest;   进口javax.servlet.http.HttpServletResponse;   进口org.springframework.http.HttpStatus;   进口org.springframework.util.AntPathMatcher;/* *   * JWT过滤器   *   * @author李庆海   *   */公共类JwtFilter实现滤波器{   私人JwtHelper JwtHelper;   私人Listurl=零;   私有静态最终org.springframework.util。PathMatcher PathMatcher=new AntPathMatcher ();   公共JwtFilter (JwtHelper JwtHelper, String [] authorisedUrls) {   这一点。jwtHelper=jwtHelper;   url=arrays . aslist (authorisedUrls);   }      @Override   FilterConfig FilterConfig公共空init()抛出ServletException {//SpringBeanAutowiringSupport。processInjectionBasedOnServletContext(这,filterConfig.getServletContext ());   }      @Override   公共空间的doFilter (ServletRequest请求,ServletResponse响应FilterChain链)抛出IOException, ServletException {   HttpServletRequest httpRequest=(HttpServletRequest)请求;   HttpServletResponse httpResponse=(HttpServletResponse)反应;   httpResponse.setCharacterEncoding (“utf - 8”);   application/json httpResponse.setContentType (“;charset=utf - 8”);   httpResponse。setHeader (“Access-Control-Allow-Origin”、“*”);   如果(“选项”.equals (httpRequest.getMethod ())) {   httpResponse.setStatus (HttpStatus.NO_CONTENT.value ());//HttpStatus。SC_NO_CONTENT=204   httpResponse。setHeader(“Access-Control-Allow-Credentials”,“真正的”);   httpResponse。setHeader (“Access-Control-Allow-Headers”、“内容类型、x-requested-with牌”);   httpResponse。setHeader (“Access-Control-Allow-Methods”、“选项,GET、POST、删除”);   }   字符串spath=httpRequest.getServletPath ();   尝试{//验证受保护的接口   (字符串url: url) {   如果(pathMatcher。匹配(url, spath)) {   令牌对象=jwtHelper.validateTokenAndGetClaims (httpRequest);   如果(令牌!=null) {   链。doFilter(请求、响应);   返回;   其他}{   httpResponse.sendError (HttpServletResponse。SC_UNAUTHORIZED”,未授权或者授权已经过期”);   返回;   }   其他}{   链。doFilter(请求、响应);   返回;   }   }   }捕捉(异常e) {   e.printStackTrace ();   }   链。doFilter(请求、响应);   返回;   }      @Override   公共空间摧毁(){      }   }

在SpringBoot中使用JWT的实现方法