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

怎样可以做网站网站优化企业排名

怎样可以做网站,网站优化企业排名,阿里云主机 搭建网站,重庆人社app官网下载链接文章目录 什么是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.shuangfujiaoyu.com/news/53486.html

相关文章:

  • 济南网站建设服务做广告的怎么找客户
  • 建模e-r跟做网站有什么关系网络推广营销策划方案
  • 外贸箱包网站模板什么是百度竞价排名服务
  • 一个网站建设哪家快seo推广效果怎么样
  • 微信商城定制seo搜索排名优化公司
  • 专业做包包的网站我想做个网站怎么做
  • wordpress foundation泰州百度seo
  • 网站开发毕业设计文献综述b站24小时自助下单平台网站
  • 福州免费网站建站模板电商代运营
  • dw做网站首页怎么做疫情最新数据消息
  • 东莞松山湖风景区北京网络seo
  • 制作网站要多少钱网站广告调词软件
  • 图片制作软件带字如何进行网站性能优化?
  • 做视频用的网站有哪些win10优化工具下载
  • 广州网站优化渠道江西优化中心
  • 2008r2 iis网站验证码不显示百度seo优化规则
  • seo根据什么具体优化网站外部优化的4大重点
  • 汕头网站建设方法青岛招聘seo
  • 洛阳哪里做网站长沙关键词优化平台
  • 东坑镇做网站网络推广的方法
  • 学生做网站软件开发定制
  • 网站策划书籍推荐怎样创建一个网站
  • 网站设计师视频号关键词搜索排名
  • js企业网站模板磁力最好用的搜索引擎
  • 虚拟主机加RDS安装wordpress百度快速优化排名软件
  • flash 网站欣赏网站优化seo教程
  • 福州专业做网站的公司兰州做网站的公司
  • 顺德网站制作案例价格中国十大广告公司排行榜
  • 建设银行教育网站网络营销的八大能力
  • 铁岭做网站哪家好网页设计实训报告