阿里云市场的短信api实现短信验证登陆(未上线的项目,个人可以用,便宜3.5元100条。。。。) 加 javamail 邮箱验证登陆
阿里云市场的短信api实现短信验证登陆:未上线的项目,个人可以用,便宜3.5元100条。。。。 加 javamail 邮箱验证登陆
准备工作:准备发邮箱短信的util类
发邮件Util类
依赖
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4</version>
</dependency>
public static void sendEmain( String email,String yzm) {
// TODO Auto-generated method stub
try {
// 1、创建Properties对象,封装邮件服务器的相关信息
Properties props = new Properties();
// 服务器地址
props.setProperty("mail.smtp.host", "smtp.126.com");
// 服务器需要鉴权
props.setProperty("mail.smtp.auth", "true");
// 2、创建Authenticator的实例,实现账户、密码的鉴权。
Authenticator auth = new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
// 使用账号 以及 授权码登录至邮件服务器,此处采用 126邮件服务器 授权码
return new PasswordAuthentication("xxxxxxxxxx@126.com", "xxxx(这里不密码 是126邮件服务器 授权码)");
}
};
// 3、获得Session实例
Session mailSession = Session.getInstance(props, auth);
// 4、创建SMTPMessage,要提供session
SMTPMessage msg = new SMTPMessage(mailSession);
// 5、设置邮件标题,没有标题的邮件几乎都会被认为是垃圾邮件被系统退回。
msg.setSubject("用户邮箱验证登陆,请勿回复");
// 6、设置邮件内容
msg.setContent("【学生综合素质管理系统】您的验证码为"+yzm+",60s内有效,请尽快验证。如非本人操作,请忽略本条邮件。" , "text/html;charset=UTF-8");
// 设置接收者
// 7、接收者类型由:TO(收件人)、CC(抄送)、BCC(密送)
msg.setRecipient(RecipientType.TO, new InternetAddress(email));
// 8、设置发送人
msg.setFrom(new InternetAddress("xxxxxxx@126.com"));
// 发送邮件
Transport.send(msg);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
发短信Util类
发短信在阿里云市场买就完事了
我买的这一个
然后在自己已买的服务里面看 找到这个AppCode
在购买api的下方有说明文档
拿过来跑就完事了,修改appcoud就可以了 如果自定义模板的话好像要过了审核才可以 用,我的没过审核试了好几次 都失败。
这样发短信util类也有了
控制层
//发短信
@RequestMapping(value = "/api/sendPhone")
@ResponseBody
public String doLoginSendPhone(String phone) {
service.sendPhone(phone);
return "发送成功,请注意查收";
}
//发邮件
@RequestMapping(value = "/api/sendEmail")
@ResponseBody
public String doLoginSendEmail(String email) {
service.sendEmail(email);
return "发送成功,请注意查收";
}
//销毁验证码
@RequestMapping(value = "/api/destroy")
@ResponseBody
public String doLoginDeleteSend(String check) {
service.delectSession(check);
return "销毁成功";
}
//邮件或者短信登陆
@RequestMapping(value = "/api/yzLogin")
@ResponseBody
public String doLoginDeleteSend(String check,String emailOrPhone,String yzm,HttpServletResponse response) {
return service.loginByPhoneOrEmail(check, emailOrPhone, yzm, response);
}
服务层
这里我定义了2个存验证码的session 感觉定义一个就可以了
/**
* 用户发邮件发送验证码
*/
@Override
public void sendEmail(String email) {
//生成验证码
Integer yzm=yzmUtils.getlinkNo();
//发邮件
EmailUtil.sendEmain(email, String.valueOf(yzm));
//存session
ConstantUtils.getRequest().getSession().setAttribute(ConstantUtils.EMAIL_YZM, String.valueOf(yzm));
}
/**
* 60s后清除session 前端带过来1 就是邮箱 ,2就是手机
*/
@Override
public void delectSession(String check) {
//前端带过来1 就是邮箱
if("1".equals(check)){
//移除邮箱session
ConstantUtils.getRequest().getSession().removeAttribute(ConstantUtils.EMAIL_YZM);
}else {
//移除短信session
ConstantUtils.getRequest().getSession().removeAttribute(ConstantUtils.NOTE_YZM);
}
}
/**
* 用户短信或者邮件登陆
*/
@Override
public String loginByPhoneOrEmail(String check, String emailOrPhone,String yzm, HttpServletResponse response) {
String checkYzm="";
User u=null;
//前端带过来1 就是邮箱 校验
if("1".equals(check)){
checkYzm=(String)ConstantUtils.getRequest().getSession().getAttribute(ConstantUtils.EMAIL_YZM);
u= mapper.findByEmail(emailOrPhone);
boolean checkYzmFlag=checkYzm!=null&&!"".equals(checkYzm);
if(!checkYzmFlag){
return"尚未点击发送按钮,或者验证码已经失效";
}else if(!checkYzm.equals(yzm)){
return"验证码输入错误,请仔细检查";
}else if(u == null){
return "该用户不存在";
//登陆成功
}else{
// 登录成功,将用户的信息存放在session中
ConstantUtils.getRequest().getSession().setAttribute(ConstantUtils.SESSION_USER, u);
// 进行加密
String secret = MD5Utils.convertMD5(u.getUserId() + "_" + u.getPwd());
// addCookie(cookie名字,存活时间,cookie的值,request,response)
CookieUtils.addCookie(ConstantUtils.LOGIN_COOKIE, 7*24*60*60, secret, ConstantUtils.getRequest(),
response);
}
//发短信校验
}else {
checkYzm=(String)ConstantUtils.getRequest().getSession().getAttribute(ConstantUtils.NOTE_YZM);
u= mapper.findByPhone(emailOrPhone);
boolean checkYzmFlag=checkYzm!=null&&!"".equals(checkYzm);
if(!checkYzmFlag){
return"验证码已失效,请重新发送";
}else if(!checkYzm.equals(yzm)){
return"验证码输入错误,请仔细检查";
}else if(u == null){
return "该用户不存在";
//登陆成功
}else{
// 登录成功,将用户的信息存放在session中
ConstantUtils.getRequest().getSession().setAttribute(ConstantUtils.SESSION_USER, u);
// 进行加密
String secret = MD5Utils.convertMD5(u.getUserId() + "_" + u.getPwd());
// addCookie(cookie名字,存活时间,cookie的值,request,response)
CookieUtils.addCookie(ConstantUtils.LOGIN_COOKIE, 7*24*60*60, secret, ConstantUtils.getRequest(),
response);
}
}
return "登陆成功";
}
/**
* 发短信
*/
@Override
public void sendPhone(String phoneNumber) {
//生成验证码
Integer yzm=yzmUtils.getlinkNo();
//发邮件
PhoneUtil.sendPhoneMsg(String.valueOf(yzm), phoneNumber);
//存session
ConstantUtils.getRequest().getSession().setAttribute(ConstantUtils.NOTE_YZM, String.valueOf(yzm));
}
持久层
就是根据手机号和邮箱号查。。。
前端jquery
//邮件短信校验开始
//邮箱手机号校验开始
var emailPhonestand=false;
var emailStandard =/^([1-9][0-9]{4,}\@qq\.com)|((\w+((-\w+)|(\.\w+))*)\+\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+)$/;
var phoneStandard = /^1[3456789]\d{9}$/;
$("#emailPhone").blur(function(){
if (!this.value) {
$("#emailPhoneTips").text("*请输入邮箱号或手机号");
//输入的校验方式 不等于手机号格式并且不等于邮箱格式
} else if (!phoneStandard.test(this.value)&&!emailStandard.test(this.value)) {
$("#emailPhoneTips").html ("*请输入正确的邮箱号或者手机号");
}else{
emailPhonestand=true;
}
}).focus(function (){
$("#emailPhoneTips").text("");
})
//倒计时
var wait =60;
function time(o) {
if (wait == 0) {
o.removeAttribute("disabled");
o.value = "发送";
wait = 60;
//如果时间过完 销毁session里的验证码
//发短信
var check="";
//邮箱或者手机
var emailPhone=$("#emailPhone").val()
if(phoneStandard.test(emailPhone)){
check="2";
//发邮箱
}else{
check="1";
}
$.ajax({
//指定请求地址的url
url:"${ctx}/user/api/destroy",
//指定
type:"post",
data:"check="+check,
//预期服务器返回的数据类型
dateType:"text",
//服务器响应成功时候的回调函数
success:function(result){
// alert(result);
},error:function(xhr, textStatus, err){//服务器响应失败时候的回调函数
alert(xhr);
alert(textStatus);
alert(err)
}
})
} else {
o.setAttribute("disabled", true);
o.value = "重新获取(" + wait + ")";
wait--;
setTimeout(function() {
time(o);
}, 1000);
};
}
document.getElementById("btn").onclick = function() {
var value=$("#emailPhone").val();
//置空验证码
$("#yzm").val("");
//如果校验成功
if(emailPhonestand){
//发短信
if(phoneStandard.test(value)){
$.ajax({
//指定请求地址的url
url:"${ctx}/user/api/sendPhone",
//指定
type:"post",
data:"phone="+value,
//预期服务器返回的数据类型
dateType:"text",
//服务器响应成功时候的回调函数
success:function(result){
// alert(result);
},error:function(xhr, textStatus, err){//服务器响应失败时候的回调函数
alert(xhr);
alert(textStatus);
alert(err)
}
})
//发邮箱
}else{
$.ajax({
//指定请求地址的url
url:"${ctx}/user/api/sendEmail",
//指定
type:"post",
data:"email="+value,
//预期服务器返回的数据类型
dateType:"text",
//服务器响应成功时候的回调函数
success:function(result){
// alert(result);
},error:function(xhr, textStatus, err){//服务器响应失败时候的回调函数
alert(xhr);
alert(textStatus);
alert(err)
}
})
}
time(this);
}
};
//登陆开始
$("#yzBtn").click(function(){
//邮箱或者手机
var emailPhone=$("#emailPhone").val()
//验证码
var yzm=$("#yzm").val()
var check="";
//手机
if(phoneStandard.test(emailPhone)){
check="2";
//发邮箱
}else{
check="1";
}
$.ajax({
//指定请求地址的url
url:"${ctx}/user/api/yzLogin",
//指定
type:"post",
data:"check="+check+"&emailOrPhone="+emailPhone+"&yzm="+yzm,
//预期服务器返回的数据类型
dateType:"text",
//服务器响应成功时候的回调函数
success:function(result){
if(result=="登陆成功"){
window.location = "${ctx}/student/msg/list";
}else{
$("#emailOrPhoneTip").text("*"+result);
}
},error:function(xhr, textStatus, err){//服务器响应失败时候的回调函数
alert(xhr);
alert(textStatus);
alert(err)
}
})
})
html
<!-- 面板二开始-->
<li class="mt-tabpage-item">
<form class="form-horizontal" method="post"
action="/taobao/identity/login.action" role="form">
<div class="form-group">
<div class="col-sm-8">
<input class="form-control" value="" placeholder="手机号/邮箱"
type="text" id="emailPhone" name="loginName" />
</div>
</div>
<div class="form-group" style="margin-top: -20px;">
<div class="col-sm-8">
<span id="emailPhoneTips" style="font-size: 12px; color: #F66495;"></span>
</div>
</div>
<div class="form-group">
<div class="col-sm-8">
<div class="input-group">
<input type="text" id="yzm" class="form-control" placeholder="请输入验证码">
<span class="input-group-btn">
<input id="btn" class="btn btn-default" type="button" value="发送">
</span>
</div>
<!-- /input-group -->
</div>
</div>
<div class="form-group" style="margin-top: -20px;">
<div class="col-sm-8">
<span id="emailOrPhoneTip"
style="font-size: 12px; color: #F66495;"></span>
</div>
</div>
<div class="form-group">
<div class="col-sm-8">
<span style="color: red;"></span>
</div>
</div>
<div class="form-group">
<div class="col-sm-8">
<div class="btn-group btn-group-justified" role="group"
aria-label="...">
<div class="btn-group" role="group">
<button id="yzBtn"type="button" class="btn btn-info">
<span class="glyphicon glyphicon-log-in"></span> 登录
</button>
</div>
<div class="btn-group" role="group">
<button type="button" class="btn btn btn-danger">
<span class="glyphicon glyphicon-edit"></span>忘记密码
</button>
</div>
</div>
</div>
</div>
</form>
</li>
<!-- 面板二结束-->