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();//存储字符串,创建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     }
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     @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 }
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
原文地址:https://www.cnblogs.com/cmds/p/3901626.html