代码实现基于SSM短信验证码
时间: 2024-01-26 08:06:38 浏览: 35
以下是基于SSM框架实现短信验证码的代码示例:
1. 在web.xml文件中配置DispatcherServlet
```xml
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
```
2. 在springmvc.xml文件中配置拦截器和短信验证码服务bean
```xml
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/sendSmsCode"/>
<bean class="com.example.interceptor.SmsCodeInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
<!-- 配置短信验证码服务bean -->
<bean id="smsCodeService" class="com.example.service.impl.SmsCodeServiceImpl">
<property name="smsTemplate" value="您的验证码为${code},有效期为10分钟。"/>
<property name="smsSender" ref="aliyunSmsSender"/>
</bean>
<bean id="aliyunSmsSender" class="com.example.sms.AliyunSmsSender">
<property name="accessKeyId" value="your_access_key_id"/>
<property name="accessKeySecret" value="your_access_key_secret"/>
<property name="signName" value="your_sign_name"/>
</bean>
```
3. 编写拦截器SmsCodeInterceptor
```java
public class SmsCodeInterceptor extends HandlerInterceptorAdapter {
private static final String SMS_CODE = "smsCode";
@Autowired
private SmsCodeService smsCodeService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String phoneNumber = request.getParameter("phoneNumber");
if (StringUtils.isEmpty(phoneNumber)) {
throw new IllegalArgumentException("手机号不能为空");
}
String smsCode = request.getParameter(SMS_CODE);
if (StringUtils.isEmpty(smsCode)) {
throw new IllegalArgumentException("验证码不能为空");
}
if (!smsCodeService.verifyCode(phoneNumber, smsCode)) {
throw new IllegalArgumentException("验证码错误或已过期");
}
return true;
}
}
```
4. 编写短信验证码服务接口SmsCodeService和实现类SmsCodeServiceImpl
```java
public interface SmsCodeService {
/**
* 发送验证码
* @param phoneNumber 手机号
* @return 验证码
*/
String sendCode(String phoneNumber);
/**
* 校验验证码
* @param phoneNumber 手机号
* @param code 验证码
* @return 校验结果
*/
boolean verifyCode(String phoneNumber, String code);
}
@Service
public class SmsCodeServiceImpl implements SmsCodeService {
@Autowired
private SmsSender smsSender;
@Value("${sms.code.expiration}")
private int expiration; // 验证码有效期,单位为秒
@Value("${sms.code.length}")
private int length; // 验证码长度
@Value("${sms.template}")
private String smsTemplate; // 短信模板
private Map<String, String> codeMap = new ConcurrentHashMap<>();
@Override
public String sendCode(String phoneNumber) {
// 生成随机验证码
String code = RandomStringUtils.randomNumeric(length);
// 发送短信
smsSender.sendSms(phoneNumber, MessageFormat.format(smsTemplate, code));
// 将验证码放入缓存
codeMap.put(phoneNumber, code);
return code;
}
@Override
public boolean verifyCode(String phoneNumber, String code) {
String cachedCode = codeMap.get(phoneNumber);
if (StringUtils.isEmpty(cachedCode)) {
return false;
}
if (!cachedCode.equals(code)) {
return false;
}
// 验证码有效期为10分钟
long timestamp = Long.parseLong(phoneNumber);
if (System.currentTimeMillis() - timestamp > expiration * 1000) {
return false;
}
codeMap.remove(phoneNumber);
return true;
}
}
```
5. 编写短信发送器SmsSender和阿里云短信发送器AliyunSmsSender
```java
public interface SmsSender {
/**
* 发送短信
* @param phoneNumber 手机号
* @param message 短信内容
*/
void sendSms(String phoneNumber, String message);
}
public class AliyunSmsSender implements SmsSender {
private static final String ENDPOINT = "https://dysmsapi.aliyuncs.com";
private static final String VERSION = "2017-05-25";
private String accessKeyId;
private String accessKeySecret;
private String signName;
public AliyunSmsSender(String accessKeyId, String accessKeySecret, String signName) {
this.accessKeyId = accessKeyId;
this.accessKeySecret = accessKeySecret;
this.signName = signName;
}
@Override
public void sendSms(String phoneNumber, String message) {
try {
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", "Dysmsapi", ENDPOINT);
IAcsClient client = new DefaultAcsClient(profile);
SendSmsRequest request = new SendSmsRequest();
request.setPhoneNumbers(phoneNumber);
request.setSignName(signName);
request.setTemplateCode("your_template_code"); // 短信模板ID
request.setTemplateParam("{\"code\":\"" + message + "\"}");
client.getCommonRequest().setMethod(MethodType.POST);
client.getCommonRequest().setProtocol(ProtocolType.HTTPS);
client.getCommonRequest().setDomain(ENDPOINT);
client.getCommonRequest().setVersion(VERSION);
client.getCommonRequest().setAction("SendSms");
client.getCommonRequest().putQueryParameter("PhoneNumbers", request.getPhoneNumbers());
client.getCommonRequest().putQueryParameter("SignName", request.getSignName());
client.getCommonRequest().putQueryParameter("TemplateCode", request.getTemplateCode());
client.getCommonRequest().putQueryParameter("TemplateParam", request.getTemplateParam());
client.getCommonResponse();
} catch (Exception e) {
e.printStackTrace();
}
}
}
```
以上就是基于SSM框架实现短信验证码的代码示例。需要注意的是,代码中的一些配置参数需要根据实际情况进行修改。