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

【SpringBoot】——Spring Validation之用户注册、JWT令牌之用户登入

🎼个人主页:【Y小夜】

😎作者简介:一位双非学校的大二学生,编程爱好者,

专注于基础和实战分享,欢迎私信咨询!

🎆入门专栏:🎇【MySQL,Java基础,Rust】

🎈热门专栏:🎊【Python,Javaweb,Vue框架】

感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持!❤️

🎯用户注册验证

验证用户名和密码进行校验(这里拿5-16位非空字符位例子)

public Result register(String username,String password){User u = userService.findByUserName(username);if (u==null){userService.register(username,password);return Result.success();}else{return Result.error("用户名已被占用");}
}

🎃原方法

@PostMapping("/register")
public Result register(String username, String password){if (username!=null && username.length()>=5 && username.length()<=16 &&password!=null && password.length()>=5 && password.length()<=16){//查询用户User u = userService.findByUserName(username);if (u==null){//没有占用//注册userService.register(username,password);return Result.success();}else{//占用return Result.error("用户名已被占用");}}else{return Result.error("参数不合法");}
}

        这段代码是一个用于处理用户注册的Spring Boot控制器方法。它接收两个参数:用户名(username)和密码(password)。首先,它会检查用户名和密码的长度是否在5到16个字符之间。如果满足条件,它会调用userService的findByUserName方法来查询数据库中是否已经存在该用户名。如果用户名不存在,它会调用userService的register方法来注册新用户,并返回一个表示成功的Result对象。如果用户名已存在,它会返回一个包含错误信息的Result对象。如果用户名或密码长度不满足要求,它也会返回一个包含错误信息的Result对象。

        这种方法既容易出错又繁琐,经过发展我们现在可以应用Spring Validation

🎃Spring Validation

        Spring Validation是一个用于数据验证的框架,它提供了一种简单的方式来验证Java对象的属性。在Spring MVC中,可以使用Spring Validation来验证用户输入的数据是否符合预期的规则和约束。

✨步骤

  1. 引入Spring Validation 起步依赖
  2. 在参数前面添加@Pattern注解
  3. 在Controller类上添加@Validated注解
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>
@Validated
public Result register(
@Pattern(regexp="^\\S{5,16}$") String username,@Pattern(regexp="^\\S{5,16}$")String password){
if (userService.findByUsername(username)!=null){return Result,error("该用户名已被占用"):
}
userService.register(username,password);
return Result.success();

        这段代码是一个注册方法,使用了@Validated注解来启用参数验证。它有两个参数:username和password,都使用了@Pattern注解来限制它们的格式。username和password都必须是长度为5到16个非空白字符的字符串。如果用户名已经存在(通过userService.findByUsername(username)检查),则返回一个错误信息。否则,调用userService.register(username, password)方法进行注册,并返回成功的结果。

🎃设置全局异常

@RestControllerAdvice
public class GlobalExceptionHandler@ExceptionHandler(Exception.class)public Result handleException(Exception e){e.printstackTrace();return Result.error(StringUtils.hasLength(e.getMessage())?e.getMessage():"操作失败");

         这是一个全局异常处理器,用于处理项目中的所有异常。当发生异常时,它会捕获异常并返回一个包含错误信息的Result对象。如果异常有消息,则返回该消息,否则返回默认的错误信息"操作失败"。

  • 不要在JWT中存储敏感信息,因为JWT可以被解码。
  • 注意令牌的有效期,避免过长导致安全问题,过短导致用户体验不佳。
  • 考虑使用刷新令牌机制来保持用户长时间在线。

🎯用户登入(JWT令牌

😎概述

        用户登录过程中使用JWT(JSON Web Tokens)令牌是一种常见的身份验证方法。JWT是一种紧凑且自包含的方式,用于在各方之间以JSON对象的形式安全地传输信息。在用户登录的场景中,JWT可以用于在客户端和服务器之间安全地传输用户身份信息。

😎组成结构

  • JWT通常包含以下信息:
    • Header(头部):指定令牌的类型和使用的签名算法(如HS256)。
    • Payload(负载):包含所谓的Claims(声明),例如用户的ID、用户名、角色、发行时间(iat)和过期时间(exp)等。
    • Signature(签名):使用密钥对头部和负载进行签名,确保令牌的安全性。
header+"."+payload+"."+singnature ---> 组成唯一的token

 😎JWT令牌

生成令牌和验证令牌到时候公司应该会给工具类,到时候大家直接调用里面方法就行,这里先了解一下

✨导入依赖

<dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.10.3</version>
</dependency>

✨生成令牌

void genToken() {Map<String, Object> user = new HashMap<>();user.put(“id”, “1”);user.put(“username”, “张三”);String token = JWT.create().withClaim(“user”, user).withExpiresAt(new Date(System.currentTimeMillis() + 1000*60*60)).sign(Algorithm.HMAC256(“秘钥"));System.out.println(token);
}

✨验证令牌

void parseToken() {String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9…….";JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("itheima")).build();DecodedJWT decodedJWT = jwtVerifier.verify(token);Map<String, Claim> claims = decodedJWT.getClaims();System.out.println(claims.get("user"));
}

        但是每一个都调用验证太麻烦了,咱们直接配置一个拦截器,对所有的需要的请求都通过拦截器

😎JWT令牌验证拦截器

✨声明拦截器

package com.liup.interceptor;import com.auth0.jwt.exceptions.AlgorithmMismatchException;
import com.auth0.jwt.exceptions.SignatureVerificationException;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.office.utils.JWTUtils;
import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;/*** JWT验证拦截器*/
public class JWTInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {Map<String,Object> map = new HashMap<>();//令牌建议是放在请求头中,获取请求头中令牌String token = request.getHeader("token");try{JWTUtils.verify(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,response使用的是JacksonString json = new ObjectMapper().writeValueAsString(map);response.setContentType("application/json;charset=UTF-8");response.getWriter().print(json);return false;}
}

✨配置拦截器

@Configuration
public class WebMvcConfiguration extends WebMvcConfigurationSupport {@Autowiredprivate JwtTokenAdminInterceptor jwtTokenAdminInterceptor;/*** 注册自定义拦截器** @param registry*/protected void addInterceptors(InterceptorRegistry registry) {log.info("开始注册自定义拦截器...");registry.addInterceptor(jwtTokenAdminInterceptor).addPathPatterns("/admin/**").excludePathPatterns("/admin/employee/login");//除去那个路径不验证}


http://www.mrgr.cn/news/70343.html

相关文章:

  • 【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-最大的数
  • Docker 篇-Docker 详细安装、了解和使用 Docker 核心功能(数据卷、自定义镜像 Dockerfile、网络)
  • 1111111111待修改--大流量分析(三)-BUUCTF
  • 【JavaWeb】JavaWeb入门之XML详解
  • 高中数学:概率-相关运算性质
  • 微信小程序获取上一页的数据
  • Debezium日常分享系列之:debezium3模块
  • ubuntu 22.04 server 安装 mysql 5.7.40 LTS
  • 优化时钟网络之时钟抖动
  • java -jar`命令详解:运行JAR文件、传递参数与性能调优
  • OPC学习笔记
  • FPGA学习笔记#3 Vitis HLS编程规范、数据类型、基本运算
  • 【神经科学学习笔记】基于分层嵌套谱分割(Nested Spectral Partition)模型分析大脑网络整合与分离的局部指标(二)
  • 【HCIP园区网综合拓扑实验】配置步骤与详解(已施工完毕)
  • 业务开发时,接口不能对外暴露怎么办?
  • C++初阶——类和对象(中)
  • 政策变化?软考考试39分就过线了?
  • C++(继承)
  • 如何清晰地描述一个磁体采购需求
  • 星海智算:风月ComfyUI_SD3.5
  • 深度学习笔记12
  • 铠侠代理商 | KIOXIA SLC闪存选型和应用
  • Java爬虫精准获得JD商品SKU信息
  • RobotFrameWork环境搭建及使用
  • Ubuntu 的 ROS 操作系统安装与测试
  • MySQL 基础