首页 > 代码库 > estore商城案例(一)------用户注册&邮件激活(下)

estore商城案例(一)------用户注册&邮件激活(下)

先补上昨天注册页面的验证码代码:

 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();//存储字符串,创建session14         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         //session28         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     }
View Code

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     }
View Code

 

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 }
View Code

插入数据的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 }
View Code
 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     @Override16     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     @Override24     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     @Override32     public boolean regist(User u)33     {34         //insert into users35         u.setActivecode(UUID.randomUUID().toString().replace("-", ""));36         if(dao.add(u))37         {38             //System.out.println("添加成功!!!");39         40         //send a mail41         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         //session47         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://www.mamicode.com/‘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     @Override69     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             else82             {83                 dao.updateState(u);84                 return true;85                 86             }87         }88     }89 }
View Code

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     }
View Code