黑马旅游 记录2

后台代码的实现主要包括service,dao和servlet层。
注册功能的后台代码写完以后,点击注册按钮跳转至404页面。问题暂时未解决。

后台描述

验证码校验功能

在获取数据前先进行验证码的校验
在RegistUserServlet中编写代码


        //验证校验
        String check=request.getParameter("check");

        //从session中获取验证码
        HttpSession session=request.getSession();

        String checkcode_server=(String) session.getAttribute("CHECKCODE_SERVER");

        //为了保证验证码只能使用一次
        session.removeAttribute("CHECKCODE_SERVER");

        //比较
        if (!checkcode_server.equalsIgnoreCase(check)){
            //验证码错误
            ResultInfo info=new ResultInfo();

            //验证失败
            info.setFlag(false);
            info.setErrorMsg("验证码错误");


            //将info对象序列化为json
            ObjectMapper mapper=new ObjectMapper();
            String json=mapper.writeValueAsString(info);

            // 将json数据写回到客户端
            //设置content-type
            response.setContentType("application/json;charset=utf-8");
            response.getWriter().write(json);
            return;

        }

错误::发现在regist.html中无法获得ResultInfo.java的变量。

邮箱激活

  1. 发送验证邮件
    在MailUtil工具类中加入以下代码:

**

**    /* 发送验证信息的邮件 */
    public static boolean sendMail(String to, String text, String title){
        try {
            final Properties props = new Properties();
            props.put("mail.smtp.auth", "true");
            props.put("mail.smtp.host", "smtp.qq.com");

            // 发件人的账号
            props.put("mail.user", USER);
            //发件人的密码
            props.put("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;
    }**

我出现错误,控制台显示发送邮件成功,但是我没有收到邮件。
**

2 .用户激活
思路:激活主要是修改对应用户的status字段。
激活过程

在UserServiceImpl中设置激活码,唯一激活码的实现用Java中的类Uuid。
然后设置激活状态。以及设置激活邮件的正文。

    //2.1 设置激活码,唯一字符串
        user.setCode(UuidUtil.getUuid());
        //2.2 设置激活状态
        user.setStatus("N");
        userDao.save(user);

        userDao.save(user);

        //3.发送激活邮件的正文?

        String content="<a href='http://loaclhost:/MyTravel/activeUserServlet?code="+user.getCode()+">点击激活【黑马旅游网】</a>";
        MailUtils.sendMail(user.getEmail(),content,"激活邮件");

用户点击激活邮件,用户激活邮箱
ActiveUserServlet 激活

        //1 获取激活码
        String code=request.getParameter("code");
        if (code!=null){
            //2 调用service完成激活
            UserService service=new UserServiceImpl();
            boolean flag=service.active(code);

            //3 判断标记
            String msg=null;
            if (flag){
                // 激活成功
                msg="激活成功,请<a href='login.html'>登录</a>";
            }else {
                msg="激活失败,请重新激活";
            }

            response.setContentType("text/html;charset=utf-8");
            response.getWriter().write(msg);
        }

UserService 激活用户
同时也要保存和更新用户的status和code;

    @Override
    public boolean active(String code){
        //1 根据激活码查询用户对象
        User user=userDao.findByCode(code);

        if (user!=null){
            // 2 调用dao的修改激活状态的方法
            userDao.updateSttus(user);
            return  true;
        }else {
            return  false;
        }

    }

UserDao :findByCode,updteStatus;

    @Override
    public User findByCode(String code) {
        User user=null;
        try {
            String sql="select * from tab_user where code= ?";

            user=template.queryForObject(sql,new BeanPropertyRowMapper<User>(User.class),code);
        } catch (DataAccessException e) {
            e.printStackTrace();
        }
        return user;
    }

    @Override
    public void updateSttus(User user) {

        String sql="update tab_user set status='Y' where uid=?";
        template.update(sql,user.getUid());

    }

登录功能

登录逻辑分析

后台代码实现:
LoginServlet:

        //1 获取用户名和密码数据
        Map<String,String[]> map=request.getParameterMap();
        //2 封装User对象
        User user=new User();
        try {
            BeanUtils.populate(user,map);
        } catch (IllegalAccessException e) {

        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        //3 调用Service查询
        UserService service=new UserServiceImpl();
        User u=service.login(user);

        ResultInfo info=new ResultInfo();
        //4 判断用户对象是否为null
        if (u==null){
            //用户名密码错误
            info.setFlag(false);
            info.setErrorMsg("用户名密码错误");

        }
        //5 判断用户是否激活
        if (u!=null&&!"Y".equals(u.getStatus())){
            //用户尚未激活
            info.setFlag(false);
            info.setErrorMsg("用户尚未激活");
        }

        //6 判断登录成功
        if (u!=null&&!"N".equals(u.getStatus())){
            info.setFlag(true);

        }

        //响应数据
        ObjectMapper mapper=new ObjectMapper();
        response.setContentType("application/json;charset=utf-8");

        mapper.writeValue(response.getOutputStream(),info);

    }

service中实现 login方法代码:

    @Override
    public User login(User user) {
        return userDao.findByUsernameAndPassword(user.getUsername(),user.getPassword());
    }

前台代码login.html

©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值