Java调用WebService接口实现发送手机短信验证码功能,java 手机验证码,WebService接口调用

时间:2021-04-12 06:46:29

近来由于项目需要,需要用到手机短信验证码的功能,其中最主要的是用到了第三方提供的短信平台接口WebService客户端接口,下面我把我在项目中用到的记录一下,以便给大家提供个思路,由于本人的文采有限,还请大家见谅!

一:首先上几张案例截图,以便大家可以了解一下短信验证码的流程,这里我在做的过程中也参考了很多网站的短信验证码,比如:58同城,汽车之家等。

1.点击获取验证码之前的样式:

Java调用WebService接口实现发送手机短信验证码功能,java 手机验证码,WebService接口调用

2.输入正确的手机号后点击获取验证码之后的样式:

Java调用WebService接口实现发送手机短信验证码功能,java 手机验证码,WebService接口调用

3.如果手机号已经被注册的样式:

Java调用WebService接口实现发送手机短信验证码功能,java 手机验证码,WebService接口调用

4.如果一个手机号一天发送超过3次就提示不能发送:

Java调用WebService接口实现发送手机短信验证码功能,java 手机验证码,WebService接口调用

二:前台的注册页面的代码:reg.jsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <%@taglib prefix="s" uri="/struts-tags"%>
  3. <%@page import="cn.gov.csrc.base.action.FindAllData"%>
  4. <%
  5. String path = request.getContextPath();
  6. String basePath = request.getScheme() + "://"
  7. + request.getServerName() + ":" + request.getServerPort()
  8. + path + "/";
  9. %>
  10. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  11. <html>
  12. <head>
  13. <base href="<%=basePath%>">
  14. <title>中国证券会证券期货违法违规举报中心-注册</title>
  15. <meta http-equiv="pragma" content="no-cache">
  16. <meta http-equiv="cache-control" content="no-cache">
  17. <meta http-equiv="expires" content="0">
  18. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  19. <meta http-equiv="description" content="This is my page">
  20. <link rel="shortcut icon" type="image/x-icon" href="<%=request.getContextPath()%>/images/favicon.ico" />
  21. <link rel="stylesheet" type="text/css"
  22. href="<%=request.getContextPath()%>/css/main.css">
  23. <link
  24. href="<%=request.getContextPath()%>/formValidator1/style/validator.css"
  25. rel="stylesheet" type="text/css" />
  26. <style type="text/css">
  27. button {
  28. background: #F0F0F0 repeat-x;
  29. padding-top: 3px;
  30. border-top : 1px solid #708090;
  31. border-right: 1px solid #708090;
  32. border-bottom: 1px solid #708090;
  33. border-left: 1px solid #708090;
  34. width: auto;
  35. line-height: 12pt;
  36. font-size : 10pt;
  37. cursor: hand;
  38. font-size: 10pt;
  39. border-top: 1px solid #708090;
  40. }
  41. </style>
  42. <script src="<%=request.getContextPath()%>/js/jquery-1.7.2.min.js"
  43. type="text/javascript"></script>
  44. <script src="<%=request.getContextPath()%>/formValidator1/formValidator-4.0.1.js"
  45. type="text/javascript"></script>
  46. <script src="<%=request.getContextPath()%>/formValidator1/formValidatorRegex.js"
  47. type="text/javascript"></script>
  48. <script src="<%=request.getContextPath()%>/js/register.js"
  49. type="text/javascript"></script>
  50. <script src="<%=request.getContextPath()%>/js/sms.js"
  51. type="text/javascript"></script>
  52. <script type="text/javascript">
  53. function changeCheckNum() {
  54. var checkNumImage_ = document.getElementById("checkNumImage");
  55. checkNumImage_.src = "${pageContext.request.contextPath}/image.jsp?timeStamp="+ new Date().getTime();
  56. }
  57. </script>
  58. <script type="text/javascript">
  59. var msg = "${message}";
  60. if (msg != "") {
  61. alert(msg);
  62. }
  63. </script>
  64. </head>
  65. <body>
  66. <%@include file="/statics/top.jspf"%>
  67. <div class="center_division">
  68. <div class="center_body">
  69. <div class="center_menu">
  70. <font color="#000000">当前位置:</font>
  71. <a href="<%=request.getContextPath()%>/statics/reg.jsp"><font color="#000000">用户注册</font></a>
  72. </div>
  73. </div>
  74. <div class="center_body_menu">
  75. <s:form action="RegisterAction_register" id="form1" name="form1" method="post" namespace="/">
  76. <table id="tb">
  77. <tr>
  78. <td colspan="3" align="center" bgcolor="#DDDFE1">举报人基本信息</td>
  79. </tr>
  80. <tr>
  81. <td align="center" width="30%">    <img src="data:images/new_reg_xing.gif"/>用户名:</td>
  82. <td align="center" width="40%">
  83. <s:textfield name="username" id="username" cssStyle="width:160px;height:24px;" onblur="checkusername()"/>
  84. </td>
  85. <td align="left" width="30%">
  86. <span id="usernameTip">
  87. <s:fielderror cssStyle="color:red;padding-left:10px;">
  88. <s:param>username</s:param>
  89. </s:fielderror>
  90. </span>
  91. </td>
  92. </tr>
  93. <tr>
  94. <td align="center" width="30%"><img src="data:images/new_reg_xing.gif"/>登录密码:</td>
  95. <td align="center" width="40%">
  96. <s:password name="password" id="password" cssStyle="width:160px;height:24px;" onblur="checkpassword()"/>
  97. </td>
  98. <td align="left" width="30%">
  99. <span id="passwordTip">
  100. <s:fielderror cssStyle="color:red;padding-left:10px;">
  101. <s:param>password</s:param>
  102. </s:fielderror>
  103. </span>
  104. </td>
  105. </tr>
  106. <tr>
  107. <td align="center" width="30%"><img src="data:images/new_reg_xing.gif"/>确认密码:</td>
  108. <td align="center" width="40%">
  109. <s:password name="passwordRepeat" id="passwordRepeat" cssStyle="width:160px;height:24px;" onblur="checkpasswrodb()"/>
  110. </td>
  111. <td align="left" width="30%">
  112. <span id="passwordRepeatTip">
  113. <s:fielderror cssStyle="color:red;padding-left:10px;">
  114. <s:param>passwordRepeat</s:param>
  115. </s:fielderror>
  116. </span>
  117. </td>
  118. </tr>
  119. <tr>
  120. <td align="center" width="30%"><img src="data:images/new_reg_xing.gif"/>姓        名:</td>
  121. <td align="center" width="40%">
  122. <s:textfield name="nickname" id="nickname" cssStyle="width:160px;height:24px;" onblur="checknickname()"/>
  123. </td>
  124. <td align="left" width="30%">
  125. <span id="nicknameTip">
  126. <s:fielderror cssStyle="color:red;padding-left:10px;">
  127. <s:param>nickname</s:param>
  128. </s:fielderror>
  129. </span>
  130. </td>
  131. </tr>
  132. <tr>
  133. <td align="center" width="30%">性        别:</td>
  134. <td align="center" width="40%">
  135. <s:radio list="#application.dataMap.get('10001')" name="jbSex" cssStyle="height:24px;"/>
  136. </td>
  137. <td align="left" width="30%"></td>
  138. </tr>
  139. <tr>
  140. <td align="center" width="30%">联系地址:</td>
  141. <td align="center" width="40%">
  142. <s:textfield name="jbAddress" id="jbAddress" cssStyle="width:160px;height:24px;" />
  143. </td>
  144. <td align="left" width="30%">
  145. <span id="jbAddressTip">
  146. <s:fielderror cssStyle="color:red;padding-left:10px;">
  147. <s:param>jbAddress</s:param>
  148. </s:fielderror>
  149. </span>
  150. </td>
  151. </tr>
  152. <tr>
  153. <td align="center" width="30%"><img src="data:images/new_reg_xing.gif"/>联系手机:</td>
  154. <td align="center" width="40%">
  155. <s:textfield id="jbPhone" name="jbPhone" cssStyle="width:160px;height:24px;" onblur="checkjbPhone()"/>
  156. </td>
  157. <td align="left" width="30%">
  158. <span id="jbPhoneTip">
  159. <s:fielderror cssStyle="color:red;padding-left:10px;">
  160. <s:param>jbPhone</s:param>
  161. </s:fielderror>
  162. </span>
  163. </td>
  164. </tr>
  165. <tr>
  166. <td align="center"><img src="data:images/new_reg_xing.gif"/>短信验证码:</td>
  167. <td align="left" colspan="2" style="padding-left: 112px;">
  168. <s:textfield id="SmsCheckCode" name="SmsCheckCode" cssStyle="width:80px;height:24px;" maxLength="6" />
  169. <span><input type="button" id="btnSendCode" name="btnSendCode" value="免费获取验证码" onclick="sendMessage()" /></span>
  170. <span id="SmsCheckCodeTip">
  171. <s:fielderror cssStyle="color:red;padding-left:10px;">
  172. <s:param>SmsCheckCodeTip</s:param>
  173. </s:fielderror>
  174. </span>
  175. </td>
  176. </tr>
  177. <tr>
  178. <td align="center" width="30%"><img src="data:images/new_reg_xing.gif"/>证件类型:</td>
  179. <td align="center" width="40%">
  180. <s:select list="#application.dataMap.get('10002')" label=""
  181. headerKey="" headerValue="--请选择--" value="1" listValue="value" onchange="enableCredentialsCode(this)"
  182. name="jbCredentialsName" id="jbCredentialsName" cssStyle="width:160px;height:24px;"/>
  183. </td>
  184. <td align="left" width="30%">
  185. <s:fielderror cssStyle="color:red;padding-left:10px;">
  186. <s:param>jbCredentialsName</s:param>
  187. </s:fielderror>
  188. </td>
  189. </tr>
  190. <tr>
  191. <td align="center" width="30%"><img src="data:images/new_reg_xing.gif"/>证件号码:</td>
  192. <td align="center" width="40%">
  193. <s:textfield name="jbCredentialsCode" id="jbCredentialsCode" cssStyle="width:160px;height:24px;" onblur="checkjbCredentialsCode()"/>
  194. </td>
  195. <td align="left" width="30%">
  196. <span id="jbCredentialsCodeTip">
  197. <s:fielderror cssStyle="color:red;padding-left:10px;">
  198. <s:param>jbCredentialsCode</s:param>
  199. </s:fielderror>
  200. </span>
  201. </td>
  202. </tr>
  203. <tr>
  204. <td align="center" width="30%">单位名称:</td>
  205. <td align="center" width="40%">
  206. <s:textfield name="jbCompanyName" id="jbCompanyName" cssStyle="width:160px;height:24px;" />
  207. </td>
  208. <td align="left" width="30%">
  209. <span id="jbCompanyNameTip">
  210. <s:fielderror cssStyle="color:red;padding-left:10px;">
  211. <s:param>jbCompanyName</s:param>
  212. </s:fielderror>
  213. </span>
  214. </td>
  215. </tr>
  216. <tr>
  217. <td align="center" width="30%"><img src="data:images/new_reg_xing.gif"/>所在地区:</td>
  218. <td align="center" width="40%">
  219. <s:select list="#application.dataMap.get('10003')" label=""
  220. headerKey="" headerValue="--请选择--" listKey="key"
  221. cssStyle="width:160px;height:24px;" listValue="value" id="jbSourceArea"
  222. name="jbSourceArea" onblur="checkjbSourceArea()"/>
  223. </td>
  224. <td align="left" width="30%">
  225. <span id="jbSourceAreaTip">
  226. <s:fielderror cssStyle="color:red;padding-left:10px;">
  227. <s:param>jbSourceArea</s:param>
  228. </s:fielderror>
  229. </span>
  230. </td>
  231. </tr>
  232. <tr>
  233. <td align="center" width="30%">    <img src="data:images/new_reg_xing.gif"/>验证码:</td>
  234. <td align="center" width="40%">
  235. <s:textfield id="checkNum" name="checkNum" cssStyle="width:60px;height:24px;" onblur="checkNumber()" maxLength="4"/>
  236. <img id="checkNumImage" src="${pageContext.request.contextPath}/image.jsp">
  237. <a onClick="changeCheckNum()" title="点击换一张" style="cursor:hand;"> 换一张</a>
  238. </td>
  239. <td align="left" width="30%">
  240. <span id="checkNumTip">
  241. <s:fielderror cssStyle="color:red;padding-left:10px;">
  242. <s:param>checkNumTip</s:param>
  243. </s:fielderror>
  244. </span>
  245. </td>
  246. </tr>
  247. <tr>
  248. <td colspan="3" style="vertical-align: top; padding-top: 5px;padding-bottom: 5px;">
  249. <input type="submit" value="注册" style="width:50px; height:24px;"/>
  250. <input type="reset" value="重置" style="width:50px; height:24px;"/>
  251. </td>
  252. </tr>
  253. </table>
  254. </s:form>
  255. </div>
  256. </div>
  257. <%@include file="/common/buttom.jspf"%>
  258. </body>
  259. </html>

