注册功能_功能分析
注册的后台功能代码
编写UserService的register方法测试
@Test
public void test03() {
UserService userService = new UserService();
User user = new User();
user.setUsername("jackhello");
user.setPassword("123456");
user.setStatus('Y');
int code = userService.register(user);
System.out.println(code);
}
编写UserDao的方法
//select * from tab_user where username='jackhello3'
User queryUsername(String username);
//insert into tab_user values(null,...)
void save(User user2);
编写对应的mysql语句
<select id="queryUsername" resultType="com.qst.bean.User" parameterType="string">
select * from tab_user where username=#{username}
</select>
<insert id="save" parameterType="com.qst.bean.User" >
insert into tab_user values(null,#{username},
#{password},#{name},#{birthday},#{sex},#{telephone},#{email},#{status},#{code})
</insert>
编写测试方法
@Test
public void test01(){
UserDao userDao= MySessionUtils.getSession().getMapper(UserDao.class);
User user=userDao.queryUsername("12");
System.out.println(user);
}
@Test
public void test02() {
UserDao dao = MySessionUtils2.getMapper(UserDao.class);
User user= new User(33,"jackhello33","jackhello34",new Date(),"jack","男","3333","333@qq.com",'N',"ddd");
// User(int uid, String username, String password, Date birthday, String name, String sex, String telephone, String email, char status, String code)
dao.save(user);
}
编写servlet
Map<String, String[]> map = request.getParameterMap();
User user = new User();
//将请求中的参数赋值给变量
try {
BeanUtils.populate(user,map);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
System.out.println("注册数据1");
//对参数处理
UserService userService = new UserService();
int code = userService.register(user);
System.out.println("注册数据2");
//响应给浏览器
ResponseInfo info = new ResponseInfo();
if(code==1){
info.setData("注册成功");
//用于注册成功后向邮箱发送信息激活
/*
MailUtils.sendMail(user.getEmail(),"<a href='http://localhost:8080/Lvyou/activeServlet?activeCode="+user.getCode()+"'>点击激活途牛旅游账户</a>","激活账户");
*/
}else{//-1,-2,-3
info.setData("注册失败");
}
info.setCode(code);
/*info.setCode(1);
info.setData("注册成功");*/
System.out.println(info.getCode()+info.getCode());
String json =new ObjectMapper().writeValueAsString(info);
System.out.println("注册数据3");
response.getWriter().println(json);
验证码机制
图片验证码效果
Servlet随机生成一个字符串,然后将字符串转成图片,通过响应的字节流写到浏览器的img标签
图片验证码分析
验证码servlet开发
@WebServlet("/checkCode")
public class CheckCodeServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
//服务器通知浏览器不要缓存
response.setHeader("pragma","no-cache");
response.setHeader("cache-control","no-cache");
response.setHeader("expires","0");
//在内存中创建一个长80,宽30的图片,默认黑色背景
//参数一:长
//参数二:宽
//参数三:颜色
int width = 80;
int height = 30;
BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Random rd = new Random();
//获取画笔
Graphics g = image.getGraphics();
//设置画笔颜色为灰色
g.setColor(Color.GRAY);
//填充图片
g.fillRect(0,0, width,height);
//产生4个随机验证码,12Ey
String checkCode = getCheckCode();
//将验证码放入HttpSession中
request.getSession().setAttribute("CHECKCODE_SERVER",checkCode);
//设置画笔颜色为黄色
g.setColor(Color.YELLOW);
//设置字体的小大
g.setFont(new Font("黑体",Font.BOLD,24));
//向图片上写入验证码
g.drawString(checkCode,15,25);
for(int i=0;i<2;i++)
{
g.setColor(new Color(rd.nextInt(120), rd.nextInt(120), rd.nextInt(120)));
g.drawLine(rd.nextInt(75), rd.nextInt(28), rd.nextInt(75), rd.nextInt(28));
}
//将内存中的图片输出到浏览器
//参数一:图片对象
//参数二:图片的格式,如PNG,JPG,GIF
//参数三:图片输出到哪里去
ImageIO.write(image,"PNG",response.getOutputStream());
}
/**
* 产生4位随机字符串
*/
private String getCheckCode() {
String base = "0123456789ABCDEFGabcdefg";
int size = base.length();
Random r = new Random();
StringBuffer sb = new StringBuffer();
for(int i=1;i<=4;i++){
//产生0到size-1的随机值
int index = r.nextInt(size);
//在base字符串中获取下标为index的字符
char c = base.charAt(index);
//将c放入到StringBuffer中去
sb.append(c);
}
return sb.toString();
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
}
前端验证码模块
<tr>
<td class="td_left">
<label for="check">验证码</label>
</td>
<td class="td_right check">
<input type="text" id="check" name="check" class="check" autocomplete="off">
<img src="checkCode" height="32px" alt="" onclick="changeCheckCode(this)">
<script type="text/javascript">
//图片点击事件
function changeCheckCode(img) {
img.src = "checkCode?" + new Date().getTime();
}
</script>
</td>
</tr>
后台获取验证码,并验证
//从请求中获取check1码
String check1 = request.getParameter("check");
//从session中获取check2码
String check2 = (String) request.getSession().getAttribute("CHECKCODE_SERVER");
System.out.println(check1);
System.out.println(check2);
//从session中删除check2码
request.getSession().removeAttribute("CHECKCODE_SERVER");
//比较check1 与 check2
//相同表示验证码不正确,将提示信息写到页面的错误提示
if (check1 == null || !check1.equalsIgnoreCase(check2)) {
//验证码不看大小写
ResponseInfo info = new ResponseInfo();
info.setCode(-4);
info.setData("注册失败,验证码出错");
//json
String json = new ObjectMapper().writeValueAsString(info);
response.getWriter().println(json);
return;
}
邮件激活
工具类
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
public final class MailUtils {
private static final String USER = "XXXX@163.com "; // 发件人称号,同邮箱地址
private static final String PASSWORD = ""; // 客户端授权码,或者登录密码
/* *
*
* @param to 收件人邮箱
* @param text 邮件正文
* @param title 标题
发送验证信息的邮件 */
public static boolean sendMail(String to, String text, String title){
try {
final Properties props = new Properties();
props.setProperty("mail.smtp.host", "smtp.163.com"); // 指定的smtp服务器
props.setProperty("mail.smtp.auth", "true");
props.setProperty("mail.transport.protocol", "smtp");//设置发送邮件使用的协议
// 发件人的账号
props.setProperty("mail.user", USER);
//发件人的密码
props.setProperty("mail.password", PASSWORD);
// 构建授权信息,用于进行SMTP进行身份验证
Authenticator authenticator = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
// 用户名、密码
String userName = props.getProperty("mail.user");
String password = props.getProperty("mail.password");
return new PasswordAuthentication(userName, password);
}
};
// 使用环境属性和授权信息,创建邮件会话
Session mailSession = Session.getInstance(props, authenticator);
// 创建邮件消息
MimeMessage message = new MimeMessage(mailSession);
// 设置发件人
String username = props.getProperty("mail.user");
InternetAddress form = new InternetAddress(username);
message.setFrom(form);
// 设置收件人
InternetAddress toAddress = new InternetAddress(to);
message.setRecipient(Message.RecipientType.TO, toAddress);
// 设置邮件标题
message.setSubject(title);
// 设置邮件的内容体
message.setContent(text, "text/html;charset=UTF-8");
// 发送邮件
Transport.send(message);
return true;
}catch (Exception e){
e.printStackTrace();
}
return false;
}
}
测试代码
public class MailUtilsTest {
@Test
public void sendMail() {
//参1 收件人
//参2 内容
//参3 标题
MailUtils.sendMail("hadoop101@126.com","<a href='http://localhost:8080/lvyou_war_exploded/activeServlet?activeCode=bb26f0d05ea745c5986bc18ff7b4cef9'>点击激活途牛旅游账户</a>","激活账户");
}
}
在注册业务方法中添加发邮件
info.setData("注册成功");
//用于注册成功后向邮箱发送信息激活
MailUtils.sendMail(user.getEmail(),"<a href='http://localhost:8080/Lvyou/activeServlet?activeCode="+user.getCode()+"'>点击激活途牛旅游账户</a>","激活账户");