发表于: 2017-08-09 22:52:33
2 1188
今天完成的事情:
首先完善短信验证码功能
我创建了一个包
CheckSumbuider是官网复制来的,功能是加密请求中的密匙,验证码长度,和当前时间,这个类我没有改动
package com.fanchen.verification;
import java.security.MessageDigest;
/**
* Created by LV on 2016/4/15 0015.
* Email:LvLoveYuForever@gmail.com
*/
public class CheckSumBuilder {
// 计算并获取CheckSum
public static String getCheckSum(String appSecret, String nonce, String curTime) {
return encode("sha1", appSecret + nonce + curTime);
}
// 计算并获取md5值
public static String getMD5(String requestBody) {
return encode("MD5",requestBody);
}
private static String encode(String algorithm, String value) {
if (value == null) {
return null;
}
try {
MessageDigest messageDigest
= MessageDigest.getInstance(algorithm);
messageDigest.update(value.getBytes());
return getFormattedText(messageDigest.digest());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static String getFormattedText(byte[] bytes) {
int len = bytes.length;
StringBuilder buf = new StringBuilder(len * 2);
for (int j = 0; j < len; j++) {
buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);
buf.append(HEX_DIGITS[bytes[j] & 0x0f]);
}
return buf.toString();
}
private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
}
然后是接口验证码接口NetEaseYunxin
package com.fanchen.verification;
/**
* Created by Administrator on 2017/8/8.
*/
public interface NetEaseYunxin {
String send(String phone);
}
再然后是实现
package com.fanchen.verification;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Created by Administrator on 2017/8/9.
*/
@Service
public class NetEaseYunxinImpl implements NetEaseYunxin{
/**
* 发送验证码
*/
//发送验证码的请求路径URL
private static final String
SERVER_URL = "https://api.netease.im/sms/sendcode.action";
//网易云信分配的账号,请替换你在管理后台应用下申请的Appkey
private static final String
APP_KEY = "000000000000";
//网易云信分配的密钥,请替换你在管理后台应用下申请的appSecret
private static final String APP_SECRET = "000000";
//随机数
private static final String NONCE = "123456";
//短信模板ID
//private static final String TEMPLATEID = "3057527";
//验证码长度,范围4~10,默认为4
private static final String CODELEN = "6";
public String send(String phone) {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(SERVER_URL);
String curTime = String.valueOf((new Date()).getTime() / 1000L);
String checkSum = CheckSumBuilder.getCheckSum(APP_SECRET, NONCE, curTime);
// 设置请求的header
httpPost.addHeader("AppKey", APP_KEY);
httpPost.addHeader("Nonce", NONCE);
httpPost.addHeader("CurTime", curTime);
httpPost.addHeader("CheckSum", checkSum);
httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
// 设置请求的的参数,requestBody参数
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
/*
* 1.如果是模板短信,请注意参数mobile是有s的,详细参数配置请参考“发送模板短信文档”
* 2.参数格式是jsonArray的格式,例如 "['13888888888','13666666666']"
* 3.params是根据你模板里面有几个参数,那里面的参数也是jsonArray格式
*/
//
nvps.add(new BasicNameValuePair("mobile", phone));
nvps.add(new BasicNameValuePair("codeLen", CODELEN));
//vps.add(new BasicNameValuePair("templateid", TEMPLATEID));
try {
httpPost.setEntity(new UrlEncodedFormEntity(nvps, "utf-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
// 执行请求
HttpResponse response = null;
try {
response = httpClient.execute(httpPost);
} catch (IOException e) {
e.printStackTrace();
}
/*
* 1.打印执行结果,打印结果一般会200、315、403、404、413、414、500
* 2.具体的code有问题的可以参考官网的Code状态表
*/
String s = null;
try {
s = EntityUtils.toString(response.getEntity(), "utf-8");
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(s);
//判断是否包含200
if (s.contains("200")) {
System.out.println("短信发送成功,验证码为:");
Pattern p=Pattern.compile("(\\d{6})");
Matcher m=p.matcher(s);
if (m.find()){
return m.group(1);
}
}else {
System.out.println("短信发送失败");
}
return null;
}
}
填上自己的AppKey和Id调用接口直接就可以发短信到手机上
@Test
public void netEaseTest(){
String phone="15300000000";
/**发送验证码并存放到缓存,5分钟后过期*/
MemcachedUtil.add(phone,netEaseYunxin.send(phone),new Date(1000*60*5));
}
本来想在注册页面上添加一个获取验证码的功能的,但是奈何不会写页面!搞了半天也不知道怎么实现:"点击获取验证码发送请求,但是不刷新页面的功能"submit会提交所有数据并跳转到from指定页面,无奈最后放弃了.
大概思路是:先验证请求中是否有手机号,如果有就发短信,没有就返回错误信息,用户输入短信从缓存里取出对应的验证码,然后对比是否正确如果正确
就删除验证码跳转到成功页面,否则返回错误信息.
任务7的图片迁移程序大体思路:
就是用腾讯云SDK里的下载方法把图片下载下来,然后上传到七牛云或者别的什么云,难点在于上传后数据库里的链接都失效了,要重新写链接规则,把原来的链接替换掉,不能弄混,嫌麻烦先不弄了
任务8没怎么看,和小伙伴出去耍了耍,看了些面试题,然后结束了这一天
8. 接口和抽象类的区别是什么
1.不同点在于:接口的方法都是抽象的而抽象类可以同时包含抽象和非抽象的方法
2.类可以实现很多接口,但只能继承一个抽象类
3.类如果要实现一个接口,它必须实现接口声明的所有方法,但是类可以不实现抽象类的
所有方法,当然在这种情况下,类也必须声明成抽象的
4.抽象类可以再不提供接口方法的实现的情况下实现接口
5.java接口中声明的变量都是final,抽象类可以包含非final的变量
6.java接口的成员函数都是public的抽象类的成员函数可以使private
7.接口是绝对抽象的,不可以被实例化
9. 构造器是否可以被重写
构造方法是不能被子类重写的,但是构造方法可以重载,也就是说一个类可以有多个构造方法
10. Math.round(11.5)等于多少?Math.round(-11.5)等于多少?
Math.round(11.5)==12 Math.round(-11.5)==-11 round方法返回与方法最接近的长整数
例子:Round
11. String StringBuilder StringBuffer有什么区别
String 用来存放定长字符串
StringBuffer 用来存放变长字符串,如果经常对字符串进行操作,那么使用StringBuffer
如果最后需要转换成定长字符串那么使用StringBuffer的toString方法
StringBuilder 相对StringBuffer来说它执行不同步速度更快
使用String时要特别小心,如果对一个字符串要经常改变的话,就一定不要用String,否则会创建
许多无用对象
12. JVM内存分哪几个区,每个区的作用是什么?
java虚拟机主要分为以下几个区:
方法区:
1.有时候也成为永久带,在该区内很少发生垃圾回收,但是并不代表不发生GC,在这里进行的GC主要
是对方法区里的常量池和对类型的卸载
2.方法区主要用来存储已被虚拟机加载类的 信息 常量 静态变量和即时编译器编译后的代码等数据
3.该数据是被线程共享的
4.方法区里有一个运行时常量池,用于存放静态编译产生的字面量和符号引用,该常量池具有动态性,也
就是说常量并不一定是编译时确定,运行时生成的常量也会存在这个常量池中
虚拟机栈:
1.虚拟机栈也就是我们平时说的栈内存,他为java方法服务,每个方法在执行的时候都会创建一个栈帧,
用于存储 局部变量表 操作数栈 动态链接和方法出口信息
2.虚拟机栈是线程私有的,他的生命周期与线程相同
3.局部变量表里存储的是基本数据类型
本地方法栈:
本地方法栈和虚拟机栈类似,只不过本地方法栈为Native方法服务。
堆:
java堆是所有线程所共享的一块内存,在虚拟机启动时创建,几乎所有的对象实例都在这里
创建,因此该区域经常发生垃圾回收操作,我的世界设置的内存大小就是堆
程序计数器:
内存空间小,字节码解释器工作时通过改变这个计数值可以选取下一条需要执行的字节码指令,
分支 循环 跳转 异常处理 和线程恢复等功能都需要依赖这个计数器完成,该内存区域是java
唯一规定没有OOM情况的区域
OOM,全称“Out Of Memory”,翻译成中文就是“内存用完了”
遇到的苦难:
不会写页面
收获:
复习了一下正则表达式,之前觉得挺难的,现在看觉得挺简单的,这就是蜕变吧
public class reg {
String s="aaaaaaaaaaa123456";
@Test
public void regex(){
Pattern p=Pattern.compile("(\\d{6})");
Matcher m=p.matcher(s);
if (m.find()){
System.out.println(m.group(1));
}
}
}
明天的计划:
学习任务8,这次是真的了
评论