三:前台获取短信验证码的js:sms.js

  1. var InterValObj; //timer变量,控制时间
  2. var count = 120; //间隔函数,1秒执行
  3. var curCount;//当前剩余秒数
  4. var code = ""; //验证码
  5. var codeLength = 6;//验证码长度
  6. function sendMessage() {
  7. curCount = count;
  8. var jbPhone = $("#jbPhone").val();
  9. var jbPhoneTip = $("#jbPhoneTip").text();
  10. if (jbPhone != "") {
  11. if(jbPhoneTip == "√ 该手机号码可以注册,输入正确" || jbPhoneTip == "√ 短信验证码已发到您的手机,请查收"){
  12. // 产生验证码
  13. for ( var i = 0; i < codeLength; i++) {
  14. code += parseInt(Math.random() * 9).toString();
  15. }
  16. // 设置button效果,开始计时
  17. $("#btnSendCode").attr("disabled", "true");
  18. $("#btnSendCode").val("请在" + curCount + "秒内输入验证码");
  19. InterValObj = window.setInterval(SetRemainTime, 1000); // 启动计时器,1秒执行一次
  20. // 向后台发送处理数据
  21. $.ajax({
  22. type: "POST", // 用POST方式传输
  23. dataType: "text", // 数据格式:JSON
  24. url: "UserAction_sms.action", // 目标地址
  25. data: "jbPhone=" + jbPhone +"&code=" + code,
  26. error: function (XMLHttpRequest, textStatus, errorThrown) {
  27. },
  28. success: function (data){
  29. data = parseInt(data, 10);
  30. if(data == 1){
  31. $("#jbPhoneTip").html("<font color='#339933'>√ 短信验证码已发到您的手机,请查收</font>");
  32. }else if(data == 0){
  33. $("#jbPhoneTip").html("<font color='red'>× 短信验证码发送失败,请重新发送</font>");
  34. }else if(data == 2){
  35. $("#jbPhoneTip").html("<font color='red'>× 该手机号码今天发送验证码过多</font>");
  36. }
  37. }
  38. });
  39. }
  40. }else{
  41. $("#jbPhoneTip").html("<font color='red'>× 手机号码不能为空</font>");
  42. }
  43. }
  44. //timer处理函数
  45. function SetRemainTime() {
  46. if (curCount == 0) {
  47. window.clearInterval(InterValObj);// 停止计时器
  48. $("#btnSendCode").removeAttr("disabled");// 启用按钮
  49. $("#btnSendCode").val("重新发送验证码");
  50. code = ""; // 清除验证码。如果不清除,过时间后,输入收到的验证码依然有效
  51. }else {
  52. curCount--;
  53. $("#btnSendCode").val("请在" + curCount + "秒内输入验证码");
  54. }
  55. }
  56. $(document).ready(function() {
  57. $("#SmsCheckCode").blur(function() {
  58. var SmsCheckCodeVal = $("#SmsCheckCode").val();
  59. // 向后台发送处理数据
  60. $.ajax({
  61. url : "UserAction_checkCode.action",
  62. data : {SmsCheckCode : SmsCheckCodeVal},
  63. type : "POST",
  64. dataType : "text",
  65. success : function(data) {
  66. data = parseInt(data, 10);
  67. if (data == 1) {
  68. $("#SmsCheckCodeTip").html("<font color='#339933'>√ 短信验证码正确,请继续</font>");
  69. } else {
  70. $("#SmsCheckCodeTip").html("<font color='red'>× 短信验证码有误,请核实后重新填写</font>");
  71. }
  72. }
  73. });
  74. });
  75. });

