Spring Validation中的用户注册、JWT令牌之用户登入功能

 更新时间:2024年11月13日 11:38:58   作者:Y小夜  
本文介绍了使用SpringValidation进行用户注册验证和JWT进行用户登录的方法,在用户注册时,通过@Validated注解和@Pattern注解对用户名和密码进行格式校验,并使用Result对象返回验证结果,感兴趣的朋友一起看看吧

🎯用户注册验证

验证用户名和密码进行校验(这里拿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用户登入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java排序算法总结之堆排序

    Java排序算法总结之堆排序

    这篇文章主要介绍了Java排序算法总结之堆排序,详细分析了堆排序的原理与java实现技巧,需要的朋友可以参考下
    2015-05-05
  • 一文彻底搞定Java中常用集合的排序方法

    一文彻底搞定Java中常用集合的排序方法

    在某些特殊的场景下我们需要在Java程序中对List集合进行排序操作,下面这篇文章主要给大家介绍了关于Java中常用集合的排序方法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • 详解mybatis插入数据后返回自增主键ID的问题

    详解mybatis插入数据后返回自增主键ID的问题

    这篇文章主要介绍了mybatis插入数据后返回自增主键ID详解,本文通过场景分析示例代码相结合给大家介绍的非常详细,需要的朋友可以参考下
    2021-07-07
  • Java 实现缓存的三种方式及问题汇总

    Java 实现缓存的三种方式及问题汇总

    这篇文章主要介绍了Java 实现缓存的三种方式及问题汇总,HashMap实现缓存,可以实现简单的本地缓存,但是实际开发中不推荐,我们可以简单模拟一下缓存的实现,本文通过示例代码介绍的非常详细,感兴趣的朋友一起看看吧
    2024-03-03
  • JAVA程序员不得不留意的编码规范

    JAVA程序员不得不留意的编码规范

    这篇文章主要介绍了JAVA程序员不得不留意的编码规范,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Feign调用传输文件异常的解决

    Feign调用传输文件异常的解决

    这篇文章主要介绍了Feign调用传输文件异常的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Springboot 2.6集成redis maven报错的坑记录

    Springboot 2.6集成redis maven报错的坑记录

    这篇文章主要介绍了Springboot 2.6集成redis maven报错的坑记录,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • J2EE验证码图片如何生成和点击刷新验证码

    J2EE验证码图片如何生成和点击刷新验证码

    这篇文章主要介绍了J2EE如何生成验证码图片如何生成,如何点击刷新验证码的相关方法,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • Spring Security异步无法获取用户认证信息的解决方法

    Spring Security异步无法获取用户认证信息的解决方法

    最近使用 Springboot 中 @Async 注解异步调用方法时,发现无法获取到用户认证信息,本文小编给大家介绍了Spring Security异步无法获取用户认证信息的原因和解决方法,并通过代码示例介绍的非常详细,需要的朋友可以参考下
    2024-09-09
  • 关于Intellij IDEA中的Version Control问题

    关于Intellij IDEA中的Version Control问题

    这篇文章主要介绍了Intellij IDEA中的Version Control问题,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-11-11

最新评论