JWT简单总结

一、JWT简介:

  • JWT :json web token

  • 官网:jwt.io

  • jwt的结构:

请添加图片描述

二、生成jwt

①添加依赖

<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>3.10.3</version>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

②生成token

String token = builder.setSubject(u.getTel())//设置主题,(就是token中携带的数据)
  .setIssuedAt(new Date())//设置token生成的时间
  .setId(u.getTel())//设置用户的手机号为token id
  .setClaims(map)//map中可以存放用户的角色权限等信息
  .setExpiration(new Date(System.currentTimeMillis() + 24 * 60 * 60 * 1000))//设置token的过期时间
  .signWith(SignatureAlgorithm.HS256, "dalaolao")//设置加密方式和加密的密码
  .compact();//生成

③解析token

//验证token
JwtParser parser = Jwts.parser();
parser.setSigningKey("dalaolao");//解析token时的SigningKey必须和设置token时的密码一致
try {
    //如果token正确(密码正确,时间有效)则正常执行,否则抛出异常
    Jws<Claims> claimsJws = parser.parseClaimsJws(token);

    Claims body = claimsJws.getBody();//获取token中的用户数据
    String subject = body.getSubject();//获取生成token时设置的subject
    Object key1 = body.get("key1");//获取生成token时存储的Claims的map中存储的值
}catch (Exception e){
    r.setMsg("登陆过期");
}

三、拦截器校验token

①创建拦截器

package com.qf.Interceptor;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.qf.vo.ReturnCode;
import io.jsonwebtoken.JwtParser;
import io.jsonwebtoken.Jwts;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@Component
public class TokenInterceptor implements HandlerInterceptor {
  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    String token = request.getHeader("token");
    if (token == null) {
      //提示请先登录
      ReturnCode returnCode = new ReturnCode(1, "请先登录", null, null);
      doResponse(response,returnCode);
      return false;
    } else {
      try {
        JwtParser parser = Jwts.parser();
        parser.setSigningKey("dalaolao");
        parser.parseClaimsJws(token);
        return true;
      } catch (Exception e) {
        ReturnCode returnCode = new ReturnCode(1, "token无效", null, null);
        doResponse(response,returnCode);
        return false;
      }
    }
  }
  public void doResponse(HttpServletResponse response,ReturnCode returnCode) throws IOException {
    response.setContentType("application/json");
    response.setCharacterEncoding("utf-8");
    PrintWriter writer = response.getWriter();
    String s = new ObjectMapper().writeValueAsString(returnCode);
    writer.print(s);
    writer.flush();
    writer.close();
  }
}

②配置拦截器

package com.qf.config;

import com.qf.Interceptor.TokenInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import javax.annotation.Resource;

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
  @Resource
  private TokenInterceptor tokenInterceptor;

  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(tokenInterceptor)
      .addPathPatterns("/users/testing")//设置需要拦截的路径
      .excludePathPatterns("/news/**");//设置忽略拦截的路径
  }
}

③请求头传递token

前端但凡访问受限资源,都必须携带token发送请求; token可以通过请求行(params)、请求头(header)以及请求体(data)传递,但是习惯性使用header传递

前端axios中header传值

axios({
  method:'post',
  url:'/api/users/testing',
  headers:{token:CookieUtil.getCookieValue("token")},
}).then((res)=>{
  console.log(res.data)
})

以下两部均在拦截器中处理

后端处理OPTIONS预检请求

String method = request.getMethod();
if("OPTIONS".equalsIgnoreCase(method)){
    return true;
}

后端接受请求同中的参数

String token = request.getHeader("token");

request.getMethod();
if(“OPTIONS”.equalsIgnoreCase(method)){
return true;
}


### 后端接受请求同中的参数

String token = request.getHeader("token");
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Boot JWT是一种在Spring Boot框架使用的身份验证和授权机制。JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在不同的系统安全地传输信息。在应用程序使用JWT可以实现无状态的身份验证机制。 使用Spring Boot JWT,首先需要配置一个密钥,用于生成和验证JWT。然后,在用户登录时,通过验证用户的用户名和密码,生成一个JWT并返回给客户端。客户端在后续的请求需要将该JWT作为请求头的Authorization字段发送到服务器进行身份验证。 在服务器端,接收到请求后,解析JWT并验证其合法性。如果JWT通过验证,则可以认为用户是经过身份验证的,并根据用户的角色和权限来授权。JWT通常包含有关用户的一些基本信息,如用户名、角色等。 Spring Boot JWT的优点是简单且易于实现。由于使用JWT实现了无状态的身份验证和授权,因此可以避免在服务器端存储会话信息,减轻了服务器的压力,提高了系统的性能。此外,JWT还可以设置过期时间和刷新机制,增加了安全性。 需要注意的是,JWT的信息是在客户端生成的,并且是可解码的,并不是加密的。因此,在使用JWT时需要谨慎处理敏感信息。此外,由于JWT是基于时间的验证机制,因此需要设置合理的过期时间,以防止被非法使用。 总的来说,Spring Boot JWT是一种灵活且安全的身份验证和授权机制,适用于构建无状态的分布式应用程序。通过合理配置和使用,可以实现简单且可靠的用户身份验证和授权。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值