注册时给用户发邮件激活码 , 以及登录操作

注册页面会有如下信息

而在数据库中,其实还有用户uid, 激活码code, 还有state表示用户的状态,如果state=1表示用户已激活,可以正常登陆, state的默认值是0,这个是在user这个实体类中初始化的值,表示注册了还未激活

在index.jsp中有个注册按钮,

<div><a href="${pageContext.request.contextPath }/user?method=registUI">注册</a></div>


点击按钮后跳转到路径为/user的UserServlet上的registUI这个方法上,在这个方法中再跳转到注册的jsp页面上.

public class UserServlet extends BaseServlet {
    public String registUI(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        return "/jsp/register.jsp";
    }


注册的jsp页面上的表单

<form class="form-horizontal" style="margin-top:5px;" action="${pageContext.request.contextPath }/user?method=register" method="post">


当客户输入具体信息后点击注册按钮后,就会跳转到UserServlet的registe方法中

public String  register(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
           
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        
        //封装数据
        User user=new User();
        try {
            //因为我数据库里有个用户id,而这个id不是用户在注册的时候自己填的,而是后台自动生成的,所以我们需要这这里设置一下随机生成 id; 
 
              user.setUid(UUID.randomUUID().toString().replace("-", "").toUpperCase());
 
            //code是激活码,用户注册后要通过邮箱激活码激活;这个也是随机生成的
 
              user.setCode(UUID.randomUUID().toString().replace("-", "").toUpperCase());

  //因为注册页面有个生日选项,在user这个javabean中,数据类型为Date(一般建议为string类型,就不需要转换了)    
            ConvertUtils.register(new DateLocaleConverter(), Date.class);//这个是BeanUtils提供的方法,这一行的代码是固定的,无须改动
 
            BeanUtils.populate(user, request.getParameterMap());
            
            //对用户密码进行加密处理,用到的是md5算法加密,具体代码见下面,这里需注意,因为加密后的密码很长,所以在数据库中password varchar(200),字段长度要大点
 
            user.setPassword(MD5Utils.md5(user.getPassword()));
            
            //调用业务逻辑
            UserService us=new UserServiceImpl();
            us.add(user);
            request.setAttribute("msg", "注册成功,快去邮箱激活吧");
            return "/jsp/msg.jsp";//返回要BaseServlet做转发处理
            
            
            } catch (Exception e) {
        
            e.printStackTrace();
            request.setAttribute("msg", "稍等,出问题了");
            return "/jsp/msg.jsp";//返回要BaseServlet做转发处理
        }
        
    }


而在UserServiceImpl的代码如下:

 public class UserServiceImpl implements UserService {
    /**
     * 注册用户,发送激活邮件
     */
    @Override
    public void add(User user) throws Exception {
       UserDao ud=new UserDaoImpl();
       ud.add(user);
        
       //发送激活邮件
             //email:收件人地址
             //emailMsg:邮件的内容
       String emailMsg="欢迎您注册成为我们的会员,<a href='http://localhost:8080/StoreDemo/user?method=activa&code="+user.getCode()+"'>点击链接激活</a>";
       MailUtils.sendMail(user.getEmail(), emailMsg);//这个是一个工具类,代码见下面解释
        
        
    }
     /**
      * 用户激活
      */
    @Override
    public User findUserByCode(String code) throws Exception {
        UserDao ud=new UserDaoImpl();
        User user=ud.findUserByCode(code);
        if(user==null) {//说明该用户没有注册成功;返回null,在UserServl中会做判断
            return null;
        }
        
        user.setState(1);//如果注册成功了就把用户的状态从初始值0改为1,说明已经激活了
        ud.update(user);
        return user;
        
        
    }
 
}


这里是上面调用的UserDaoImpl里面的方法;

 public class UserDaoImpl implements UserDao {
    /**
     * 用户注册后向数据库里添加该用户
     */
    @Override
    public void add(User user) throws Exception {
          //c3p0Utils是自己写的数据池操作
          QueryRunner qr=new QueryRunner(C3P0Utils.getDatasource());
          
          //向数据库里插入数据(预编译写法)
          String sql="insert into users values(?,?,?,?,?,?,?,?,?,?)";
          
          //写入实际参数
          qr.update(sql, user.getUid(),user.getUsername(),user.getPassword(),user.getName(),user.getEmail(),user.getTelephone(),user.getBirthday(),user.getSex(),user.getState(),user.getCode());
            
        
    }
  /**
      * 用户注册后,通过激活码查询数据库中有没有该用户
      */
    @Override
    public User findUserByCode(String code) throws Exception {
         QueryRunner qr=new QueryRunner(C3P0Utils.getDatasource());
         String sql="select * from users where code=?";
         return qr.query(sql, new BeanHandler<>(User.class), code);
    
    }
    /**
     * 修改用户的state状态为1,则表示已激活,状态初识为0,表示为激活
     * @throws SQLException 
     */
    @Override
    public void update(User user) throws SQLException {
         QueryRunner qr=new QueryRunner(C3P0Utils.getDatasource());
         String sql="update users set username=?,password=?,name=?,email=?,telephone=?,birthday=?,sex=?,state=?,code=? where uid=?";
         qr.update(sql,user.getUsername(),user.getPassword(),user.getName(),user.getEmail(),user.getTelephone(),user.getBirthday(),user.getSex(),user.getState(),null,user.getUid());
        //把code值置null,说明激活码只能用一次,激活后激活码就会置空
    
    }
 
}


   

最后是邮箱发送激活码的工具类的代码,只需3个注释为/**  */的地方代码改为自己的邮箱服务器和账户密码即可
 

public class MailUtils {
 
