当前位置: 首页 > news >正文

韩国情侣网站模板ui设计软件下载

韩国情侣网站模板,ui设计软件下载,东莞网络推广哪家公司奿,网站的规划与建设文章目录 什么是JWT?为什么需要令牌?如何实现?添加依赖:JwtUtils.java(生成、解析Token的工具类)jwt配置:登录业务逻辑:其他关联代码:测试: 什么是JWT? JWT(Json Web Token&…

文章目录

  • 什么是JWT?
  • 为什么需要令牌?
  • 如何实现?
    • 添加依赖:
    • JwtUtils.java(生成、解析Token的工具类)
    • jwt配置:
    • 登录业务逻辑:
    • 其他关联代码:
    • 测试:

什么是JWT?

JWT(Json Web Token),简单来说就是:web领域中基于json格式的令牌。是最常用的令牌规范。

  • 第一部分:Header(头),指定了令牌的签名算法、令牌类型。
  • 第二部分:Payload(有效载荷),使用Base64来编码的,不是加密算法,能够解码。因此,该部分不适合存放用户的私密信息(如:密码)。
  • 第三部分:Signature(签名),将第一部分和第二部分通过密钥加密得到。

在这里插入图片描述
解析Token可以根据第三部分解密得到前两部分的信息,再比对前端传来的用户信息,完成校验。

Token验证失败的情况?

  1. token过期
  2. 密钥不正确
  3. 篡改了头部、载荷等

为什么需要令牌?

  • 承载了一定的数据信息,减少数据库访问次数
  • 具有一定的防伪功能

如何实现?

该部分代码不需要硬记,理解后直接使用即可。

添加依赖:

<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version>
</dependency>

JwtUtils.java(生成、解析Token的工具类)

public class JwtUtil {/*** 生成Token* @param secretKey* @param ttlMillis* @param claims* @return*/public static String createToken(String secretKey, long ttlMillis, Map<String, Object> claims) {// 指定签名的时候使用的签名算法,也就是header那部分SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;// 生成token的过期时间long expMillis = System.currentTimeMillis() + ttlMillis;Date exp = new Date(expMillis);// 设置jwt的bodyJwtBuilder builder = Jwts.builder()// 如果有私有声明,一定要先设置这个自己创建的私有的声明,这个是给builder的claim赋值,一旦写在标准的声明赋值之后,就是覆盖了那些标准的声明的.setClaims(claims)// 设置签名使用的签名算法和签名使用的秘钥.signWith(signatureAlgorithm, secretKey.getBytes(StandardCharsets.UTF_8))// 设置过期时间.setExpiration(exp);return builder.compact();}/*** 解析token* @param secretKey* @param token* @return*/public static Claims parseToken(String secretKey, String token) {// 得到DefaultJwtParserClaims claims = Jwts.parser()// 设置签名的秘钥.setSigningKey(secretKey.getBytes(StandardCharsets.UTF_8))// 设置需要解析的jwt.parseClaimsJws(token).getBody();return claims;}}

jwt配置:

  • application.yaml:

    user:jwt:# 设置jwt签名加密时使用的秘钥user-secret-key: xxx# 设置jwt过期时间user-ttl: 7200000# 设置前端传递过来的令牌名称user-token-name: token
    
  • JwtProperties:

    @Component
    @ConfigurationProperties(prefix = "user.jwt")
    @Data
    public class JwtProperties {private String userSecretKey;private long userTtl;private String userTokenName;
    }
    
  • JwtClaimsConstant(管理常量):

    public class JwtClaimsConstant {public static final String USER_ID = "userId";
    }
    
  • jwt拦截器:

    @Component
    @Slf4j
    public class JwtInterceptor implements HandlerInterceptor {@Resourceprivate JwtProperties jwtProperties;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//1. 获取用户信息String token = request.getHeader(jwtProperties.getUserTokenName());//2. 判断用户信息是否有效,存入ThreadLocaltry {Claims claims = JwtUtil.parseToken(jwtProperties.getUserSecretKey(), token);String userInfo = claims.get(JwtClaimsConstant.USER_ID).toString();if (StrUtil.isNotBlank(userInfo)){UserContext.setUser(Long.valueOf(userInfo));}//3. 放行return true;}catch (Exception e){//4. 不通过response.setStatus(401);return false;}}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {//清除用户信息UserContext.removeUser();}
    }
  • WebMvc配置(添加jwt拦截器)

    @Configuration
    public class WebConfig implements WebMvcConfigurer {@Resourceprivate JwtInterceptor jwtInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(jwtInterceptor).addPathPatterns("/user/**").excludePathPatterns("/user/user/login");}
    }
    
  • UserContext(存储用户登录信息,方便其他业务需求获取)

    public class UserContext {private static final ThreadLocal<Long> threadLocal = new ThreadLocal<>();/*** 获取用户信息* @return*/public static Long getUser() {return threadLocal.get();}/*** 设置用户信息* @param userId*/public static void setUser(Long userId){threadLocal.set(userId);}/*** 移除用户信息*/public static void removeUser(){threadLocal.remove();}
    }
    

登录业务逻辑:

  • controller层:

    @RestController
    @RequestMapping("/user/user")
    @Slf4j
    public class UserController {@Resourceprivate UserService userService;@PostMapping("/login")public UserLoginVO login(@RequestBody UserLoginDTO userLoginDTO){log.info("用户登录:{}",userLoginDTO);return userService.login(userLoginDTO);}
    }
  • service层:

    public interface UserService {UserLoginVO login(UserLoginDTO userLoginDTO);
    }
    
    @Service
    @Slf4j
    public class UserServiceImpl implements UserService {@Resourceprivate UserMapper userMapper;@Resourceprivate JwtProperties jwtProperties;@Overridepublic UserLoginVO login(UserLoginDTO userLoginDTO) {String username = userLoginDTO.getUsername();String password = userLoginDTO.getPassword();//1. 校验用户名和密码UserLogin userLogin = userMapper.getUserByName(username);if (userLogin == null){throw new BaseException("用户名或密码错误");}password = DigestUtils.md5DigestAsHex(password.getBytes());if (!password.equals(userLogin.getPassword())){throw new BaseException("用户名或密码错误");}//2. 生成tokenHashMap<String, Object> claims = new HashMap<>();claims.put(JwtClaimsConstant.USER_ID, userLogin.getId());String token = JwtUtil.createToken(jwtProperties.getUserSecretKey(),jwtProperties.getUserTtl(),claims);//3. 封装voUserLoginVO loginVO = UserLoginVO.builder().token(token).userId(userLogin.getId()).username(userLogin.getUsername()).build();return loginVO;}
    }
    
  • mapper层:

    @Mapper
    public interface UserMapper {UserLogin getUserByName(String username);
    }
    
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    <mapper namespace="com.sky.user.mapper.UserMapper"><select id="getUserByName" resultType="com.sky.user.pojo.entity.UserLogin">select *from user_login where username = #{username} and is_delete = 0;</select>
    </mapper>
    

其他关联代码:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserLoginDTO {/*** 用户名*/private String username;/*** 密码*/private String password;}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserLoginVO {private String token;private Long userId;private String username;
}

测试:

登录接口:
在这里插入图片描述
其他接口:
在这里插入图片描述
在这里插入图片描述

以上为个人学习分享,如有问题,欢迎指出:)

http://www.yayakq.cn/news/576061/

相关文章:

  • 南昌哪里可以做电商网站网站宽屏背景
  • 做网站一定要域名嘛图片识别搜索引擎
  • jsp网站建设技术案例ajax wordpress地址
  • 寿县移动公司网站建设网站开发算是研发支出吗
  • 保险咨询网站建设在线ps图
  • 安阳县崔家桥职业中专优化网站排名公司
  • 做个模板网站多少钱网站域名注册的相关证书证明文件
  • 做信息采集的网站微信网站平台建设
  • 网站目的百度人工电话
  • 福建人力资源建设网站wordpress怎么看访问
  • 做国际网站的流程外贸网站域名能用cn做后缀吗
  • 创建网站投资多少钱微信小程序模板使用
  • 西安搜建站科技网站手机网站图片 触摸 放大代码 js
  • 营销型网站建设题品牌公司
  • 深圳沙井做网站公司wordpress更好域名
  • 网站程序开发的基本步骤网站建立多少钱
  • 奇缦科技珠海网站建设优化江苏建设人才网站
  • wordpress托管 根目录网站优化怎么做关键词排名
  • 如何让百度收录我的网站四川城乡和住房建设厅网站首页
  • 交互网站开发萧山做网站公司
  • 做众筹网站要什么资质作图神器
  • 长沙市城市建设档案馆网站大良网站建设市场
  • 移动宽带过期了怎么续费淄博seo方案
  • 网站空间搭建网站对于企业的作用
  • 中医院网站素材企业网站怎么做才能留住客户
  • 郑州租赁房网站建设移动物联网流量卡
  • 网易考拉的网站建设信息化管理软件
  • 中石化网站是哪个公司做的医疗ppt模板下载免费完整版
  • 那些网站百度抓取率比较高wordpress会员通知插件
  • 陕西省建设工程施工许可证查询网站wordpress 水果主题