手机号验证码

本文介绍了手机短信验证码的使用场景、发送流程及其在身份验证中的重要作用。详细讲解了如何通过手机号获取验证码,并阐述了验证码的安全性和时效性要求。

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

<p >

<label><em>*</em>手机号 </label>

  <span><input type="text" id="phone" name="phone" class="text" value="" maxlength="50" datatype="phone"  placeholder="请输入您的手机号" nullmsg="请输入您的手机号"  errormsg="手机格式不正确"/></span>
</p>

<p>

<label><em>*</em> 短信验证码 </label>

    <span>
       <input id="mesNum" name="mesNum" type="text" class="text w270" datatype="*" nullmes="请填写短信验证码"  placeholder="请输入短信验证码" />
         <button class="verifyCode" id="verifyCode">获取短信验证码</button>
    </span>
</p>


//短信验证码

var countdown=60; 
var interval;
$("#verifyCode").click(function(){
var thisbtn=$(this);
var phone=$("#phone").val();
$.ecp.remoteService.ajax4Bean({
beanId: "com.cloud.login.service.impl.CustomerAuthRS.queryPhoneMsgCode()",
data: {
phone:phone ,
},
success: function(resdata, textStatus, jqXHRult){
if(phone==""||phone==null||phone==undefined){new UINotify("请输入手机号 ").show();}
else if(!/^1\d{10}$/.test(phone)){new UINotify("手机号格式不正确").show();}
else{
if(JSON.parse(resdata.resultObj)['retCode']=="000000"){
new UINotify("短信发送成功,请注意查收").show();
interval=setInterval(function() {    
    settime(); }   
    ,1000);
             }
else{//手机接收验证码达上限
new UINotify(JSON.parse(resdata.resultObj)['retDesc']).show();
}
    }
}
});
  
})


function settime() { 
    if(countdown == 0) { 
     $("#verifyCode").removeAttr("disabled").css("background-color","#f5f5f5").html("短信验证码"); 
        countdown = 60; 
        clearInterval(interval); 
    } else { 
    $("#verifyCode").attr("disabled","disabled").css("background-color","#b3b3b3").html("重新发送" + countdown +'s'); 
        countdown--; 
    } 
        }
### 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); } } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值