四:验证码用户名和手机号码的js:register.js

  1. //去掉前后空格
  2. function trim(str) {
  3. var strnew = str.replace(/^\s*|\s*$/g, "");
  4. return strnew;
  5. }
  6. //用户名
  7. function checkusername() {
  8. var username = document.form1.username.value;
  9. if (username == "" || !isNaN(username.charAt(0))) {
  10. document.getElementById("usernameTip").innerHTML = "<font color='red'>× 首字母不能为数字或者用户名不能为空</font>";
  11. return false;
  12. } else if (username.length < 6 || username.length > 30) {
  13. document.getElementById("usernameTip").innerHTML = "<font color='red'>× 用户名长度为6-30位字符</font>";
  14. return false;
  15. } else {
  16. document.getElementById("usernameTip").innerHTML = "<font color='#339933'>√ 用户名合格</font>";
  17. // 向后台发送处理数据
  18. $.ajax({
  19. url : "UserAction_checkUserName.action",// 目标地址
  20. data : {username : username}, // 目标参数
  21. type : "POST", // 用POST方式传输
  22. dataType : "text", // 数据格式:text
  23. success : function(data) {
  24. data = parseInt(data, 10);
  25. if (data != 0) {
  26. $("#usernameTip").html("<font color='red'>× 该用户名已经被注册,请重新输入</font>");
  27. } else {
  28. $("#usernameTip").html("<font color='#339933'>√ 该用户名可以注册,输入正确</font>");
  29. }
  30. }
  31. });
  32. return true;
  33. }
  34. }
  35. // 登录密码
  36. function checkpassword() {
  37. var password = document.form1.password.value;
  38. if (password.length < 6 || password.length > 30) {
  39. document.getElementById("passwordTip").innerHTML = "<font color='red'>× 密码长度不能小于6位,大于30位</font>";
  40. return false;
  41. } else if (!isNaN(password)) {
  42. document.getElementById("passwordTip").innerHTML = "<font color='red'>× 密码不能全是数字</font>";
  43. return false;
  44. } else {
  45. document.getElementById("passwordTip").innerHTML = "<font color='#339933'>√ 密码合格</font>";
  46. return true;
  47. }
  48. }
  49. // 确认密码
  50. function checkpasswrodb() {
  51. var password = document.form1.password.value;
  52. var passwordRepeat = document.form1.passwordRepeat.value;
  53. if (trim(password) != trim(passwordRepeat)) {
  54. document.getElementById("passwordRepeatTip").innerHTML = "<font color='red'>× 两次密码输入必须一致</font>";
  55. return false;
  56. } else {
  57. document.getElementById("passwordRepeatTip").innerHTML = "<font color='#339933'>√ 密码输入一致</font>";
  58. return true;
  59. }
  60. }
  61. // 姓名
  62. function checknickname() {
  63. var nickname = document.form1.nickname.value;
  64. if (trim(nickname) == "") {
  65. document.getElementById("nicknameTip").innerHTML = "<font color='red'>× 姓名不能为空</font>";
  66. return false;
  67. } else {
  68. document.getElementById("nicknameTip").innerHTML = "<font color='#339933'>√ 姓名输入正确</font>";
  69. return true;
  70. }
  71. }
  72. // 联系手机(ajax验证手机号码是否已经存在)
  73. function checkjbPhone() {
  74. var jbPhone = document.form1.jbPhone.value;
  75. var re= /(^1[3|5|8][0-9]{9}$)/;
  76. if (trim(jbPhone) == "") {
  77. document.getElementById("jbPhoneTip").innerHTML = "<font color='red'>× 手机号码不能为空</font>";
  78. return false;
  79. } else if(trim(jbPhone) != ""){
  80. if(!re.test(jbPhone)){
  81. document.getElementById("jbPhoneTip").innerHTML = "<font color='red'>× 请输入有效的手机号码</font>";
  82. return false;
  83. }else{
  84. document.getElementById("jbPhoneTip").innerHTML = "<font color='#339933'>√ 手机号码输入正确</font>";
  85. // 向后台发送处理数据
  86. $.ajax({
  87. url : "UserAction_checkPhone.action",// 目标地址
  88. data : {jbPhone : jbPhone}, // 目标参数
  89. type : "POST", // 用POST方式传输
  90. dataType : "text", // 数据格式:text
  91. success : function(data) {
  92. data = parseInt(data, 10);
  93. if (data != 0) {
  94. $("#jbPhoneTip").html("<font color='red'>× 该手机号码已经被注册,请重新输入</font>");
  95. } else {
  96. $("#jbPhoneTip").html("<font color='#339933'>√ 该手机号码可以注册,输入正确</font>");
  97. }
  98. }
  99. });
  100. return true;
  101. }
  102. }
  103. }
  104. // 证件号码
  105. function checkjbCredentialsCode() {
  106. var jbCredentialsCode = document.form1.jbCredentialsCode.value;
  107. var reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
  108. if (trim(jbCredentialsCode) == "") {
  109. document.getElementById("jbCredentialsCodeTip").innerHTML = "<font color='red'>× 证件号码不能为空</font>";
  110. return false;
  111. } else if(trim(jbCredentialsCode) != ""){
  112. if(!reg.test(jbCredentialsCode)){
  113. document.getElementById("jbCredentialsCodeTip").innerHTML = "<font color='red'>× 请输入合法的证件号码</font>";
  114. return false;
  115. }else{
  116. document.getElementById("jbCredentialsCodeTip").innerHTML = "<font color='#339933'>√ 证件号码输入正确</font>";
  117. // 向后台发送处理数据
  118. $.ajax({
  119. url : "UserAction_checkCredentialsCode.action",// 目标地址
  120. data : {jbCredentialsCode : jbCredentialsCode}, // 目标参数
  121. type : "POST", // 用POST方式传输
  122. dataType : "text", // 数据格式:text
  123. success : function(data) {
  124. data = parseInt(data, 10);
  125. if (data != 0) {
  126. $("#jbCredentialsCodeTip").html("<font color='red'>× 该证件号码已经被注册,请重新输入</font>");
  127. } else {
  128. $("#jbCredentialsCodeTip").html("<font color='#339933'>√ 该证件号码可以注册,输入正确</font>");
  129. }
  130. }
  131. });
  132. return true;
  133. }
  134. }
  135. }
  136. // 所在地区
  137. function checkjbSourceArea() {
  138. var jbSourceArea = document.form1.jbSourceArea.value;
  139. if (trim(jbSourceArea) == "") {
  140. document.getElementById("jbSourceAreaTip").innerHTML = "<font color='red'>× 请选择所在地区</font>";
  141. return false;
  142. } else {
  143. document.getElementById("jbSourceAreaTip").innerHTML = "<font color='#339933'>√ 所在地区选择正确</font>";
  144. return true;
  145. }
  146. }
  147. // 验证码
  148. function checkNumber() {
  149. var checkNum = document.form1.checkNum.value;
  150. if (trim(checkNum) == "") {
  151. document.getElementById("checkNumTip").innerHTML = "<font color='red'>× 验证码不能为空</font>";
  152. return false;
  153. } else {
  154. document.getElementById("checkNumTip").innerHTML = "<font color='#339933'>√ 验证码合格</font>";
  155. // 向后台发送处理数据
  156. $.ajax({
  157. url : "UserAction_checkNum.action",// 目标地址
  158. data : {checkNum : checkNum}, // 目标参数
  159. type : "POST", // 用POST方式传输
  160. dataType : "text", // 数据格式:text
  161. success : function(data) {
  162. data = parseInt(data, 10);
  163. if (data != 0) {
  164. $("#checkNumTip").html("<font color='red'>× 验证码错误</font>");
  165. } else {
  166. $("#checkNumTip").html("<font color='#339933'>√ 验证码正确</font>");
  167. }
  168. }
  169. });
  170. return true;
  171. }
  172. }

