发送短信验证码,并存于redis,设置过期时间

框架:spring boot

短信服务:阿里云服务

 

用阿里云短信服务,需要在pom文件中引入两个jar包:


    com.aliyun
    aliyun-java-sdk-core
    4.0.6


    com.aliyun
    aliyun-java-sdk-dysmsapi
    1.1.0

 

阿里云官方demo中有java发送短信的示例,可以直接用,写一个随机生成验证码就成:

public class SmsDemo {

    // 产品名称:云通信短信API产品,开发者无需替换
    static final String product = "Dysmsapi";
    // 产品域名,开发者无需替换
    static final String domain = "dysmsapi.aliyuncs.com";
    // TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
    static final String accessKeyId = "";           // TODO 改这里
    static final String accessKeySecret = ""; // TODO 改这里
    public static SendSmsResponse sendSms(String telephone, String code) throws ClientException {
        // 可自助调整超时时间
        System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
        System.setProperty("sun.net.client.defaultReadTimeout", "10000");
        // 初始化acsClient,暂不支持region化
        IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
        DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
        IAcsClient acsClient = new DefaultAcsClient(profile);
        // 组装请求对象-具体描述见控制台-文档部分内容
        SendSmsRequest request = new SendSmsRequest();
        // 必填:待发送手机号
        request.setPhoneNumbers(telephone);
        // 必填:短信签名-可在短信控制台中找到
        request.setSignName(""); // TODO 改这里
        // 必填:短信模板-可在短信控制台中找到
        request.setTemplateCode("");  // TODO 改这里
        // 可选:模板中的变量替换JSON串,如模板内容为"亲爱的用户,您的验证码为${code}"时,此处的值为
        request.setTemplateParam("{\"code\":\"" + code + "\"}");

        // 选填-上行短信扩展码(无特殊需求用户请忽略此字段)
        // request.setSmsUpExtendCode("90997");

        // 可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
        request.setOutId("yourOutId");

        // hint 此处可能会抛出异常,注意catch
        SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
        if(sendSmsResponse.getCode()!= null && sendSmsResponse.getCode().equals("OK")){
            System.out.println("短信发送成功!");
        }else {
            System.out.println("短信发送失败!");
        }
        return sendSmsResponse;
    }

    //以下为测试代码,随机生成验证码
    private static int newcode;
    public static int getNewcode() {
        return newcode;
    }
    public static void setNewcode(){
        newcode = (int)(Math.random()*9999)+100;  //每次调用生成一次四位数的随机数
    }
    public static void main(String[] args) throws Exception {
        setNewcode();
        String code = Integer.toString(getNewcode());
        SendSmsResponse sendSms =sendSms("xxxxxxxxxxx",code);//填写你需要测试的手机号码
        System.out.println("短信接口返回的数据----------------");
        System.out.println("Code=" + sendSms.getCode());
        System.out.println("Message=" + sendSms.getMessage());
        System.out.println("RequestId=" + sendSms.getRequestId());
        System.out.println("BizId=" + sendSms.getBizId());

    }
}

 

通过main方法测试,可以发送成功。接下来便是和java后台交互起来。

发送的验证码不能存于session,会被伪造。存于数据库过于累赘,思前想后只有redis

这里将手机号作为key,验证码作为value,存的时候设定一下过期时间。

 

 

spring boot2.X版本以上整合redis

pom文件里加入jar包和fastjson,后面序列化的时候会用到


        
            org.springframework.boot
            spring-boot-starter-data-redis
        

        
        
            com.alibaba
            fastjson
            1.2.47
        

 

一个足矣,因为它自己有关联。

配置文件:application.properties

 

# REDIS (RedisProperties)
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=127.0.0.1
# Redis服务器连接端口
spring.redis.port=6379
spring.redis.password=
# 连接超时时间(毫秒)
spring.redis.timeout=2000

 

redis序列化工具类RedisConfig:

@Configuration
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
public class RedisConfig {
    @Bean("redisTemplate")
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate template = new RedisTemplate<>();
        //使用fastjson序列化
        FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer(Object.class);
        // value值的序列化采用fastJsonRedisSerializer
        template.setValueSerializer(fastJsonRedisSerializer);
        template.setHashValueSerializer(fastJsonRedisSerializer);
        // key的序列化采用StringRedisSerializer
        template.setKeySerializer(new StringRedisSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());

        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }

    @Bean

    @ConditionalOnMissingBean(StringRedisTemplate.class)
    public StringRedisTemplate stringRedisTemplate(
            RedisConnectionFactory redisConnectionFactory) {
        StringRedisTemplate template = new StringRedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }

}

页面代码和js代码就不贴出来了,贴出来控制层的一些相关代码吧:

@Autowired
@Qualifier("redisTemplate")
//实例化
private RedisTemplate rts;

/**
 * 发送短信验证码
 * @param username
 * @return
 * @throws Exception
 */
@RequestMapping("/getCode")
@ResponseBody
public String getCode(String username)throws Exception{
    //rts.opsForValue().set("17730223870",123456);
    System.out.println("phone=" + username);
    SmsDemo smsDemo = new SmsDemo();
    smsDemo.setNewcode();
    String code = Integer.toString(smsDemo.getNewcode());
    SendSmsResponse sendSms = smsDemo.sendSms(username, code);//填写你需要测试的手机号码
    //将手机号和验证码存入redis,生存时间为5分钟
    rts.opsForValue().set(username,code,5,TimeUnit.MINUTES);
    System.out.println("短信接口返回的数据----------------");
    System.out.println("Code=" + sendSms.getCode());
    System.out.println("Message=" + sendSms.getMessage());
    System.out.println("RequestId=" + sendSms.getRequestId());
    System.out.println("BizId=" + sendSms.getBizId());
    return sendSms.getCode();
}


/**
 * 检测短信验证码是否相同  登陆
 * @param username
 * @param pcode
 * @param session
 * @return
 * @throws Exception
 */
@RequestMapping("/plogin")
@ResponseBody
public Object plogin(String username, String pcode, HttpSession session) throws Exception {
    System.out.println("username=" + username + ";pcode=" + pcode);
    try{
        Object code=rts.opsForValue().get(username);
        if (code.equals(pcode)) {
            User user = userService.findByPhone(username);
            session.setAttribute("user", user);
            return user;
        } else {
            return false;
        }
    }catch (Exception e){
        e.printStackTrace();
    }
    return false;
}

 

你可能感兴趣的:(发送短信验证码,并存于redis,设置过期时间)