1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Java用户注册服务器发送短信验证码功能实现

Java用户注册服务器发送短信验证码功能实现

时间:2018-08-25 15:21:55

相关推荐

Java用户注册服务器发送短信验证码功能实现

<–start–>

当客户端发送了http的请求给服务器之后,服务器获取手机号然后调用短信平台给该手机号发送短信验证码。

给服务器发送请求的js代码:

<script type="text/javascript">// 模块定义 var signupApp = angular.module("signupApp", []);// 控制器定义signupApp.controller("signupCtrl", ["$scope","$http",function($scope,$http) {$scope.btnMsg = "发送验证码";var active = true;var second = 60; // 倒计时60秒var secondInterval;$scope.getCheckCode = function(telephone) {if(active == false) {return;}// 1 发送一个HTTP请求,通知服务器 发送短信给目标用户 var regex = /^1(3|5|7|8)\d{9}$/;if(regex.test(telephone)) {// 校验通过$http({method: 'GET',url: 'customer_sendSms.action',params : {telephone : telephone}}).error(function(data, status, headers, config) {// 当响应以错误状态返回时调用alert("发送短信出错,请联系管理员");});} else {// 校验失败 alert("手机号非法,请重新输入 ");return;}</script>

在服务器端程序中的web.xml文件中要配置以下内容:

① struts2的核心拦截器StrutsPreparedAndExecuteFilter;

② spring的核心配置文件applicationContext.xml所在位置的classpath;

③ spring的核心监听器ContextLoaderListener。

完整的web.xml文件内容:

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="/2001/XMLSchema-instance"xmlns="/xml/ns/javaee"xsi:schemaLocation="/xml/ns/javaee /xml/ns/javaee/web-app_2_5.xsd"id="WebApp_ID" version="2.5"><!-- spring配置文件位置 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></context-param><!-- spring核心监听器 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- struts核心控制器 --><filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern><dispatcher>REQUEST</dispatcher><dispatcher>FORWARD</dispatcher></filter-mapping><welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>index.jsp</welcome-file><welcome-file>default.html</welcome-file><welcome-file>default.htm</welcome-file><welcome-file>default.jsp</welcome-file></welcome-file-list></web-app>

接下来在服务器端编写CustomerAction代码,获取传递过来的手机号码参数,然后给该手机号码发送短信。 鉴于大量Action的代码比如模型驱动接收参数,压入值栈等都是重复性的操作,所以有必要将这些代码抽取成一个类,让其他的子类Action去继承。BaseAction父类的代码如下:

