email_API邮件接口调用整合到注册界面

继续完成email的整合在在spring里面(今天周末时间多,完善这个功能)

开始需要复写email调用的接口

复写接口类方法(添加参数,还有验证码信息)

//邮件使用的是这个模板(触发失效的这个)

public static boolean send_template(String email, String emailcode) throws Throwable {

final String url = "api.sendcloud.net/apiv2";

final String apiUser = "thelostworld_test_Zv5RPj";

final String apiKey = "07h9DRlYykPUwrrN";

final String rcpt_to = email;

String subject = "Email验证码";

String html = "\""+email+"你好,邮箱的验证码是 "+ emailcode +" 五分钟后失效,请及时认证!!!";

HttpPost httpPost = new HttpPost(url);

HttpClient httpClient = new DefaultHttpClient();

List<NameValuePair> params = new ArrayList<NameValuePair>();

params.add(new BasicNameValuePair("apiUser", apiUser));

params.add(new BasicNameValuePair("apiKey", apiKey));

params.add(new BasicNameValuePair("to", rcpt_to));

params.add(new BasicNameValuePair("from", "sendcloud@sendcloud.org"));

params.add(new BasicNameValuePair("fromName", "TheLostWorld_本王"));

params.add(new BasicNameValuePair("subject", subject));

params.add(new BasicNameValuePair("html", html));

httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));

HttpResponse response = httpClient.execute(httpPost);

// 处理响应

if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {

// 正常返回, 解析返回数据

System.out.println(EntityUtils.toString(response.getEntity()));

httpPost.releaseConnection();

return true;

} else {

System.err.println("error");

return false;

}

}

前端的email邮件验证

<script>

$(function(){

$(".btn").click(function(){

var disabled = $(".btn").attr("disabled");

var regEmail = /^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/; //邮箱

if(disabled){

return false;

}

if($("#email").val() == ""&&regEmail.test($("#email").val())){

alert("请填写正确的eamil!");

return false;

}

var _inpdisabled = $(".inputCode");

var url = '${pageContext.request.contextPath }/email';

/*得到href的值*/

$.ajax({

url: url, /*url也可以是json之类的文件等等*/

type: 'POST', /*DELETE、POST */

data:'email=' + $("#email").val(),

success: function (result) {

//判断result结果

if (result) {

console.log(result);

/* 放开Code 输入框 */

_inpdisabled.attr("disabled",false);

_inpdisabled.val("请输入邮箱验证码");

settime();

} else {

alert("email发送失败!,请检查email!!!")

}

}

});

});

var countdown=60;

var _get_code = $(".btn");

function settime() {

if (countdown == 0) {

_get_code.attr("disabled",false);

_get_code.val("获取验证码");

countdown = 60;

return false;

} else {

$(".btn").attr("disabled", true);

_get_code.val("重新发送(" + countdown + ")");

countdown--;

}

setTimeout(function() {

settime();

},1000);

}

})

</script>

为了保险我还弄了后台的短信的验证正则表达式

/**

* 验证邮箱

*

* @param email

* @return

*/

public static boolean checkEmail(String email) {

boolean flag = false;

try {

String check = "^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";

Pattern regex = Pattern.compile(check);

Matcher matcher = regex.matcher(email);

flag = matcher.matches();

} catch (Exception e) {

flag = false;

}

return flag;

}

同时也完善了前面的短信验证码短信的验证正则的表达式

**

* 验证手机号码,11位数字,1开通,第二位数必须是这些数字之一 *

* @param mobileNumber

* @return

*/

public static boolean checkMobileNumber(String mobileNumber) {

boolean flag = false;

try {

Pattern regex = Pattern.compile("^(((13[0-9])|(15([0-3]|[5-9]))|(18[0,5-9]))\\d{8})|(0\\d{2}-\\d{8})|(0\\d{3}-\\d{7})$");

// Pattern regex = Pattern.compile("^1[345789]\\d{9}$");

Matcher matcher = regex.matcher(mobileNumber);

flag = matcher.matches();

} catch (Exception e) {

e.printStackTrace();

flag = false;

}

return flag;

}

最后就是控制层的编写

//获取email验证码

@RequestMapping(value = "/email",method=RequestMethod.POST)

@ResponseBody

public Boolean email(String email,HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse)throws Exception{

System.out.println(email);

if(!"".equals(email)&&checkEmail(email)){

String emailcode="";

int emailcode1= (int) (Math.random()*9000+1000);

emailcode= String.format("%s%s", emailcode, emailcode1);

System.out.println(emailcode);

boolean flag= false; //返回给注册页面的flag

try {

flag = SendMail.send_template(email,emailcode);

} catch (Throwable throwable) {

throwable.printStackTrace();

}

HttpSession session=httpServletRequest.getSession();//将verify添加到session里面

session.setAttribute("verify",emailcode);

System.out.println("good");

return flag; //return 返回的是一个jsp页面

}else{

System.out.println("bad");

return false;

}

}

