(十)、SpringBoot+Security 发送短信验证码

可以前往第一篇博客查看目录结构 --> 这里

一、在core模块下properties包中创建SmsCodeProperties

public class SmsCodeProperties {

    //短信验证码长度
    private int length = 6;
    //验证码过期时间
    private int expireIn = 60;
    private String url;

    public int getLength() {
        return length;
    }

    public void setLength(int length) {
        this.length = length;
    }

    public int getExpireIn() {
        return expireIn;
    }

    public void setExpireIn(int expireIn) {
        this.expireIn = expireIn;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }
}

二、在ValidateCodeProperties中new一个SmsCodeProperties对象,并实现getter、setter方法

public class ValidateCodeProperties {

    private ImageCodeProperties image = new ImageCodeProperties();

    private SmsCodeProperties sms = new SmsCodeProperties();

    public SmsCodeProperties getSms() {
        return sms;
    }

    public void setSms(SmsCodeProperties sms) {
        this.sms = sms;
    }

    public ImageCodeProperties getImage() {
        return image;
    }

    public void setImage(ImageCodeProperties image) {
        this.image = image;
    }
}

三、在core模块下validate包中创建SmsCodeGenerator实现ValidateCodeGenerator接口。

@Component
public class SmsCodeGenerator implements ValidateCodeGenerator {

    @Autowired private SecurityProperties securityProperties;

    /**
     * 生成短信验证码
     * @param request
     * @return
     */
    @Override
    public ValidateCode generator(ServletWebRequest request) {

        Random random = new Random();
        String sRand = "";
        for (int i = 0; i < securityProperties.getCode().getSms().getLength(); i++){
            String rand = String.valueOf(random.nextInt(10));
            sRand += rand;
        }
        return new ValidateCode(sRand, securityProperties.getCode().getSms().getExpireIn());
    }
}

四、创建SmsCodeSender接口,定义发送短信的抽象方法

public interface SmsCodeSender {

    void send(String mobile , String code);
}

五、创建SmsCodeSenderImpl实现SmsCodeSender接口

public class SmsCodeSenderImpl implements SmsCodeSender {

    @Override
    public void send(String mobile, String code) {
        System.out.println("向手机" + mobile + ",发送短信验证码" + code);
    }

}

六、在ValidateCodeBeanConfig中把SmsCodeSenderImpl注入到容器中

    @Bean
    @ConditionalOnMissingBean(name = "smsCodeSender")
    public SmsCodeSender smsCodeSender(){
        return new SmsCodeSenderImpl();
    }

七、在ValidateCodeController中创建短信验证接口方法,同时@Autowired进去两个接口

    @Autowired
    private ValidateCodeGenerator smsCodeGenerator;

    @Autowired
    private SmsCodeSender smsCodeSender;
    /**
     * 短信验证码生成、保存、发送
     * @param request
     * @param response
     * @throws ServletRequestBindingException
     */
    @GetMapping("/code/sms")
    public void createSmsCode(HttpServletRequest request, HttpServletResponse response) throws ServletRequestBindingException {
        //生成短信验证码
        ValidateCode generator = smsCodeGenerator.generator(new ServletWebRequest(request));
        //把短信验证码保存到session中
        sessionStrategy.setAttribute(new ServletWebRequest(request),SESSION_KEY,generator);
        //获取表单提交的手机号码
        String mobile = ServletRequestUtils.getRequiredStringParameter(request, "mobile");
        //通过短信供应商写出去
        smsCodeSender.send(mobile,generator.getCode());
    }

八、在browser模块的resources -> zeke-login.html中创建短信验证登录的表单

    <br>
    <br>
    <h3>短信验证登录</h3>
    <form action="/authentication/mobile" method="post">
        <table>
            <tr>
                <td>手机号:</td>
                <td><input type="text" name="mobile" value="13544020124"/></td>
            </tr>
            <tr>
                <td>短信验证码:</td>
                <td><input type="text" name="smsCode"/></td>
                <a href="/code/sms?mobile=13544020124">发送验证码</a>
            </tr>
            <tr>
                <td colspan="2"><button type="submit">登录</button></td>
            </tr>
        </table>
    </form>

九、在browser模块下BrowserSecurityConfig添加/code/sms到.antMatchers中


十、访问localhost/zeke-login.html,点击发送验证码,查看console打印的信息

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值