先补上昨天注册页面的验证码代码:
1 public void doGet(HttpServletRequest request, HttpServletResponse response) 2 throws ServletException, IOException { 3 BufferedImage bf=new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); 4 Graphics2D graphice=(Graphics2D) bf.getGraphics(); 5 graphice.setColor(Color.WHITE); 6 graphice.fillRect(0, 0, WIDTH, HEIGHT); 7 graphice.setColor(Color.BLUE); 8 graphice.drawRect(0, 0, WIDTH-1, HEIGHT-1); 9 String base="abcdefghijklmnopqrstuvwxyz"; 10 Random rand=new Random(); 11 graphice.setColor(Color.RED); 12 graphice.setFont(new Font("微软雅黑",Font.BOLD,20)); 13 StringBuilder sb=new StringBuilder();//存储字符串,创建session 14 int m=13; 15 for(int i=0;i<4;i++) 16 { 17 int index=rand.nextInt(base.length()); 18 char charAt=base.charAt(index); 19 sb.append(charAt); 20 int angle=rand.nextInt(60)-30; 21 double theta=angle*Math.PI/180; 22 graphice.rotate(theta,m,20); 23 graphice.drawString(charAt+"",m,20); 24 graphice.rotate(-theta,m,20); 25 m+=20; 26 } 27 //session 28 request.getSession().setAttribute("vCode",sb.toString());//创建session 29 //干扰线 30 graphice.setColor(Color.GREEN); 31 for(int i=0;i<4;i++) 32 { 33 int x1=rand.nextInt(WIDTH); 34 int x2=rand.nextInt(WIDTH); 35 int y1=rand.nextInt(HEIGHT); 36 int y2=rand.nextInt(HEIGHT); 37 graphice.drawLine(x1, y1, x2, y2); 38 } 39 graphice.dispose(); 40 ImageIO.write(bf, "png", response.getOutputStream()); 41 }
ajax提交的用户名、邮箱、验证码在servlet程序中的处理代码:
1 public void doGet(HttpServletRequest request, HttpServletResponse response) 2 throws ServletException, IOException { 3 String username=request.getParameter("username"); 4 String email=request.getParameter("email"); 5 String validatecode=request.getParameter("validatecode"); 6 User u=new User(); 7 if(!"".equals(username)&&username!=null) 8 { 9 UserService userService=new UserServiceImpl(); 10 //用户名验证请求 11 u.setUsername(username); 12 response.getWriter().print( userService.checkUsername(u)); 13 return; 14 } 15 if(!"".equals(email)&&email!=null) 16 { 17 UserService userService=new UserServiceImpl(); 18 //邮箱验证请求 19 u.setEmail(email); 20 response.getWriter().print( userService.checkEmail(u)); 21 return; 22 } 23 if(!"".equals(validatecode)&&validatecode!=null) 24 { 25 String session = (String) request.getSession().getAttribute("vCode"); 26 27 response.getWriter().print(validatecode.equalsIgnoreCase(session)); 28 return; 29 } 30 request.getRequestDispatcher("/regist.jsp").forward(request, response); 31 }
2、验证所form表单数据后,开始提交数据到servlet程序,进行注册,把数据插入到数据库中,设置新用户的状态为0,然后判断数据插入是否成功,插入成功后,开始发送激活邮件到用户的邮箱中。
1 public void doPost(HttpServletRequest request, HttpServletResponse response) 2 throws ServletException, IOException { 3 User u=new User(); 4 BeanUtils bean=new BeanUtils(); 5 try { 6 //完成注册 7 bean.populate(u, request.getParameterMap());//beanutils把参数绑定到user实体对象中 8 UserService userService=new UserServiceImpl(); 9 boolean b=userService.regist(u); 10 if(b){ 11 request.setAttribute("msg", "请先到邮箱中激活注册,在登陆."); 12 request.getRequestDispatcher("/message.jsp").forward(request, response); 13 } 14 15 } catch (Exception e) { 16 17 e.printStackTrace(); 18 throw new MyRuntimeException(e); 19 } 20 } 21 22 }
插入数据的service:
1 public interface UserService { 2 public boolean checkEmail(User u); 3 public boolean checkUsername(User u); 4 public boolean regist(User u); 5 public boolean active(String code); 6 public User loginUser(User u); 7 }
1 public class UserServiceImpl implements UserService { 2 private static UserDao dao=DaoFactory.getInstance().createDao(UserDao.class); 3 //登录 4 @Override 5 public User loginUser(User u) { 6 u=dao.loginByUser(u); 7 if(u!=null&&u.getState()==0) 8 { 9 throw new MyRuntimeException("你的账户还未激活!!!!!"); 10 } 11 return u; 12 13 } 14 //邮箱在数据库中是否存在 15 @Override 16 public boolean checkEmail(User u) { 17 u = dao.queryUser("email", u.getEmail()); 18 if(u==null) 19 {return true;} 20 return false; 21 } 22 //用户名是否在数据库中存在 23 @Override 24 public boolean checkUsername(User u) { 25 u = dao.queryUser("username", u.getUsername()); 26 if(u==null) 27 {return true;} 28 return false; 29 } 30 //注册用户 31 @Override 32 public boolean regist(User u) 33 { 34 //insert into users 35 u.setActivecode(UUID.randomUUID().toString().replace("-", "")); 36 if(dao.add(u)) 37 { 38 //System.out.println("添加成功!!!"); 39 40 //send a mail 41 Properties props=new Properties(); 42 props.put("mail.transport.protocol","smtp"); 43 props.put("mail,smtp.host", "localhost"); 44 props.put("mail,smtp.auth", "true"); 45 props.put("mail.debug","true"); 46 //session 47 Session session=Session.getDefaultInstance(props); 48 //构建一封邮件 49 try { 50 MimeMessage message=new MimeMessage(session); 51 message.setFrom(new InternetAddress("service@estore.com")); 52 message.setRecipient(RecipientType.TO, new InternetAddress(u.getEmail())); 53 message.setSubject("estore商城激活邮件"); 54 message.setContent("<a href='http://localhost/myestore/active?activecode="+u.getActivecode()+"'>请点击激活:http://localhost/myestore/active?activecode="+u.getActivecode()+"</a>","text/html;charset=utf-8"); 55 //发送 56 Transport trans=session.getTransport(); 57 trans.connect("service","123"); 58 trans.sendMessage(message, message.getAllRecipients()); 59 return true; 60 } catch (Exception e) { 61 e.printStackTrace(); 62 throw new MyRuntimeException("激活邮件发送 失败"); 63 } 64 } 65 return false;//注册失败 66 } 67 //验证激活码 68 @Override 69 public boolean active(String code) { 70 User u=dao.queryUser("activecode", code); 71 if(u==null) 72 { 73 throw new MyRuntimeException("激活码无效"); 74 }else{ 75 if((System.currentTimeMillis()-u.getRegisttime().getTime())>1000L*60*60*24) 76 { 77 //激活码超时24小时 78 dao.deleteByActivecode(u); 79 return false; 80 } 81 else 82 { 83 dao.updateState(u); 84 return true; 85 86 } 87 } 88 } 89 }
3、我本地使用的是EyouMail服务器,下面说一下怎么使用和配置:
如果在没有网络的情况下,可以在邮件eyoumail中随便注册一个账号,用于注册账户接收激活邮件使用,但是在接收邮件时有些注意点,这里我用aaa这个账户为例。service邮箱在给aaa邮箱发送激活邮件时,我们要想接收到这个激活邮件可以再邮件客户端软件配置一下,这里以foxmail为例:
因为是本地网络,而非互联网,所以在配置POP、SMTP时必须写localhost。这样便可顺利接收激活邮件了。
用户登录邮件点击激活后,servler对用户的请求进行处理,去激活用户,改变用户状态为1可用状态。
1 public void doGet(HttpServletRequest request, HttpServletResponse response) 2 throws ServletException, IOException { 3 String code=request.getParameter("activecode"); 4 UserService userService=new UserServiceImpl(); 5 if(!"".equals(code)&&code!=null) 6 { 7 8 if(userService.active(code)) 9 { 10 response.sendRedirect(request.getContextPath()+"/login.jsp"); 11 return; 12 } 13 } 14 response.sendRedirect(request.getContextPath()+"/login.jsp"); 15 }