java后端-强哥带你写旅游网-03注册功能的后端实现以及对新用户进行邮箱注册激活

指定数据的提交地址

当点击注册时,注册的数据,提交到哪里,可以在ajax中指定,如下

java后端-强哥带你写旅游网-03注册功能的后端实现以及对新用户进行邮箱注册激活_第1张图片

此处我是提交到registUserServlet,现在服务端还未创建registUserServlet,那么接下来就开始创建

java后端-强哥带你写旅游网-03注册功能的后端实现以及对新用户进行邮箱注册激活_第2张图片

获取前端提交的数据

注册的流程是拿到前端提交的数据,然后插入到数据库里,我可以通过request.getParameterMap();获取,如下

//1.获取数据
Map map = request.getParameterMap();

获取到的数据是一个键值对,我嫌遍历太麻烦,于是我准备将map中的数据映射到JavaBean里

首先创建一个前端对应数据的JavaBean,在项目里,我已定义好一个User类,它的字段将对应到html中表单的字段

java后端-强哥带你写旅游网-03注册功能的后端实现以及对新用户进行邮箱注册激活_第3张图片

将表单数据映射到User对象

User user = new User();
try {
    BeanUtils.populate(user,map);
} catch (IllegalAccessException e) {
    e.printStackTrace();
} catch (InvocationTargetException e) {
    e.printStackTrace();
}

将表单数据插入到数据库

在service中,创建一个UserService接口,如下

java后端-强哥带你写旅游网-03注册功能的后端实现以及对新用户进行邮箱注册激活_第4张图片

再创建UserService的实现类

java后端-强哥带你写旅游网-03注册功能的后端实现以及对新用户进行邮箱注册激活_第5张图片

编写具体的注册逻辑

首先去数据库查询该用户是否存在,若存在则不插入,反之就要插入

但现在我还没有操作数据库的对象,因此,我要先去创建操作数据库的对象,才能开始后续。

先创建UserDao

java后端-强哥带你写旅游网-03注册功能的后端实现以及对新用户进行邮箱注册激活_第6张图片

创建UserDao的实现类

public class UserDaoImpl implements UserDao {

    private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());

    @Override
    public User findByUsername(String username) {
       

        return null;
    }

    @Override
    public void save(User user) {
     
    }
    

    /**
     * 根据用户名和密码查询的方法
     * @param username
     * @param password
     * @return
     */
    @Override
    public User findByUsernameAndPassword(String username, String password) {

        return null;
    }
}

在Dao层,开始具体的去和数据库进行交互,先完善findByUsername

@Override
public User findByUsername(String username) {
    User user = null;
    try {
        //1.定义sql
        String sql = "select * from tab_user where username = ?";
        //2.执行sql
        user = template.queryForObject(sql, new BeanPropertyRowMapper(User.class), username);
    } catch (Exception e) {

    }

    return user;
}

完善Save

@Override
public void save(User user) {
    //1.定义sql
    String sql = "insert into tab_user(username,password,name,birthday,sex,telephone,email,status,code) values(?,?,?,?,?,?,?,?,?)";
    //2.执行sql

    template.update(sql,user.getUsername(),
                user.getPassword(),
            user.getName(),
            user.getBirthday(),
            user.getSex(),
            user.getTelephone(),
            user.getEmail(),
            user.getStatus(),
            user.getCode()
            );
}

完善findByUsernameAndPassword

@Override
public User findByUsernameAndPassword(String username, String password) {
    User user = null;
    try {
        //1.定义sql
        String sql = "select * from tab_user where username = ? and password = ?";
        //2.执行sql
        user = template.queryForObject(sql, new BeanPropertyRowMapper(User.class), username,password);
    } catch (Exception e) {

    }

    return user;
}

写完Dao后,继续在service层中完善注册逻辑

    @Override
    public boolean regist(User user) {

        //1.根据用户名查询用户对象
        User u = userDao.findByUsername(user.getUsername());
        //判断u是否为null
        if(u != null){
            //用户名存在,注册失败
            return false;
        }
        //2.保存用户信息
        userDao.save(user);
        return true;
    }

回到RegistUserServlet,调用UserServiceImpl去完成注册

UserService service = new UserServiceImpl();
boolean flag = service.regist(user);
ResultInfo info = new ResultInfo();
//4.响应结果
if(flag){
    //注册成功
    info.setFlag(true);
}else{
    //注册失败
    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);

添加验证码的功能

验证码的获取是通过checkCode,由于html具备缓存,图片链接地址若不变,则不会进行重新请求,因此,需要在checkCode后追加变化的时间值,这样做的目的仅仅是希望,我每次点击验证码时,浏览器都能重新帮我发送请求,获取新的验证码

java后端-强哥带你写旅游网-03注册功能的后端实现以及对新用户进行邮箱注册激活_第7张图片

checkCode对应的Servlet我已提供,你无需编写

java后端-强哥带你写旅游网-03注册功能的后端实现以及对新用户进行邮箱注册激活_第8张图片

在注册的时候校验验证码

验证码的获取已经搞定,继续回到注册,当你点击注册时,数据已经被提交给/registUserServle,此时应该在这个servelt里去判断验证码是否正确

//验证校验
String check = request.getParameter("check");
//从sesion中获取验证码
HttpSession session = request.getSession();
String checkcode_server = (String) session.getAttribute("CHECKCODE_SERVER");
session.removeAttribute("CHECKCODE_SERVER");//为了保证验证码只能使用一次
//比较
if(checkcode_server == null || !checkcode_server.equalsIgnoreCase(check)){
    //验证码错误
    ResultInfo info = new ResultInfo();
    //注册失败
    info.setFlag(false);
    info.setErrorMsg("验证码错误");
    //将info对象序列化为json
    ObjectMapper mapper = new ObjectMapper();
    String json = mapper.writeValueAsString(info);
    response.setContentType("application/json;charset=utf-8");
    response.getWriter().write(json);
    return;
}

邮箱激活用户

java后端-强哥带你写旅游网-03注册功能的后端实现以及对新用户进行邮箱注册激活_第9张图片

在注册的时候,通常有注册激活的功能,此举目的是为了检验用户的有效性,即判断这个用户是机器人注册的,还是正常用户注册的。

激活实现原理如下

实现代码

@Override
public boolean regist(User user) {
    //1.根据用户名查询用户对象
    User u = userDao.findByUsername(user.getUsername());
    //判断u是否为null
    if(u != null){
        //用户名存在,注册失败
        return false;
    }
    //2.1设置激活码,唯一字符串
    user.setCode(UuidUtil.getUuid());
    //2.2设置激活状态
    user.setStatus("N");
    //2.保存用户信息
    userDao.save(user);

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

    String content="点击激活【旅游网】";

    MailUtils.sendMail(user.getEmail(),content,"激活邮件");

    return true;
}

 邮件发送代码

邮件发送功能,我已封装好一个工具类,你在使用时,只需更改USER,PASSWORD就行。

此处我已提供好一个测试邮箱的账号和授权密码,请各位切勿用于非发滥用。

点击激活的实现

java后端-强哥带你写旅游网-03注册功能的后端实现以及对新用户进行邮箱注册激活_第10张图片

点击激活是一个链接,它是由/activeUserServlet进行处理

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //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 = "激活成功,请登录";
        }else{
            //激活失败
            msg = "激活失败,请联系管理员!";
        }
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().write(msg);
    }

}

项目地址https://gitee.com/cxyhq2020/Mytravel.git

java后端-强哥带你写旅游网-03注册功能的后端实现以及对新用户进行邮箱注册激活_第11张图片

 

你可能感兴趣的:(javaee)