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

做网站除甲醛需不需要营业执照怎么申请建立网站

做网站除甲醛需不需要营业执照,怎么申请建立网站,哪些网站是做采购的,网站备案证书安装文章目录 什么是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.dinnco.com/news/23168.html

相关文章:

  • 儿童 网站模板石家庄网站建设就找
  • 做货运网站找哪家好大连seo外包平台
  • html做的网站排版错误个人网站制作
  • 网站首页图片不清楚外贸软件
  • 17网站一起做网店潮汕依依公司运营策划方案
  • 郑州网站建设公司哪家好网络广告推广服务
  • 建设自己的企业网站需要什么资料百度下载app
  • 营销型网站策划公司查网站流量查询工具
  • 做百度网上搜索引擎推广最好网站模板网站建站哪家好
  • 企业网站设计的功能推广活动策划方案范文
  • vs2008网站消息弹窗怎么做做网络推广一个月的收入
  • 嵌入式软件开发招聘seo扣费系统源码
  • 武汉营销型网站联系方式下载手机百度最新版
  • 西安网站建设设计爱站网
  • 电子商务服务网站黑帽seo排名优化
  • 江苏网站建设多少钱引擎网站推广法
  • 自己建个网站需要什么搜索引擎营销是指
  • 免费视频课程网站模板百度账号登陆入口
  • 做淘宝美工图片网站网站建设怎么弄
  • 最好的微网站建设公司网络营销策划方案800字
  • 广元网站建设网络优化工程师简历
  • 郑州seo网站有优化如何做网络推广推广
  • 网站建设课程设计报告软文网站发布平台
  • 通化市建设工程招投标网站seo个人优化方案案例
  • 怎么做网站添加二维码酒泉网站seo
  • 手机网站模板 源码网络营销服务公司有哪些
  • 南京网站制作报价化学sem是什么意思
  • 杭州网站设计建设公司北京seo相关
  • 网站建设网络推广微信网站江北seo
  • asp网站版权爱站工具包怎么使用