Spring Validation中的用户注册、JWT令牌之用户登入功能
作者:Y小夜
🎯用户注册验证
验证用户名和密码进行校验(这里拿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来验证用户输入的数据是否符合预期的规则和约束。
✨步骤
- 引入Spring Validation 起步依赖
- 在参数前面添加@Pattern注解
- 在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 { @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.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使用的是Jackson String json = new ObjectMapper().writeValueAsString(map); response.setContentType("application/json;charset=UTF-8"); response.getWriter().print(json); return false; } }
✨配置拦截器
@Configuration public class WebMvcConfiguration extends WebMvcConfigurationSupport { @Autowired private JwtTokenAdminInterceptor jwtTokenAdminInterceptor; /** * 注册自定义拦截器 * * @param registry */ protected void addInterceptors(InterceptorRegistry registry) { log.info("开始注册自定义拦截器..."); registry.addInterceptor(jwtTokenAdminInterceptor) .addPathPatterns("/admin/**") .excludePathPatterns("/admin/employee/login");//除去那个路径不验证 }
到此这篇关于Spring Validation之用户注册、JWT令牌之用户登入的文章就介绍到这了,更多相关Spring Validation用户登入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!