前端执行


v2-55cf03b25b23ce300d6694e9099df592_b.jpg


后台获取数据


v2-ab19c9265dc9b6e0d9b60a200b3db03c_b.jpg


邮箱有收到的验证码


v2-f503e04e579afd3dfdb0d2dee8e515a8_b.jpg


前端到后台的业务的email的调用实现了

后面就开始验证和加密的功能的实现

开始准备整合到spring里面


v2-47268bb6e9d4412ba92a76b70ac721d4_b.jpg


出现空指针异常

最后解决了

把短信验证码和email验证码整合在一起


v2-550e9f28e4d8bcc3464abcb96734c6c2_b.jpg


控制层里面获取的code通过session获取,最开始是在email和phone里面加密,在注册页面里面再解密,这个样不会被抓包获取,解密后面再对对应的数据加密

下面注册的部分核心代码展示:

//获取session里面verify的值

HttpSession session=httpServletRequest.getSession();

String verifying= (String) session.getAttribute("verify");

String salt_phone= (String) session.getAttribute("salt_phone");

String emailcodeing= (String) session.getAttribute("emailcodeing");

String salt_email= (String) session.getAttribute("salt_email");

System.out.println(verifying+"++++++++++");

//验证码解密

String phonecode= DesUtil.decrypt(verifying, CHARSET, salt_phone);

String emailcode= DesUtil.decrypt(emailcodeing, CHARSET, salt_email);

System.out.println("----------------------------" + salt_phone);

if (phonecode.equals(code)&&emailcode.equals(code_email)) {

String salt = CharacterUtils.getRandomString2(8);//随机数

ModelAndView mav = new ModelAndView();

//加密

System.out.println(pwd);

String Pwd = DesUtil.encrypt(pwd, CHARSET, salt);

String phone = DesUtil.encrypt(userIphone, CHARSET, salt);

String phone_code = DesUtil.encrypt(phonecode, CHARSET, salt);

String email_num = DesUtil.encrypt(email, CHARSET, salt);

String email_code = DesUtil.encrypt(code_email, CHARSET, salt);

System.out.println(Pwd);

user.setName(Name);

user.setPwd(pwd);

user.setSalt(salt);

user.setDespwd(Pwd);

user.setPhone(phone);

user.setPhone_code(phone_code);

user.setEmail(email_num);

user.setEmail_code(email_code);

userService.register(user);

mav.addObject("error", "注册成功");

mav.setViewName("/login");

return mav;

}else{

ModelAndView mav = new ModelAndView();

mav.addObject("exist", "验证码错误☹");

mav.setViewName("/register");

return mav;

}

主要是重新加密在最开始生成验证码的时候加密

这个是短信的验证加密存放在session


v2-db03e9c44460aa7b12bde0539cfc7bd7_b.jpg


这个是email的验证码加密


v2-49d3edcc7aa5fd56abaac9d22c1063dc_b.jpg


提交数据测试一下

后台打印的数据 都是加密的数据


v2-db8a9e3bb2b0e8dc1f94fb826bb5ca42_b.jpg


数据库里面数据查看


v2-ec0b533dd7d4b6dc4d5d4dcaf6ce44ca_b.jpg


对email的接口调用完成了,还有在开始的注册实现里面对验证码的数据加密,房子被抓包,发现,防止一些恶意的攻击.


今天完成额事情:完成了email的接口整合到spring里面,还有前后端的数据的传输,还有对短信验证码和email验证码用加密传输,还有加固了短信和email的类别的判断,引用了一些正则表达式,来房子恶意的请求过滤了一些字符带来的威胁


今天遇到的困难:最开始复写email接口类,一直在测试,不断的尝试,终于成功了,就是前段的数据传输过来,避免和短信的信息交叉,这个意思需要规避的,还有就是在加密的时候,salt的传递,在不同的模块类salt是不一样的,这个时候需要来解决这个加密后怎么来解密的过程,还有就是在解密的时候对应的值得获取,这个也是今天的空指针出现的原因,就是加密和加密后对应的数据的类的调用,session怎么去调用,怎么去释放,下一次请求的时候code再次刷新


明天的计划:准备熟悉文件上传的插件这个怎么来解决(还有就是明天上班了---时间可能少点 慢慢坚持吧)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值