    public static void sendMail(String email, String emailMsg)
            throws AddressException, MessagingException {
        // 1.创建一个程序与邮件服务器会话对象 Session
 
        Properties props = new Properties();
        //设置发送的协议
        props.setProperty("mail.transport.protocol", "SMTP");
        
        //设置发送邮件的服务器
        props.setProperty("mail.host", "localhost");/**localhost自己根据邮箱服务器修改的,我用的是本地的eyou服务器*/
        
        props.setProperty("mail.smtp.auth", "true");// 指定验证为true
 
        // 创建验证器
        Authenticator auth = new Authenticator() {
            public PasswordAuthentication getPasswordAuthentication() {
                //设置发送人的帐号和密码
                return new PasswordAuthentication("service", "123");/**eyou服务器中设置的管理员的账号密码*/
            }
        };
 
        Session session = Session.getInstance(props, auth);
 
        // 2.创建一个Message,它相当于是邮件内容
        Message message = new MimeMessage(session);
 
        //设置发送者
        message.setFrom(new InternetAddress("service@store.com"));/**eyou服务器中设置的管理员的邮箱账号*/
        //设置发送方式与接收者
        message.setRecipient(RecipientType.TO, new InternetAddress(email)); 
 
        //设置邮件主题
        message.setSubject("用户激活");
        
 
        //设置邮件内容
        message.setContent(emailMsg, "text/html;charset=utf-8");
 
        // 3.创建 Transport用于将邮件发送
        Transport.send(message);
    }
}
最后是密码加密的算法工具类代码
 public class MD5Utils {
    
    public static String md5(String plainText) {
        byte[] secretBytes = null;
        try {   
            secretBytes = MessageDigest.getInstance("md5").digest(
                    plainText.getBytes());
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("找不到md5算法");
        }
        String md5code = new BigInteger(1, secretBytes).toString(16);
        for (int i = 0; i < 32 - md5code.length(); i++) {
            md5code = "0" + md5code;
        }
        return md5code;
    }

 
做完了注册了,接下来就是登录的操作:在首页里,我加了C标签做判断,如果用户已经登录了,就会显示登录后的首页,如果用户没有登录的话,就会显示没有登录前的首页.

<div class="col-md-3" style="padding-top:20px">
    <ol class="list-inline">
    <c:if test="${empty user }"> <!--经常会把test写成text-->
        <li><a href="${pageContext.request.contextPath }/user?method=loginUI">登录</a></li>
        <li><a href="${pageContext.request.contextPath }/user?method=registUI">注册</a></li>
        <li><a href="cart.htm">购物车</a></li>
    </c:if>
    <c:if test="${!empty user }">
         ${user.username }:您好
         <li><a href="${pageContext.request.contextPath }/user?method=logout">退出</a></li>
         
         <li><a href="cart.htm">购物车</a></li>
    </c:if>
</ol>
</div>
用户点击登录的时候会跳转到/user的UserServlet的loginUI这个方法上;
    public String loginUI(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        return "/jsp/login.jsp";
    }


然后再由这个方法请求转发到login.jsp这个页面上;

<font>会员登录</font>USER LOGIN
 
                <div> </div>
                <div>${msg }</div><!--显示下面代码域对象里的信息,"用户名或密码错误"-->
<form class="form-horizontal" action="${pageContext.request.contextPath }/user?method=login" method="post">
  
 <div class="form-group">
    <label for="username" class="col-sm-2 control-label">用户名</label>
    <div class="col-sm-6">
      <input type="text" class="form-control" name="username" placeholder="请输入用户名">
    </div>
  </div>
   <div class="form-group">
    <label for="inputPassword3" class="col-sm-2 control-label">密码</label>
    <div class="col-sm-6">
      <input type="password" class="form-control" name="password" placeholder="请输入密码">
    </div>
 <input type="submit"  width="100" value="登录" name="submit" >
  </div>


点击了登录按钮后,表单会跳转到/user的UserServlet的login这个方法上;

/**
     * 用户登录
     * @param request
     * @param response
     * @return
     * @throws Exception 
     */
    public String login(HttpServletRequest request, HttpServletResponse response) throws Exception {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        
        //获取表单数据
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        
        //因为我们在注册的时候把密码加密了,所以在登录的时候还是要把密码加密,不然和数据库里的密码对不上了
        password = MD5Utils.md5(password);
        
        UserService us=new UserServiceImpl();
        User user=us.findUserByUsernameAndPwd(username,password);
        
        if(user==null) {
            request.setAttribute("msg", "用户名或密码错误");
            return "/jsp/login.jsp";
        }else {//如果数据库里有这个用户,就把它放入session中
            request.getSession().setAttribute("user", user);
            return "/jsp/index.jsp";
        }
        
        
    }


然后就是退出操作了;用户点击退出的时候会跳转到/user的UserServlet的logout这个方法上;

public String logout(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.getSession().invalidate();                                                        //注销用户的时候只要调用invalidate方法注销session就可以了,不需要走Service和Dao
        
        return "/jsp/index.jsp";
    }

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值