版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010363836/article/details/49783377
注册发送手机验证码:
@RequestMapping(value = "/register/sendCode", method = RequestMethod.POST)
public ResponseEntity<AjaxPostResponse> sendCode(HttpServletRequest request, HttpServletResponse response) {
String schoolId = this.getSchoolId(request);
String mobile = ServletRequestUtils.getStringParameter(request, "mobile", "").trim();
if (StringUtils.isBlank(mobile)) {
return this.errorResponse("手机号不能为空");
}
Pattern p = Pattern.compile("^((13[0-9])|(15[^4,\\D])|(18[0-9]))\\d{8}$");
Matcher m = p.matcher(mobile);
if (false == m.matches()) {
return this.errorResponse("手机号格式不正确");
}
User user = userManager.getUserByMobile(schoolId, mobile);
if (null != user) {
return this.errorResponse("该手机号已注册");
}
School school = schoolManager.getSchool(schoolId);
SchoolSettings schoolSettings = school.getSchoolSettingsBean();
Integer sendTime = 0; // 预防短信轰炸
sendTime = memcachedClient.get("mobileCode_" + mobile) == null ? 0 : (Integer) memcachedClient.get("mobileCode_" + mobile);
if (0 == sendTime) {
memcachedClient.add("mobileCode_" + mobile, 30 * 60, sendTime); // 30 minutes
}
if (5 < sendTime) {
return this.errorResponse("获取验证码次数过多");
}
if (YesNoStatus.YES.getValue().equals(schoolSettings.getRegisterSetting())) {
String serviceURL = schoolSettings.getActivationMobileUrl();
String sn = schoolSettings.getActivationMobileSn();
String password = schoolSettings.getActivationMobilePassword();
String content = schoolSettings.getActivationMobileContent();
String code = PrimaryKeyUtils.generateRandomKey().substring(0, 4);
request.getSession().setAttribute("mobile_code"+mobile, code);
content = content.replaceAll("\\$\\{schoolName\\}", school.getName());
content = content.replaceAll("\\$\\{mobile\\}", mobile);
content = content.replaceAll("\\$\\{verificationCode\\}", code);
try {
MobileServerUtils.sendMobileCode(mobile, serviceURL, sn, password, content);
} catch (UnsupportedEncodingException e) {
logger.info("RegisterController UnsupportedEncodingException", e);
}
// 把请求验证码次数存储到MemCached中
try {
String key = "mobileCode_" + mobile;
sendTime++;
memcachedClient.replace(key, 30 * 60, sendTime); // 30 minutes
} catch (Exception e) {
logger.warn("把用户信息保存在Memcached中时发生异常,Cause: ", e);
}
return this.okResponse(true);
}
return this.errorResponse("暂不开放注册");
}
发送手机验证码的处理类:
package com.school.util;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 手机验证码工具类
* @author FeiFan Lin
*/
public class MobileServerUtils {
private static final Logger LOG = LoggerFactory.getLogger(MobileServerUtils.class);
private String serviceURL = "";
private String sn = ""; // 序列号
private String password = "";
private String pwd = "";// 密码
/*
* 构造函数
*/
private MobileServerUtils(String serviceURL, String sn, String password) throws UnsupportedEncodingException {
this.serviceURL = serviceURL;
this.sn = sn;
this.password = password;
// 密码为md5(sn+password)
this.pwd = this.getMD5(sn + password);
}
/**
* 发送验证码到手机
* @param mobile 手机号
* @param serviceURL 手机平台服务器地址
* @param sn 序列号
* @param password 密码
* @param content 内容
* @return 唯一标识
* @throws UnsupportedEncodingException
*/
public static String sendMobileCode(String mobile, String serviceURL, String sn, String password, String content) throws UnsupportedEncodingException {
MobileServerUtils ms = new MobileServerUtils(serviceURL, sn, password);
content = URLEncoder.encode(content, "utf8");
String result_mt = ms.mdsmssend(mobile, content, "", "", "", "");
return result_mt;
}
/*
* 方法名称:getMD5
* 功 能:字符串MD5加密
* 参 数:待转换字符串
* 返 回 值:加密之后字符串
*/
private String getMD5(String sourceStr) throws UnsupportedEncodingException {
String resultStr = "";
try {
byte[] temp = sourceStr.getBytes();
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(temp);
// resultStr = new String(md5.digest());
byte[] b = md5.digest();
for (int i = 0; i < b.length; i++) {
char[] digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8',
'9', 'A', 'B', 'C', 'D', 'E', 'F' };
char[] ob = new char[2];
ob[0] = digit[(b[i] >>> 4) & 0X0F];
ob[1] = digit[b[i] & 0X0F];
resultStr += new String(ob);
}
return resultStr;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
}
/*
* 方法名称:mdgetSninfo
* 功 能:获取信息
* 参 数:sn,pwd(软件序列号,加密密码md5(sn+password))
*
*/
private String mdgetSninfo() {
String result = "";
String soapAction = "http://entinfo.cn/mdgetSninfo";
String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
xml += "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">";
xml += "<soap:Body>";
xml += "<mdgetSninfo xmlns=\"http://entinfo.cn/\">";
xml += "<sn>" + sn + "</sn>";
xml += "<pwd>" + pwd + "</pwd>";
xml += "</mdgetSninfo>";
xml += "</soap:Body>";
xml += "</soap:Envelope>";
URL url;
try {
url = new URL(serviceURL);
URLConnection connection = url.openConnection();
HttpURLConnection httpconn = (HttpURLConnection) connection;
ByteArrayOutputStream bout = new ByteArrayOutputStream();
bout.write(xml.getBytes());
byte[] b = bout.toByteArray();
httpconn.setRequestProperty("Content-Length", String
.valueOf(b.length));
httpconn.setRequestProperty("Content-Type",
"text/xml; charset=gb2312");
httpconn.setRequestProperty("SOAPAction", soapAction);
httpconn.setRequestMethod("POST");
httpconn.setDoInput(true);
httpconn.setDoOutput(true);
OutputStream out = httpconn.getOutputStream();
out.write(b);
out.close();
InputStreamReader isr = new InputStreamReader(httpconn
.getInputStream());
BufferedReader in = new BufferedReader(isr);
String inputLine;
while (null != (inputLine = in.readLine())) {
Pattern pattern = Pattern.compile("<mdgetSninfoResult>(.*)</mdgetSninfoResult>");
Matcher matcher = pattern.matcher(inputLine);
while (matcher.find()) {
result = matcher.group(1);
}
}
return result;
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
/*
* 方法名称:mdgxsend
* 功 能:发送个性短信
* 参 数:mobile,content,ext,stime,rrid,msgfmt(手机号,内容,扩展码,定时时间,唯一标识,内容编码)
* 返 回 值:唯一标识,如果不填写rrid将返回系统生成的
*/
private String mdgxsend(String mobile, String content, String ext, String stime,
String rrid, String msgfmt) {
String result = "";
String soapAction = "http://entinfo.cn/mdgxsend";
String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
xml += "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">";
xml += "<soap:Body>";
xml += "<mdgxsend xmlns=\"http://entinfo.cn/\">";
xml += "<sn>" + sn + "</sn>";
xml += "<pwd>" + pwd + "</pwd>";
xml += "<mobile>" + mobile + "</mobile>";
xml += "<content>" + content + "</content>";
xml += "<ext>" + ext + "</ext>";
xml += "<stime>" + stime + "</stime>";
xml += "<rrid>" + rrid + "</rrid>";
xml += "<msgfmt>" + msgfmt + "</msgfmt>";
xml += "</mdgxsend>";
xml += "</soap:Body>";
xml += "</soap:Envelope>";
URL url;
try {
url = new URL(serviceURL);
URLConnection connection = url.openConnection();
HttpURLConnection httpconn = (HttpURLConnection) connection;
ByteArrayOutputStream bout = new ByteArrayOutputStream();
bout.write(xml.getBytes());
byte[] b = bout.toByteArray();
httpconn.setRequestProperty("Content-Length", String
.valueOf(b.length));
httpconn.setRequestProperty("Content-Type",
"text/xml; charset=gb2312");
httpconn.setRequestProperty("SOAPAction", soapAction);
httpconn.setRequestMethod("POST");
httpconn.setDoInput(true);
httpconn.setDoOutput(true);
OutputStream out = httpconn.getOutputStream();
out.write(b);
out.close();
InputStreamReader isr = new InputStreamReader(httpconn
.getInputStream());
BufferedReader in = new BufferedReader(isr);
String inputLine;
while (null != (inputLine = in.readLine())) {
Pattern pattern = Pattern.compile("<mdgxsendResult>(.*)</mdgxsendResult>");
Matcher matcher = pattern.matcher(inputLine);
while (matcher.find()) {
result = matcher.group(1);
}
}
return result;
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
/**
* 方法名称:mdsmssend
* 功 能:发送短信
* @param mobile 手机号
* @param content 内容
* @param ext 扩展码
* @param stime 定时时间
* @param rrid 唯一标识
* @param msgfmt 内容编码
* @return 唯一标识,如果不填写rrid将返回系统生成的
*/
private String mdsmssend(String mobile, String content, String ext, String stime,
String rrid,String msgfmt) {
String result = "";
String soapAction = "http://entinfo.cn/mdsmssend";
String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
xml += "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">";
xml += "<soap:Body>";
xml += "<mdsmssend xmlns=\"http://entinfo.cn/\">";
xml += "<sn>" + sn + "</sn>";
xml += "<pwd>" + pwd + "</pwd>";
xml += "<mobile>" + mobile + "</mobile>";
xml += "<content>" + content + "</content>";
xml += "<ext>" + ext + "</ext>";
xml += "<stime>" + stime + "</stime>";
xml += "<rrid>" + rrid + "</rrid>";
xml += "<msgfmt>" + msgfmt + "</msgfmt>";
xml += "</mdsmssend>";
xml += "</soap:Body>";
xml += "</soap:Envelope>";
URL url;
try {
url = new URL(serviceURL);
URLConnection connection = url.openConnection();
HttpURLConnection httpconn = (HttpURLConnection) connection;
ByteArrayOutputStream bout = new ByteArrayOutputStream();
//bout.write(xml.getBytes());
bout.write(xml.getBytes("GBK"));
byte[] b = bout.toByteArray();
httpconn.setRequestProperty("Content-Length", String
.valueOf(b.length));
httpconn.setRequestProperty("Content-Type",
"text/xml; charset=gb2312");
httpconn.setRequestProperty("SOAPAction", soapAction);
httpconn.setRequestMethod("POST");
httpconn.setDoInput(true);
httpconn.setDoOutput(true);
OutputStream out = httpconn.getOutputStream();
out.write(b);
out.close();
InputStreamReader isr = new InputStreamReader(httpconn
.getInputStream());
BufferedReader in = new BufferedReader(isr);
String inputLine;
while (null != (inputLine = in.readLine())) {
Pattern pattern = Pattern.compile("<mdsmssendResult>(.*)</mdsmssendResult>");
Matcher matcher = pattern.matcher(inputLine);
while (matcher.find()) {
result = matcher.group(1);
}
}
return result;
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
}
跟通信运营商开通发短信服务:
会有
"activationMobilePassword": 密码--通信运营商提供的
"activationMobileSn": 序列号--通信运营商提供的
"activationMobileUrl": 短信服务接口---通信运营商提供的
下面的是自己编辑的 短信的内容:验证码、
"activationMobileContent":"${verificationCode} (${schoolName}注册验证码,五分钟内有效)【${schoolName}】",
"forgotPasswordTitle":"${nickname},请重置您${schoolName}的登录密码",
"forgotPasswordContent":"Hi, ${nickname} \r