五:后台action的代码:UserAction.java(这里只是调用了我们的第三方给提供的客户端代码的发送短信的方法,如果是调用其他的短信平台,可以换成他们的发送短信的方法,这里只是给大家做个参考)

  1. package cn.gov.csrc.base.systemmanager.action;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import java.util.List;
  5. import javax.annotation.Resource;
  6. import javax.servlet.http.HttpServletResponse;
  7. import org.apache.log4j.Logger;
  8. import org.apache.struts2.convention.annotation.Action;
  9. import org.apache.struts2.convention.annotation.Result;
  10. import org.apache.struts2.convention.annotation.Results;
  11. import org.springframework.context.annotation.Scope;
  12. import org.springframework.security.authentication.encoding.MessageDigestPasswordEncoder;
  13. import org.springframework.security.core.context.SecurityContextHolder;
  14. import org.springframework.stereotype.Controller;
  15. import cn.gov.csrc.base.action.BaseAction;
  16. import cn.gov.csrc.base.log.service.LogService;
  17. import cn.gov.csrc.base.report.util.CommonUtil;
  18. import cn.gov.csrc.base.report.util.Env;
  19. import cn.gov.csrc.base.systemmanager.model.Count;
  20. import cn.gov.csrc.base.systemmanager.model.User;
  21. import cn.gov.csrc.base.systemmanager.service.CountService;
  22. import cn.gov.csrc.base.systemmanager.service.UserService;
  23. import cn.gov.csrc.base.util.WebContextUtil;
  24. import com.sms.webservice.client.SmsReturnObj;
  25. import com.sms.webservice.client.SmsWebClient;
  26. /**
  27. * File: UserAction.java
  28. * Author: jiangsai
  29. * Version: 1.1
  30. * Date: 04/17/2013
  31. * Modify:
  32. * Description:用户
  33. * Copyright csrc
  34. */
  35. @Controller()
  36. @Scope("prototype")
  37. @Results({
  38. @Result(name = "success", location = "/statics/report.jsp"),
  39. @Result(name = "modifyPassword", location = "/statics/modifyPassword.jsp")
  40. })
  41. public class UserAction extends BaseAction<User> {
  42. private static final long serialVersionUID = 1214696686677691191L;
  43. private static Logger log = Logger.getLogger(UserAction.class);
  44. private static final String url = Env.getInstance().getProperty("url");
  45. private static final String userName = Env.getInstance().getProperty(
  46. "username");
  47. private static final String passWord = Env.getInstance().getProperty(
  48. "password");
  49. private Integer id;
  50. private String username;// 用户名
  51. private String password;// 密码
  52. private String passwordRepeat;// 确认密码
  53. private String jbPhone;//手机号码
  54. private String jbCredentialsCode;//身份证号码
  55. private String checkNum;//图片验证码
  56. private String newPassword;
  57. private String confirmPassword;
  58. private Integer[] ownRoleIds;
  59. private UserService userService;
  60. private CountService countService;
  61. private LogService logService;
  62. private Count count = new Count();
  63. public Integer getId() {
  64. return id;
  65. }
  66. public void setId(Integer id) {
  67. this.id = id;
  68. }
  69. public String getUsername() {
  70. return username;
  71. }
  72. public void setUsername(String username) {
  73. this.username = username;
  74. }
  75. public String getPassword() {
  76. return password;
  77. }
  78. public void setPassword(String password) {
  79. this.password = password;
  80. }
  81. public String getPasswordRepeat() {
  82. return passwordRepeat;
  83. }
  84. public void setPasswordRepeat(String passwordRepeat) {
  85. this.passwordRepeat = passwordRepeat;
  86. }
  87. public String getJbPhone() {
  88. return jbPhone;
  89. }
  90. public void setJbPhone(String jbPhone) {
  91. this.jbPhone = jbPhone;
  92. }
  93. public String getJbCredentialsCode() {
  94. return jbCredentialsCode;
  95. }
  96. public void setJbCredentialsCode(String jbCredentialsCode) {
  97. this.jbCredentialsCode = jbCredentialsCode;
  98. }
  99. public String getCheckNum() {
  100. return checkNum;
  101. }
  102. public void setCheckNum(String checkNum) {
  103. this.checkNum = checkNum;
  104. }
  105. public Integer[] getOwnRoleIds() {
  106. return ownRoleIds;
  107. }
  108. public void setOwnRoleIds(Integer[] ownRoleIds) {
  109. this.ownRoleIds = ownRoleIds;
  110. }
  111. public String getNewPassword() {
  112. return newPassword;
  113. }
  114. public void setNewPassword(String newPassword) {
  115. this.newPassword = newPassword;
  116. }
  117. public String getConfirmPassword() {
  118. return confirmPassword;
  119. }
  120. public void setConfirmPassword(String confirmPassword) {
  121. this.confirmPassword = confirmPassword;
  122. }
  123. @Resource
  124. public void setUserService(UserService userService) {
  125. this.userService = userService;
  126. }
  127. public UserService getUserService() {
  128. return userService;
  129. }
  130. @Resource
  131. public void setCountService(CountService countService) {
  132. this.countService = countService;
  133. }
  134. public CountService getCountService() {
  135. return countService;
  136. }
  137. public LogService getLogService() {
  138. return logService;
  139. }
  140. @Resource
  141. public void setLogService(LogService logService) {
  142. this.logService = logService;
  143. }
  144. public Count getCount() {
  145. return count;
  146. }
  147. public void setCount(Count count) {
  148. this.count = count;
  149. }
  150. public void prepareToUpdatePage() {
  151. model = userService.getEntity(id);
  152. }
  153. /**
  154. * 用户登录
  155. *
  156. * @return success
  157. */
  158. @Action(value = "UserAction_login")
  159. public String login() {
  160. Object u = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
  161. if (u instanceof User && u != null) {
  162. WebContextUtil.getSession().setAttribute("user", u);
  163. User user = (User)u;
  164. //使用数据库表TBL_BASE_LOG添加用户登录的日志信息
  165. logService.saveTblBaseLog(WebContextUtil.getRequest(),"当前操作人【"+user.getNickname()+"】登录系统");
  166. } else {
  167. // 防止绕过登陆页面直接执行Action
  168. return "login";
  169. }
  170. return SUCCESS;
  171. }
  172. /**
  173. * 用户密码更新
  174. */
  175. @Action(value = "UserAction_updateUser")
  176. public String updateUser() {
  177. if (!newPassword.equals(confirmPassword)) {
  178. this.setMessage("新密码与确认密码不一致!");
  179. return "modifyPassword";
  180. }
  181. User u = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
  182. MessageDigestPasswordEncoder encoder = new MessageDigestPasswordEncoder("md5");
  183. String psw = encoder.encodePassword(newPassword, null);
  184. userService.modifyPassword(u, psw);
  185. this.setMessage("保存成功!");
  186. return "modifyPassword";
  187. }
  188. /**
  189. * 验证用户名是否存在
  190. *
  191. * @throws Exception
  192. */
  193. @Action(value = "UserAction_checkUserName")
  194. public void checkUserName(){
  195. String result = "0";
  196. try {
  197. List<User> list = userService.findUserByUserName(username);
  198. if(list != null && list.size() > 0){
  199. result = "1";
  200. }else{
  201. result = "0";
  202. }
  203. HttpServletResponse response = WebContextUtil.getResponse();
  204. response.setContentType("application/json;charset=UTF-8");
  205. response.setHeader("Cache-Control", "no-cache");
  206. PrintWriter out = response.getWriter();
  207. out.write(result.toString());
  208. } catch (IOException e) {
  209. throw new RuntimeException("验证身份证号码出错", e);
  210. }
  211. }
  212. /**
  213. * 验证原始密码是否正确
  214. *
  215. * @throws Exception
  216. */
  217. @Action(value = "UserAction_checkPassWord")
  218. public void checkPassWord() throws Exception {
  219. String result = "0";
  220. MessageDigestPasswordEncoder encoder = new MessageDigestPasswordEncoder("md5");
  221. String pwd = encoder.encodePassword(password, null);
  222. List<User> user = userService.findUserByPassWord(pwd);
  223. if (user != null && user.size() > 0) {
  224. result = "1";
  225. }else{
  226. result = "0";
  227. }
  228. HttpServletResponse response = WebContextUtil.getResponse();
  229. response.setContentType("application/json;charset=UTF-8");
  230. response.setHeader("Cache-Control", "no-cache");
  231. PrintWriter out = response.getWriter();
  232. out.write(result.toString());
  233. }
  234. /**
  235. * 验证手机号码是否存在
  236. */
  237. @Action(value = "UserAction_checkPhone")
  238. public void checkPhone(){
  239. String result = "0";
  240. try {
  241. List<User> list = userService.findUserByPhone(jbPhone);
  242. if(list != null && list.size() > 0){
  243. result = "1";
  244. }else{
  245. result = "0";
  246. }
  247. HttpServletResponse response = WebContextUtil.getResponse();
  248. response.setContentType("application/json;charset=UTF-8");
  249. response.setHeader("Cache-Control", "no-cache");
  250. PrintWriter out = response.getWriter();
  251. out.write(result.toString());
  252. } catch (IOException e) {
  253. throw new RuntimeException("验证手机号码出错", e);
  254. }
  255. }
  256. /**
  257. * 验证身份证号码是否存在
  258. */
  259. @Action(value = "UserAction_checkCredentialsCode")
  260. public void checkCredentialsCode(){
  261. String result = "0";
  262. try {
  263. List<User> list = userService.findUserByCredentialsCode(jbCredentialsCode);
  264. if(list != null && list.size() > 0){
  265. result = "1";
  266. }else{
  267. result = "0";
  268. }
  269. HttpServletResponse response = WebContextUtil.getResponse();
  270. response.setContentType("application/json;charset=UTF-8");
  271. response.setHeader("Cache-Control", "no-cache");
  272. PrintWriter out = response.getWriter();
  273. out.write(result.toString());
  274. } catch (IOException e) {
  275. throw new RuntimeException("验证身份证号码出错", e);
  276. }
  277. }
  278. /**
  279. * 验证验证码是否正确
  280. */
  281. @Action(value = "UserAction_checkNum")
  282. public void checkNum(){
  283. try {
  284. String result = "0";
  285. String check_number_key = (String)WebContextUtil.getSession().getAttribute("CHECK_NUMBER_KEY");
  286. if(checkNum != check_number_key && !checkNum.equals(check_number_key)){
  287. result = "1";
  288. }else{
  289. result = "0";
  290. }
  291. HttpServletResponse response = WebContextUtil.getResponse();
  292. response.setContentType("application/json;charset=UTF-8");
  293. response.setHeader("Cache-Control", "no-cache");
  294. PrintWriter out = response.getWriter();
  295. out.write(result.toString());
  296. } catch (IOException e) {
  297. throw new RuntimeException("验证验证码出错", e);
  298. }
  299. }
  300. /**
  301. * 验证短信验证码是否正确
  302. *
  303. * @throws Exception
  304. */
  305. @Action(value = "UserAction_checkCode")
  306. public void checkCode() throws Exception{
  307. String result = "0";
  308. /** 获取手动输入的手机短信验证码 */
  309. String SmsCheckCode = WebContextUtil.getRequest().getParameter("SmsCheckCode");
  310. /** 获取session中存放的手机短信验证码 */
  311. String code = (String) WebContextUtil.getSession().getAttribute("code");
  312. try {
  313. if(SmsCheckCode != code && !SmsCheckCode.equals(code)){
  314. result = "0";
  315. }else{
  316. result = "1";
  317. }
  318. } catch (Exception e) {
  319. throw new RuntimeException("短信验证失败", e);
  320. }
  321. HttpServletResponse response = WebContextUtil.getResponse();
  322. response.setContentType("application/json;charset=UTF-8");
  323. response.setHeader("Cache-Control", "no-cache");
  324. PrintWriter out = response.getWriter();
  325. out.write(result.toString());
  326. }
  327. /**
  328. * 验证手机短信是否发送成功
  329. *
  330. * @throws Exception
  331. */
  332. @Action(value = "UserAction_sms")
  333. public void sms() throws Exception {
  334. String result = "0";
  335. /** 手机号码 */
  336. String jbPhone = WebContextUtil.getRequest().getParameter("jbPhone");
  337. /** 短信验证码 */
  338. String code = WebContextUtil.getRequest().getParameter("code");
  339. /** 短信验证码存入session(session的默认失效时间30分钟) */
  340. WebContextUtil.getSession().setAttribute("code", code);
  341. /** 如何初始化失败返回 */
  342. if(!initClient()) {
  343. return;
  344. }
  345. /** 单个手机号发送短信的方法的参数准备 */
  346. // 手机号码
  347. String mobilephone = jbPhone;
  348. // 短信内容+随机生成的6位短信验证码
  349. String content = "根据中国证监会举报中心委托,特向您发送此条短信。您的注册验证码为:" + code;
  350. // 操作用户的ID
  351. Integer operId = Integer.parseInt(Env.getInstance().getProperty("operId"));
  352. // 定时发送的的发送时间(缺省为空,如果即时发送,填空)
  353. String tosend_time = "";
  354. // 应用系统的短信ID,用户查询该短信的状态报告(缺省为0,即不需查询短信的状态报告)
  355. int sms_id = 0;
  356. // 黑名单过滤(0:不需要黑名单过滤,1:需要黑名单过滤,缺省为0)
  357. short backlist_filter = 0;
  358. // 禁止语过滤(0:不需要禁止语过滤,1:需要禁止语过滤,缺省为0)
  359. short fbdword_filter = 0;
  360. // 优先级(值越大优先级越高,0:普通,1,:优先,2:最高,缺省为0)
  361. short priority = 0;
  362. // 短信有效时间(格式为:YYYY-MM-DD HH:mm:ss目前为空)
  363. String valid_time = "";
  364. /** 发送短信之前先统计一个已经发送的短信条数 */
  365. int messageCount = countService.findAllRecord(mobilephone);
  366. log.info("已发短信条数为:" +messageCount);
  367. if(messageCount < 5){
  368. /** 单个手机号发送短信 */
  369. if (!sendMessage(mobilephone, content, operId, tosend_time, sms_id,
  370. backlist_filter, fbdword_filter, priority, valid_time)) {
  371. result = "0";// 失败
  372. } else {
  373. result = "1";// 成功
  374. /** 发送一条短信,记录一条短信记录,为了方便之后的统计短信发送次数 */
  375. count.setPhone(mobilephone);// 手机号码
  376. count.setCaptcha(code);// 短信验证码
  377. count.setSendTime(CommonUtil.getNowDate());// 短信发送时间
  378. if(count != null){
  379. countService.saveEntity(count);
  380. log.info("短信验证码发送记录保存成功!");
  381. }
  382. }
  383. }else{
  384. result = "2";//一个手机号码最多发送5条短信验证码
  385. log.info("该手机号码今天发送验证码过多");
  386. }
  387. HttpServletResponse response = WebContextUtil.getResponse();
  388. response.setContentType("application/json;charset=UTF-8");
  389. response.setHeader("Cache-Control", "no-cache");
  390. PrintWriter out = response.getWriter();
  391. out.write(result.toString());
  392. }
  393. /**
  394. * WebService客户端初始化
  395. *
  396. */
  397. public static boolean initClient() {
  398. /**
  399. * 判断客户端是否已经初始化
  400. */
  401. if (!SmsWebClient.enable()) {
  402. int ret = 0;
  403. try {
  404. ret = SmsWebClient.init(url, userName, passWord);
  405. if (ret == -1 || !SmsWebClient.enable()) {
  406. log.info("短信平台接口初始化失败!");
  407. return false;
  408. }
  409. log.info("短信平台接口初始化成功!" + ret + "-----");
  410. } catch (Exception ex) {
  411. ex.printStackTrace();
  412. log.info("短信平台接口初始化过程中异常!");
  413. }
  414. }
  415. return true;
  416. }
  417. /**
  418. * 单个手机号码发送
  419. *
  420. * @param mobilephone
  421. *            手机号
  422. * @param content
  423. *            短信内容
  424. * @param operId
  425. *            操作用户的ID
  426. * @param tosend_time
  427. *            定时发送的发送时间
  428. * @param sms_id
  429. *            应用系统的短信ID
  430. * @param backlist_filter
  431. *            黑名单过滤
  432. * @param fbdword_filter
  433. *            禁止语过滤
  434. * @param priority
  435. *            优先级
  436. * @param valid_time
  437. *            短信有效时间
  438. */
  439. public static boolean sendMessage(java.lang.String mobilephone,
  440. java.lang.String content, int operId, java.lang.String tosend_time,
  441. int sms_id, short backlist_filter, short fbdword_filter,
  442. short priority, java.lang.String valid_time) {
  443. // 单个手机号码发送
  444. try {
  445. SmsReturnObj retObj = SmsWebClient.webSendMessage(mobilephone,
  446. content, operId, tosend_time, sms_id, backlist_filter,
  447. fbdword_filter, priority, valid_time);
  448. if (retObj.getReturnCode() != 1) {
  449. log.info("短信发送失败,原因为:" + retObj.getReturnMsg());
  450. return false;
  451. } else {
  452. log.info("短信发送成功!返回结果为:" + retObj.getReturnMsg());
  453. return true;
  454. }
  455. } catch (Exception ex) {
  456. ex.printStackTrace();
  457. log.info("短信发送过程发生异常!");
  458. }
  459. return true;
  460. }
  461. }

六:具体的短信接口demo到这里下,这里你下载了也不能成功的发送短信,因为你必须要短信平台商给你提供:url,userName,passWord,operId,以及短信平台商还要绑定你的外网ip地址,这样才能真正的发送短信。

Demo下载链接: http://pan.baidu.com/s/1qWt1Qdm