public abstract class BaseAction<T> extends ActionSupport implementsModelDriven<T> {// 模型驱动protected T model;@Overridepublic T getModel() {return model;}// 构造器 完成model实例化public BaseAction() {// 构造子类Action对象 ,获取继承父类型的泛型Type genericSuperclass = this.getClass().getGenericSuperclass();// 获取类型第一个泛型参数ParameterizedType parameterizedType = (ParameterizedType) genericSuperclass;Class<T> modelClass = (Class<T>) parameterizedType.getActualTypeArguments()[0];try {model = modelClass.newInstance();} catch (InstantiationException | IllegalAccessException e) {e.printStackTrace();System.out.println("模型构造失败...");}}}

创建CustomerAction类,在类上添加相关的注解:

① struts2的注解:@ParentPackage(“json-default”),@Namespace(“/”);

② spring的注解:@Controller,@Scope(“prototype”)

@ParentPackage("json-default")@Namespace("/")@Controller@Scope("prototype")public class CustomerAction extends BaseAction<Customer> {}

在本例中要使用到webservice的技术,CustomerAction要远程调用crm系统中crm_domain工程中的数据,因此要在CustomerAction所在项目中添加对crm_domain的依赖,具体要在pom.xml文件中实现。

<dependency><groupId>cn.niwotaxuexiba.maven</groupId><artifactId>crm_domain</artifactId><version>0.0.1-SNAPSHOT</version></dependency>

完整的pom.xml文件内容:

<project xmlns="/POM/4.0.0" xmlns:xsi="/2001/XMLSchema-instance" xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>cn.niwotaxuexiba.maven</groupId><artifactId>common_parent</artifactId><version>0.0.1-SNAPSHOT</version></parent> <artifactId>bos_fore</artifactId><packaging>war</packaging><name>bos_fore</name><description>物流前端系统</description><build><plugins><plugin><groupId>org.codehaus.mojo</groupId><artifactId>tomcat-maven-plugin</artifactId><version>1.1</version><configuration><port>9003</port></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.3.2</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins></build><dependencies><dependency><groupId>cn.niwotaxuexiba.maven</groupId><artifactId>crm_domain</artifactId><version>0.0.1-SNAPSHOT</version></dependency></dependencies></project>

在CustomerAction类中,编写一个sendSms的方法:

① 需要获取的手机号保存在Customer对象中,所以要用到webservice技术;

② 生成一个随机短信验证码,用到的是mons.lang包下的RandomStringUtils类来生成随机验证码;

③ 将生成的短信验证码保存到session中,调用struts2的ServletActionContext获取request对象,然后存入session.保存到session的方法ServletActionContext.getRequest().setAttribute(model.getTelephone(),randomCode);

④ 生成要发送的短信正文内容,其实就是生成一个字符串;

⑤ 调用SMS服务发送短信(发送短信的工具类SmsUtils已经在下面提供);

⑥ 发送短信的途径有http和webservice两种,http的方式将返回000,webservice将返回16位的一个字符串,本例中使用http的方式。

完整的CustomerAction代码如下:

@ParentPackage("json-default")@Namespace("/")@Controller@Scope("prototype")public class CustomerAction2 extends BaseAction<Customer> {@Action(value="customer_sendSms")public String sendSms() throws IOException{//生成短信验证码String randomCode = RandomStringUtils.randomNumeric(4);//将短信验证码保存到session中ServletActionContext.getRequest().getSession().setAttribute(model.getTelephone(),randomCode);//编辑短信内容String msg = "你好!本次获取的验证码位:"+randomCode;//调用SMS服务发送短信String result = SmsUtils.sendSmsByHTTP(model.getTelephone(),msg);if(result.startsWith("000")){//以"000"开头表示短信发送成功return NONE;}else{//发送失败,就抛出一个运行期异常throw new RuntimeException("短信发送失败,信息码:"+result);}}}

发短信的SmsUtils工具类完整代码如下:

/*** 调用吉信通 发短信工具类* * @author niwotaxuexiba**/public class SmsUtils {private static String userid = "seawind";private static String pass = "niwotaxuexiba123456";/*** 调用HTTP 协议方式发送短信* * @param mobile* @param content* @return* @throws UnsupportedEncodingException*/public static String sendSmsByHTTP(String mobile, String content)throws UnsupportedEncodingException {HttpURLConnection httpconn = null;String result = "Error";StringBuilder sb = new StringBuilder();sb.append(":8009/sys_port/gateway/index.asp?");// 以下是参数sb.append("id=").append(URLEncoder.encode(userid, "gb2312"));sb.append("&pwd=").append(pass);sb.append("&to=").append(mobile);sb.append("&content=").append(URLEncoder.encode(content, "gb2312"));sb.append("&time=").append("");try {URL url = new URL(sb.toString());httpconn = (HttpURLConnection) url.openConnection();BufferedReader rd = new BufferedReader(new InputStreamReader(httpconn.getInputStream()));result = rd.readLine();rd.close();} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if (httpconn != null) {httpconn.disconnect();httpconn = null;}}return result;}/*** 调用 WebService 协议方式发送短信* * @param mobiles* @param msg* @return*/public static String sendSmsByWebService(String mobiles, String msg) {String result = "-12";try {Document doc;DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();dbf.setNamespaceAware(true);DocumentBuilder db = dbf.newDocumentBuilder();InputStream is = getSoapInputStream(userid, pass, mobiles, msg, "");if (is != null) {doc = db.parse(is);NodeList nl = doc.getElementsByTagName("SendMessagesResult");Node n = nl.item(0);result = n.getFirstChild().getNodeValue();is.close();}return result;} catch (Exception e) {System.out.print("SmsSoap.sendSms error:" + e.getMessage());return "-12";}}private static String getSoapSmssend(String userid, String pass,String mobiles, String msg, String time) {try {String soap = "";soap = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"+ "<soap:Envelope xmlns:xsi=\"/2001/XMLSchema-instance\" xmlns:xsd=\"/2001/XMLSchema\" xmlns:soap=\"/soap/envelope/\">"+ "<soap:Body>"+ "<SendMessages xmlns=\"/\">" + "<uid>"+ userid + "</uid>" + "<pwd>" + pass + "</pwd>" + "<tos>"+ mobiles + "</tos>" + "<msg>" + msg + "</msg>" + "<otime>"+ time + "</otime>" + "</SendMessages>" + "</soap:Body>"+ "</soap:Envelope>";return soap;} catch (Exception ex) {ex.printStackTrace();return null;}}private static InputStream getSoapInputStream(String userid, String pass,String mobiles, String msg, String time) throws Exception {URLConnection conn = null;InputStream is = null;try {String soap = getSoapSmssend(userid, pass, mobiles, msg, time);if (soap == null) {return null;}try {URL url = new URL(":8003/Service.asmx");conn = url.openConnection();conn.setUseCaches(false);conn.setDoInput(true);conn.setDoOutput(true);conn.setRequestProperty("Content-Length",Integer.toString(soap.length()));conn.setRequestProperty("Content-Type","text/xml; charset=utf-8");conn.setRequestProperty("HOST", "");conn.setRequestProperty("SOAPAction","\"/SendMessages\"");OutputStream os = conn.getOutputStream();OutputStreamWriter osw = new OutputStreamWriter(os, "utf-8");osw.write(soap);osw.flush();} catch (Exception ex) {System.out.print("SmsSoap.openUrl error:" + ex.getMessage());}try {is = conn.getInputStream();} catch (Exception ex1) {System.out.print("SmsSoap.getUrl error:" + ex1.getMessage());}return is;} catch (Exception e) {System.out.print("SmsSoap.InputStream error:" + e.getMessage());return null;}}public static void main(String[] args) throws IOException {String randomCode = RandomStringUtils.randomNumeric(4);System.out.println(sendSmsByWebService("xxx", "尊敬的用户您好,本次获取的验证码为:"+ randomCode + ",服务电话:4001234567"));}}

<–end–>

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。