springboot整合jwt入门,springboot+jwt

  springboot整合jwt入门,springboot+jwt

  00-1010 1.概述2。优点3。结构3.1。表头)3.2。有效载荷)3.3。签名)4。Spring boot集成了JWT导入依赖项。

  00-1010JWT简称JSON Web Token,即以JSON的形式在Web应用中作为令牌使用。它用于在各方之间以JSON对象的形式安全地传输信息。在数据传输过程中,还可以完成数据加密、签名等相关处理。

  00-1010在JavaWeb阶段,经常使用session进行存储,以便于判断用户是否操作等等。但是,这恰恰暴露了一个问题,就是用session存储会占用服务器内存。只有一两个用户的时候没问题,但是用户上千的时候服务器就不堪重负了。并且会话是基于cookie实现的,所以数据很容易被截获,并且存在CSRF跨域伪造攻击,不安全。这时,JWT的优势就凸显出来了:

  Compact):可以通过URL、POST参数或在HTTP头中发送。由于数据量小,传输速度自成体系:有效载荷包含了用户需要的所有信息,避免了对数据库的多次查询。因为令牌以JSON加密的形式存储在客户端,所以JWT是跨语言的。原则上,任何web表单都支持它。不需要在服务器上保存会话信息,特别适合分布式微服务。

  00-1010JWT令牌由三个主要部分组成:

  报头有效载荷签名(签名)

  00-1010报头通常由两部分组成:令牌类型(即JWT)和使用的签名算法,如HMAC SHA256(默认)或RSA。它将使用Base64编码来形成JWT结构的第一部分。值得注意的是,Base64是一种编码,也就是说可以翻译回原来的形式,并不是加密过程。

  { alg: HS256 , typ: JWT}

  00-1010的有效载荷是包含的声明,通常在有效载荷中存储要传输的数据。同样,它是以Base64编码的,但它也表明这个块可以被反编译。这是什么意思?如果太敏感的信息存储在这里,它可能会被抓住。所以官方建议不要在Payload中存储敏感信息,比如女生的年龄。

  

目录

签名由编码的头和有效载荷以及我们提供的一个密钥签名,然后由头指定的签名算法签名。因此,签名的主要功能是保证JWT不被篡改和令牌的合法性。

 

  这里需要注意的是,密钥秘密是验证令牌是否合法的重要证书。如果用于验证的密钥被外界获得,我们建立的验证防线就像是一个骗局!

  00-1010 dependencygroupid com . auth 0/groupidartifidjava-jwt/artifidversion 3 . 19 . 0/version/dependency write JwtUtils提高代码重用率。

  Class jwtutils {/* *过期时间,单位:秒,默认半小时* */Private static final long Expiration=60 * 30L;/* * key,一般长度较长,内容复杂* */private static final string secret= my _ secret ;/* * * * @ description Create Token * @ AuthorX Baozi * @ date 20336049 2022/3/31 * */public static String Create Token(MapString,String claimMap) {//当前时间戳加上设置的毫秒数(1秒==1000毫秒)date expiration=new date(system . current time millis()

   + EXPIRATION * 1000); // 设置JWT头部 Map<String, Object> map = new HashMap<>(); map.put("alg", "HS256"); map.put("typ", "JWT"); // 创建token JWTCreator.Builder builder = JWT.create(); //使用Lambda创建payload claimMap.forEach((k,v)->{ builder.withClaim(k,v); }); // 添加头部,可省略保持默认,默认即map中的键值对 return builder.withHeader(map) // 设置过期时间 .withExpiresAt(expiration) // 设置签名解码算法 .sign(Algorithm.HMAC256(SECRET)); } /** * @description 验证token * @author xBaozi * @date 23:36 2022/3/31 **/ public static DecodedJWT verifyToken(String token) { return JWT.require(Algorithm.HMAC256(SECRET)).build().verify(token); }}编写过滤器,这是为了使得不用在每一个controller前端控制器都写一遍获取token,将token放在请求体中请求,从而简化开发操作

  

public class JwtInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { Map<String, Object> map = new HashMap<>(); //获取请求头中令牌 String token = request.getHeader("token"); try { //验证令牌 JwtUtils.verifyToken(token); //验证成功,放行请求 return true; } catch (SignatureVerificationException e) { e.printStackTrace(); map.put("msg", "无效签名!"); } catch (TokenExpiredException e) { e.printStackTrace(); map.put("msg", "token过期!"); } catch (AlgorithmMismatchException e) { e.printStackTrace(); map.put("msg", "token算法不一致!"); } catch (Exception e) { e.printStackTrace(); map.put("msg", "token无效!!"); } //设置状态 map.put("state", false); //将map转为json String json = new ObjectMapper().writeValueAsString(map); // 相应json数据 response.setContentType("application/json;charset=UTF-8"); response.getWriter().println(json); return false; }}

配置过滤器

 

  

@Configurationpublic class JwtConfig implements WebMvcConfigurer{ @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new JwtInterceptor()) //添加拦截路径 .addPathPatterns("/**") //添加放行路径 .excludePathPatterns("/user/login"); }}

编写前端控制器,这里以两个为例

 

  

@RestController@RequestMapping("/user")@Slf4jpublic class UserController { // 这里只做演示,就不写Service层了 // @Autowired // private UserService userService; /** * @description 登录功能 * @author xBaozi * @date 0:02 2022/4/1 * @param user user对象,默认有值 **/ @GetMapping("/login") public Map<String,Object> login(User user){ log.info("用户名: [{}]",user.getName()); log.info("密码: [{}]",user.getPassword()); Map<String, Object> map = new HashMap<>(); try{ Map<String,String> payload = new HashMap<>(); payload.put("id",user.getId()); payload.put("name",user.getName()); // 生成JWT的令牌 String token = JwtUtils.createToken(payload); map.put("state",true); map.put("msg","认证成功"); // 响应token map.put("token",token); }catch (Exception e){ map.put("state",false); map.put("msg",e.getMessage()); } return map; } @PostMapping("/other") public Map<String,Object> test(HttpServletRequest request){ Map<String, Object> map = new HashMap<>(); //处理自己业务逻辑 String token = request.getHeader("token"); DecodedJWT verify = JwtUtils.verifyToken(token); log.info("用户id: [{}]",verify.getClaim("id").asString()); log.info("用户name: [{}]",verify.getClaim("name").asString()); map.put("state",true); map.put("msg","请求成功!"); return map; }}

postman测试

 

  

 

  

 

  IDEA控制台查看信息

  

 

  搞完收工,这里的token交由前端进行管理保存!!!溜了~

  到此这篇关于Spring Boot详解整合JWT教程的文章就介绍到这了,更多相关Spring Boot JWT内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: