java自定义验证器

前言

在对外暴露接口中,我们通常会对入参进行验证,比如一些字符串非空判断、数字最小值最大值这些基础的判断在java验证规范中已经提供了,然而这些只是常规的验证,我们可以通过自定义注解以及验证器来进行我们自己业务上的一些验证,这样可以避免在业务逻辑中添加过多的验证,降低代码的可读性。

使用

1、依赖引入

仅需引入验证包即可,当然,如果使用的springboot,可以直接管理依赖,不用指定版本

        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
        </dependency>

2、自定义注解

这里添加一个银行卡验证的注解,其实核心注解就是@Constraint,这个注解要求我们的注解中必须有message()groups()以及payload()这三个方法

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

/**
 * 银行卡号校验注解
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
// 这里指定验证器
@Constraint(validatedBy = {BankCardValidator.class})
@Target({ElementType.FIELD,ElementType.ANNOTATION_TYPE,ElementType.PARAMETER})
public @interface BankCardValidity {

    /**
     * 提示信息
     * @return String
     */
    String message() default "";

    /**
     * 是否验证
     * @return boolean
     */
    boolean required() default true;

    /**
     * groups
     * @return []
     */
    Class<?>[] groups() default {};


    /**
     * payload
     * @return []
     */
    Class<? extends Payload>[] payload() default {};
}

3、编写验证器

验证器的核心是实现ConstraintValidator这个类,第一个参数是指定注解,第二个则是指定的入参


import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 银行卡号校验器
 */
public class BankCardValidator implements ConstraintValidator<BankCardValidity,String> {

    /**
     * 是否强制验证
     */
    private boolean required = false;

    /**
     * 银行卡号正则校验,这里就是一个正则验证
     */
    private static Pattern patternForBankCardNo = Pattern.compile("^([1-9]{1})(\\d{15}|\\d{18})$");
	
	/**
	 * 这里就是验证逻辑,返回true验证通过,返回false验证不通过
	 */
    @Override
    public boolean isValid(String bankCardNo, ConstraintValidatorContext context) {
        if (required) {
            return isBankCardNo(bankCardNo);
        } else {
            if (StrUtil.isBlank(bankCardNo)) {
                return false;
            }
            return isBankCardNo(bankCardNo);
        }
    }

    @Override
    public void initialize(BankCardValidity validity) {
        required = validity.required();
    }

    /**
     * 验证是否为银行卡号
     * @param bankCardNo 输入内容
     * @return boolean
     */
    private static boolean isBankCardNo(String bankCardNo) {
        // 使用的hutool工具包,也可以使用其它工具包
        if (StrUtil.isBlank(bankCardNo)) {
            return false;
        }
        Matcher matcherForBankCardNo = patternForBankCardNo.matcher(bankCardNo);
        return matcherForBankCardNo.matches() ;
    }
}

至此编码就完成了,我们可以在注解中添加新的方法,在initialize()方法中使用,或者取值等操作,这都是根据业务场景来进行的。
当然,在入参校检中,我们肯定也需要把@Valid等注解加上,验证器才会去验证。

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java自定义JWT令牌是一种用于身份验证和授权的安全令牌。JWT(JSON Web Token)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式来传输信息,通常用于在网络应用中传递用户身份信息。 在Java中,可以使用第三方库来实现自定义JWT令牌的生成和验证。以下是一个简单的示例: 1. 导入相关依赖: ```xml <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency> ``` 2. 创建JWT令牌生成和验证的工具类: ```java import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import java.util.Date; public class JwtUtils { private static final String SECRET_KEY = "your-secret-key"; private static final long EXPIRATION_TIME = 86400000; // 24小时 public static String generateToken(String username) { Date now = new Date(); Date expirationDate = new Date(now.getTime() + EXPIRATION_TIME); return Jwts.builder() .setSubject(username) .setIssuedAt(now) .setExpiration(expirationDate) .signWith(SignatureAlgorithm.HS256, SECRET_KEY) .compact(); } public static String getUsernameFromToken(String token) { Claims claims = Jwts.parser() .setSigningKey(SECRET_KEY) .parseClaimsJws(token) .getBody(); return claims.getSubject(); } public static boolean validateToken(String token) { try { Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token); return true; } catch (Exception e) { return false; } } } ``` 3. 使用JWT令牌生成和验证: ```java public class Main { public static void main(String[] args) { String username = "john.doe"; String token = JwtUtils.generateToken(username); System.out.println("Token: " + token); String extractedUsername = JwtUtils.getUsernameFromToken(token); System.out.println("Extracted username: " + extractedUsername); boolean isValid = JwtUtils.validateToken(token); System.out.println("Is valid token: " + isValid); } } ``` 这是一个简单的示例,你可以根据自己的需求进行更复杂的配置和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值