继续完成email的整合在在spring里面(今天周末时间多,完善这个功能)
开始需要复写email调用的接口
复写接口类方法(添加参数,还有验证码信息)
//邮件使用的是这个模板(触发失效的这个)
public static boolean send_template(String email, String emailcode) throws Throwable {
final String url = "http://api.sendcloud.net/apiv2/mail/send";
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() == ""&®Email.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;
}
}
前端执行
后台获取数据
邮箱有收到的验证码
前端到后台的业务的email的调用实现了
后面就开始验证和加密的功能的实现
开始准备整合到spring里面
出现空指针异常
最后解决了
把短信验证码和email验证码整合在一起
控制层里面获取的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
这个是email的验证码加密
提交数据测试一下
后台打印的数据 都是加密的数据
数据库里面数据查看
对email的接口调用完成了,还有在开始的注册实现里面对验证码的数据加密,房子被抓包,发现,防止一些恶意的攻击.
今天完成额事情:完成了email的接口整合到spring里面,还有前后端的数据的传输,还有对短信验证码和email验证码用加密传输,还有加固了短信和email的类别的判断,引用了一些正则表达式,来房子恶意的请求过滤了一些字符带来的威胁
今天遇到的困难:最开始复写email接口类,一直在测试,不断的尝试,终于成功了,就是前段的数据传输过来,避免和短信的信息交叉,这个意思需要规避的,还有就是在加密的时候,salt的传递,在不同的模块类salt是不一样的,这个时候需要来解决这个加密后怎么来解密的过程,还有就是在解密的时候对应的值得获取,这个也是今天的空指针出现的原因,就是加密和加密后对应的数据的类的调用,session怎么去调用,怎么去释放,下一次请求的时候code再次刷新
明天的计划:准备熟悉文件上传的插件这个怎么来解决(还有就是明天上班了---时间可能少点 慢慢坚持吧)
1142

被折叠的 条评论
为什么被折叠?



