使用activeMQ发送短信验证码

来源:互联网 发布:石油 知乎 编辑:程序博客网 时间:2024/05/16 08:18

package cn.itcast.bos.web.action;/** * 1.获取用户电话号码,生成4位数的验证(随机数),保存到session中,用吉信通发送验证码给客户 * 2.客户点击注册,获取用户页面填写的验证码,得到之前session存储的验证码,进行比较,若不同,结束action; * 3.若验证码相同,则生成32位数的激活码(随机数),将激活码把存到redis(key值就是用户的电话号码)中,设置保存时间为24小时,然后发送激活邮件给用户填写的邮箱; * 4.在激活邮件中的地址,拼入的数据有电话号码和激活码 * 5.激活邮件:需要考虑用户激活码是否正确,是否重复激活,若激活成功,将customer中的type字段改为1(未激活:为null) * */import java.io.IOException;import java.io.UnsupportedEncodingException;import java.util.concurrent.TimeUnit;import javax.jms.JMSException;import javax.jms.MapMessage;import javax.jms.Message;import javax.jms.Session;import javax.ws.rs.core.MediaType;import org.apache.commons.lang.math.RandomUtils;import org.apache.commons.lang3.RandomStringUtils;import org.apache.cxf.jaxrs.client.WebClient;import org.apache.struts2.ServletActionContext;import org.apache.struts2.convention.annotation.Action;import org.apache.struts2.convention.annotation.Namespace;import org.apache.struts2.convention.annotation.ParentPackage;import org.apache.struts2.convention.annotation.Result;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.context.annotation.Scope;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.jms.core.JmsTemplate;import org.springframework.jms.core.MessageCreator;import org.springframework.stereotype.Controller;import cn.itcast.bos.utils.MailUtils;import cn.itcast.crm.domain.Customer;import com.opensymphony.xwork2.ActionSupport;import com.opensymphony.xwork2.ModelDriven;@ParentPackage("json-default")@Namespace("/")@Controller@Scope("prototype")public class CustomerAction extends ActionSupport implementsModelDriven<Customer> {private Customer customer = new Customer();@Overridepublic Customer getModel() {return customer;}//注入jmsTemplate@Autowired@Qualifier("jmsQueueTemplate")private JmsTemplate jmsTemplate;@Action(value = "customer_sendSms")public String sendSms() throws UnsupportedEncodingException {// 手机号保存在Customer对象当中// 生成短信验证码String randomNumeric = RandomStringUtils.randomNumeric(4);// 将短信验证码保存到session当中ServletActionContext.getRequest().getSession().setAttribute(customer.getTelephone(), randomNumeric);// 在控制台输出生成的验证码System.out.println(randomNumeric);// 编辑短信的内容final String msg = "hello,your number" + randomNumeric + "服务电话:88888888";System.out.println(msg);//调用MQ发送短信(使用第三方接口来发送短信:bos_sms)jmsTemplate.send("bos_sms",new MessageCreator() {@Overridepublic Message createMessage(Session session) throws JMSException {MapMessage mapMessage = session.createMapMessage();mapMessage.setString("telephone", customer.getTelephone());mapMessage.setString("msg", msg);return mapMessage;}});return NONE;/* *  *不使用MQ来发送短信验证码 *// 调用sms服务发送短信// 为了方便测试,不进行发送短信// String sendSmsByHTTP =// SmsUtils.sendSmsByHTTP(customer.getTelephone(), msg);String sendSmsByHTTP = "000/***";// 发送短信若返回的是"000",则表明发送成功if (sendSmsByHTTP.startsWith("000")) {// 发送成功return NONE;} else {throw new RuntimeException("发送失败" + sendSmsByHTTP);} **/}// 点击注册,验证验证码是否正确,以及发送激活邮件// 1.验证验证码// 属性驱动private String checkcode;public void setCheckcode(String checkcode) {this.checkcode = checkcode;}@Autowiredprivate RedisTemplate<String, String> redisTemplate;// 用于验证激活码(将激活码存储到redis)@Action(value = "customer_regist", results = {@Result(name = "success", type = "redirect", location = "signup-success.html"),@Result(name = "input", type = "redirect", location = "signup.html") })public String regist() {// 获取之前存入session中的验证码,与用户填写的验证码进行比较String checkcodeSession = (String) ServletActionContext.getRequest().getSession().getAttribute(customer.getTelephone());if (checkcodeSession == null || !checkcodeSession.equals(checkcode)) {System.out.println("用户你输入的验证码错误");return INPUT;}// 调用webService连接CRM保存客户信息WebClient.create("http://localhost:9002/crm_management/services"+ "/customerService/customer").type(MediaType.APPLICATION_JSON).post(customer);System.out.println("验证码正确,注册成功");// 2.发送激活邮件// 生成激活码String randomNumeric = RandomStringUtils.randomNumeric(32);// 将激活码保存到redis当中,设置时间为24小时System.out.println(customer.getTelephone());System.out.println(randomNumeric);redisTemplate.opsForValue().set(customer.getTelephone(), randomNumeric,24, TimeUnit.HOURS);// 调用MailUtils发送邮件String content = "尊敬的客户您好,请于24小时内,进行邮箱账户的绑定,点击下面地址完成绑定:<br/><a href='"+ MailUtils.activeUrl + "?telephone=" + customer.getTelephone()+ "&activecode=" + randomNumeric + "'>速运快递邮箱绑定地址</a>";MailUtils.sendMail("木子快递", content, customer.getEmail());return SUCCESS;}// 用户激活邮件// 得到注册码activecode(属性驱动)private String activecode;public void setActivecode(String activecode) {this.activecode = activecode;}@Action(value = "customer_activeMail")public String activeMail() throws IOException {ServletActionContext.getResponse().setContentType("text/html;charset=utf-8");// 获取数据库(本地的)激活码String randomNumeric = redisTemplate.opsForValue().get(customer.getTelephone());if (randomNumeric == null || !randomNumeric.equals(activecode)) {// 激活码为空,或者与本地的激活码不一致-->激活失败ServletActionContext.getResponse().getWriter().print("激活码错误,请重新注册");} else {// 激活码正确,进行判断用户是否重复激活Customer customer2 = WebClient.create("http://localhost:9002/crm_management/services"+ "/customerService/customer/telephone/"+ customer.getTelephone()).accept(MediaType.APPLICATION_JSON).get(Customer.class);if(customer2.getType()==null || customer2.getType() != 1){//激活码为激活,调用CRM进行激活WebClient.create("http://localhost:9002/crm_management/services"+ "/customerService/customer/updatetype/"+ customer.getTelephone()).get();ServletActionContext.getResponse().getWriter().print("激活成功");}else{ServletActionContext.getResponse().getWriter().print("已经激活了,不需要在进行激活");}//激活成功后删除对应的激活码redisTemplate.delete(customer.getTelephone());}return NONE;}}

1.页面点击'获取验证码',在Customer处理业务,得到一个4位随机数作为验证码,保存到session域当中,用于注册时校验验证码是否正确.

2.发送短信只需要将电话号码,短信内容交于'bos_sms'接口进行发送(运用MQ).

package cn.itcast.bos.mq;import javax.jms.MapMessage;import javax.jms.Message;import javax.jms.MessageListener;import org.springframework.stereotype.Service;@Service("smsConsumer")public class SmsConsumer implements MessageListener {@Overridepublic void onMessage(Message message) {MapMessage mapMessage = (MapMessage) message;try {/* * String result = SmsUtils.sendSmsByHTTP( * mapMessage.getString("telephone"), mapMessage.getString("msg")); */// 为了测试方便,不进行发送短信;String result = "000/***";if (result.startsWith("000")) {System.out.println("电话号码:" + mapMessage.getString("telephone")+ "==验证码:" + mapMessage.getString("msg")+ "==============发送成功");} else {// 发送失败throw new RuntimeException("发送失败");}} catch (Exception e) {e.printStackTrace();}}}


3.如若短息发送成功,则会返回'000'字符串,因此,为了方便测试,将返回值直接写成'000/***'






原创粉丝点击