springboot手机号校验

本文介绍了如何在SpringBoot应用中使用Validator进行数据校验,包括手机号的正则验证和数字的最小值校验。通过@ApiModelProperty、@NotBlank、@NotNull、@Length和@Pattern注解实现对联系人电话字段的严格限制,确保手机号格式正确且必填。同时,利用@DecimalMin注解确保面积字段的数值不低于0,从而保证数据的有效性和一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

手机号校验:
@ApiModelProperty(value = "联系人电话")
@NotBlank(message = "手机号码不能为空", groups = {Insert.class})
@NotNull(message = "手机号不能为空", groups = {Insert.class})
@Length(min = 11, max = 11, message = "手机号只能为11位")
@Pattern(regexp = "^[1][3,4,5,6,7,8,9][0-9]{9}$", message = "手机号格式有误")
private String phoneNumber;

数字校验数值:

  @ApiModelProperty(value = "面积")
  @DecimalMin(value = "0.0", message = "面积不能低于0")
  private BigDecimal area;

更多校验可以参考:Validator 参数校验springboot整合Validator,自定义手机号参数校验

### Spring Boot 实现手机验证码功能示例 在Spring Boot项目中实现手机号验证码功能,可以通过集成Spring Security并自定义认证逻辑完成。以下是具体实现方法: #### 1. 添加依赖 为了支持验证码的生成、存储和验证等功能,需引入必要的Maven依赖项[^2]。 ```xml <dependencies> <!-- Spring Security --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <!-- 验证码相关工具 --> <dependency> <groupId>com.google.code.kaptcha</groupId> <artifactId>kaptcha</artifactId> <version>2.3.2</version> </dependency> </dependencies> ``` #### 2. 创建验证码生成与发送接口 构建一个用于生成和发送验证码的接口。该接口应接受用户的手机号作为输入参数,并生成随机验证码[^3]。 ```java @RestController @RequestMapping("/sms") public class SmsCodeController { private static final Logger logger = LoggerFactory.getLogger(SmsCodeController.class); @PostMapping("/send") public ResponseEntity<String> sendSms(@RequestParam String phone) { try { String code = generateRandomCode(); boolean isSent = sendSms(phone, code); if (isSent) { cacheSmsCode(phone, code); // 将验证码缓存起来以便后续校验 return ResponseEntity.ok("验证码已发送"); } } catch (Exception e) { logger.error("Failed to send SMS", e); } return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("发送失败"); } private String generateRandomCode() { Random random = new Random(); StringBuilder sb = new StringBuilder(6); for(int i = 0; i < 6; i++) { sb.append(random.nextInt(10)); } return sb.toString(); } private void cacheSmsCode(String phone, String code) { // 使用Redis或其他缓存机制保存验证码 } private boolean sendSms(String phone, String code) { // 调用第三方短信服务API发送验证码 return true; } } ``` #### 3. 自定义认证Token 创建一个新的`Authentication`子类来表示基于验证码的身份验证令牌。 ```java public class SmsCodeAuthenticationToken extends AbstractAuthenticationToken { private final String phoneNumber; public SmsCodeAuthenticationToken(String phoneNumber) { super(null); this.phoneNumber = phoneNumber; setAuthenticated(false); } @Override public Object getCredentials() { return null; } @Override public Object getPrincipal() { return phoneNumber; } } ``` #### 4. 自定义认证提供者 实现`AuthenticationProvider`接口以处理验证码的校验过程。 ```java @Component public class SmsCodeAuthenticationProvider implements AuthenticationProvider { @Autowired private RedisTemplate<String, String> redisTemplate; @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { String phoneNumber = (String) authentication.getPrincipal(); String providedCode = (String) authentication.getCredentials(); String cachedCode = redisTemplate.opsForValue().get(phoneNumber); if(cachedCode != null && cachedCode.equals(providedCode)) { SmsCodeAuthenticationToken authenticatedToken = new SmsCodeAuthenticationToken(phoneNumber); authenticatedToken.setAuthenticated(true); return authenticatedToken; } throw new BadCredentialsException("Invalid verification code."); } @Override public boolean supports(Class<?> authentication) { return SmsCodeAuthenticationToken.class.isAssignableFrom(authentication); } } ``` #### 5. 配置过滤器链 将上述组件整合到Spring Security配置中,确保其能够拦截特定路径并执行相应的认证操作。 ```java @Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private SmsCodeAuthenticationProvider smsCodeAuthProvider; @Bean protected SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/login/sms").permitAll() .anyRequest().authenticated() .and() .addFilterBefore(new SmsCodeAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class); return http.build(); } @Bean public PasswordEncoder passwordEncoder() { return NoOpPasswordEncoder.getInstance(); // 可替换为更强密码编码方式 } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.authenticationProvider(smsCodeAuthProvider); } } class SmsCodeAuthenticationFilter extends AbstractAuthenticationProcessingFilter { public SmsCodeAuthenticationFilter() { super("/login/sms"); } @Override public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException, IOException, ServletException { String phoneNumber = request.getParameter("phoneNumber"); String code = request.getParameter("code"); SmsCodeAuthenticationToken token = new SmsCodeAuthenticationToken(phoneNumber); token.setDetails(code); return getAuthenticationManager().authenticate(token); } } ``` --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值