JavaWeb使用德鲁伊(略)实现登录、激活码注册(发送激活码到邮箱,点击激活链接后,才能正常登陆)、注册界面

时间:2022-07-28
本文章向大家介绍JavaWeb使用德鲁伊(略)实现登录、激活码注册(发送激活码到邮箱,点击激活链接后,才能正常登陆)、注册界面,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

德鲁伊连接池:

https://blog.csdn.net/qq_39773004/article/details/108654255?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160049868219195188354758%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=160049868219195188354758&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_blog_default-2-108654255.pc_v2_rank_blog_default&utm_term=%E5%BE%B7%E9%B2%81%E4%BC%8A&spm=1018.2118.3001.4187

1.1login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录界面</title>
</head>
<body>
    <form method="post" action="usersController?method=login">
        <div class="right fr">您还不是我们的用户?<a href="${pageContext.request.contextPath}/register.jsp" target="_self">立即注册</a></div>
        <input type="text" name="username" id="username"  placeholder="请输入你的用户名"/>
        <input type="text" name="password" id="password"  placeholder="请输入你的密码"/>
        <input type="submit" value="提交">
    </form>

    <span style="color:red">${msg}</span>
</body>
</html>

1.2registerSuccess.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
		<meta http-equiv="X-UA-Compatible" content="IE=edge">
		<meta name="viewport" content="width=device-width, initial-scale=1">
		<link href="css/bootstrap.min.css" rel="stylesheet">
		<script type="text/javascript" src="js/jquery.min.js"></script>
<title>注册成功</title>
</head>
<body>
<form method="post" action="">
	<h1>激活链接</h1>
	<a class="btn btn-danger" href="http://www.hao123.com/mail" target="_blank">立刻激活</a>
</form>
</body>
</html>

1.3message.jsp接收各种信息的jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
		<meta http-equiv="X-UA-Compatible" content="IE=edge">
		<meta name="viewport" content="width=device-width, initial-scale=1">
		<link href="css/bootstrap.min.css" rel="stylesheet">
		<script type="text/javascript" src="js/jquery.min.js"></script>
		
<link rel="stylesheet" type="text/css" href="css/login.css">

<title>注册成功</title>
</head>
<body>
	<p class="text-info" style="font-size: 20px;">${msg }</p>
	<a class="btn btn-default" href="${pageContext.request.contextPath }/index.jsp" target="_blank">返回主页</a>
</body>
</html>

1.4regiter.jsp

<%--
  Created by IntelliJ IDEA.
  User: 49841
  Date: 2020/9/18
  Time: 11:49
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>注册页面</title>
</head>
<body>
    <form method="post" action="usersController?method=register">
        <input type="text" name="uname" placeholder="请输入你的用户名"/>
        <input type="text" name="upassword" placeholder="请输入你的密码"/>
        <input type="text" name="uemail" placeholder="请输入你的邮箱"/>
        <input type="text" name="usex" placeholder="请输入你的性别"/>
        <input type="submit" value="提交"/>
    </form>
<%--    <span style="color:red">${msg}</span>--%>
</body>
</html>

2.UsersController(servlet)

public class UserDaoImpl implements UserDao {
    QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
    //得到叫username的user
    @Override
    public User findUser(String username) throws SQLException {
        String sql = "select u_id as uid,u_name as uname,u_password as upassword,u_email as uemail,u_sex as usex," +
                "u_status as ustatus,u_code as ucode,u_role as urole from user where u_name=?";
        /*User user = qr.query(sql, new BeanHandler<>(User.class), username);
        boolean flag = false;
        if(user!=null&&user.getUpassword().equals(password)){
            flag = true;
        }*/
        return qr.query(sql, new BeanHandler<>(User.class), username);
    }

    //添加注册的数据
    @Override
    public int inserUser(User user) throws SQLException {
        String sql = "insert into user(u_name,u_password,u_sex,u_status,u_email,u_role,u_code) value(?,?,?,?,?,?,?)";
        int i = qr.update(sql, user.getUname(), user.getUpassword(), user.getUsex(), user.getUstatus(), user.getUemail(), user.getUrole(), user.getUcode());
        return i;
    }


    //修改激活码和状态码
    @Override
    public int updataCode(String code) throws SQLException {
        String sql = "update user set u_status=1,u_code=null where u_code=?";
        int i = qr.update(sql, code);
        return i;
    }

    //根据激活码查询状态
    @Override
    public int findStatusByCode(String code) throws SQLException {
        String sql = "select u_status from user where u_code=?";
        Object o = qr.query(sql, new ScalarHandler(), code);
        if(o==null){
            return -1;
        }
        return (Integer)o;
    }


}

2.1UerDao接口

public interface UserDao {
    public User findUser(String username) throws SQLException;
    public int inserUser(User user) throws SQLException;
    public int updataCode(String code) throws SQLException;
    public int findStatusByCode(String code) throws SQLException;
}

2.2UserDaoImpl接口实现类

public class UserDaoImpl implements UserDao {
    QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
    //得到叫username的user
    @Override
    public User findUser(String username) throws SQLException {
        String sql = "select u_id as uid,u_name as uname,u_password as upassword,u_email as uemail,u_sex as usex," +
                "u_status as ustatus,u_code as ucode,u_role as urole from user where u_name=?";
        /*User user = qr.query(sql, new BeanHandler<>(User.class), username);
        boolean flag = false;
        if(user!=null&&user.getUpassword().equals(password)){
            flag = true;
        }*/
        return qr.query(sql, new BeanHandler<>(User.class), username);
    }

    //添加注册的数据
    @Override
    public int inserUser(User user) throws SQLException {
        String sql = "insert into user(u_name,u_password,u_sex,u_status,u_email,u_role,u_code) value(?,?,?,?,?,?,?)";
        int i = qr.update(sql, user.getUname(), user.getUpassword(), user.getUsex(), user.getUstatus(), user.getUemail(), user.getUrole(), user.getUcode());
        return i;
    }


    //修改激活码和状态码
    @Override
    public int updataCode(String code) throws SQLException {
        String sql = "update user set u_status=1,u_code=null where u_code=?";
        int i = qr.update(sql, code);
        return i;
    }

    //根据激活码查询状态
    @Override
    public int findStatusByCode(String code) throws SQLException {
        String sql = "select u_status from user where u_code=?";
        Object o = qr.query(sql, new ScalarHandler(), code);
        if(o==null){
            return -1;
        }
        return (Integer)o;
    }


}

2.3UserService接口

public interface UserService {
    //邮件发送地址
    String url = null;
    public String getUrl();
    public boolean login(String username,String password) throws SQLException;
    public int register(User user) throws SQLException;
    //激活邮件中的激活码
    public int activate(String code) throws SQLException;

}

2.4UserService接口实现类

public class UserServiceImpl implements UserService {
    String url;
    UserDao userDao = new UserDaoImpl();

    @Override
    public String getUrl() {
        return url;
    }

    //判断是否登录成功
    @Override
    public boolean login(String username, String password) throws SQLException {
        User user = userDao.findUser(username);
        boolean flag = false;
        if(user!=null&&user.getUpassword().equals(password)){
            flag = true;
        }
        return flag;
    }

    //添加到数据库-->将激活码发送到邮箱,点击邮箱里面的激活链接:~---->在emailActivate中激活
    @Override
    public int register(User user) throws SQLException {
        //1.添加到数据库
        int i = userDao.inserUser(user);
        try {
            if(i > 0){
                //2.将激活码发送到邮箱,点击邮箱里面的激活链接,激活用户
                String title = "激活邮件发送~~~~~~~";
                String ip = Inet4Address.getLocalHost().getHostAddress();
                String c = Base64Utils.encode(user.getUcode());
                url = "http://"+ip+":8080/usersController?method=emailActivate&c="+c;
                String content = user.getUname()+":<br>您好,<a href='"+url+"'>请点击连接激活账户</a>";
                EmailUtils.sendEmail(title, content, user.getUemail());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return i;
    }

    //判断拥有该验证码的用户是否激活成功
    // findStatusByCode找到-->updataCode删除激活码,改变激活状态
    @Override
    public int activate(String code) throws SQLException {
        int status = userDao.findStatusByCode(code);
        if(status == SysConstant.Status.NOT_ACTIVE.getCode()){//status=0 未激活
            int i = userDao.updataCode(code); //status=1  激活并删除code
            return i;
        }
        return 0;
    }


}

2.5实体类

public class User {
    private int uid;
    private String uname;
    private String upassword;
    private String uemail;
    private String usex;
    private int ustatus;
    private String ucode;
    private int urole;

    @Override
    public String toString() {
        return "User{" +
                "uid=" + uid +
                ", uname='" + uname + ''' +
                ", upassword='" + upassword + ''' +
                ", uemail='" + uemail + ''' +
                ", usex='" + usex + ''' +
                ", ustatus=" + ustatus +
                ", ucode='" + ucode + ''' +
                ", urole=" + urole +
                '}';
    }

    public int getUid() {
        return uid;
    }

    public void setUid(int uid) {
        this.uid = uid;
    }

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public String getUpassword() {
        return upassword;
    }

    public void setUpassword(String upassword) {
        this.upassword = upassword;
    }

    public String getUemail() {
        return uemail;
    }

    public void setUemail(String uemail) {
        this.uemail = uemail;
    }

    public String getUsex() {
        return usex;
    }

    public void setUsex(String usex) {
        this.usex = usex;
    }

    public int getUstatus() {
        return ustatus;
    }

    public void setUstatus(int ustatus) {
        this.ustatus = ustatus;
    }

    public String getUcode() {
        return ucode;
    }

    public void setUcode(String ucode) {
        this.ucode = ucode;
    }

    public int getUrole() {
        return urole;
    }

    public void setUrole(int urole) {
        this.urole = urole;
    }
}

2.6电子有点发送工具类

public class EmailUtils {
	public static void sendEmail(String title,String content,String receiveAccount){
		String myAccount = "498414698@qq.com";
		//发件人 邮箱的 SMTP 服务器地址
		//String SMTPHost = "smtp.163.com";//163
		String SMTPHost = "smtp.qq.com";//qq
		//组成 properties
		Properties prop = new Properties();
		prop.setProperty("mail.transport.protocol", "smtp");//设置协议类型
		prop.setProperty("mail.smtp.host", SMTPHost);//定义发件人的邮箱服务器地址
		prop.setProperty("mail.smtp.auth", "true");//设置请求验证
		//1.Session对象 创建会话 用于和邮箱服务器进行交互
		Session session = Session.getDefaultInstance(prop);
		//设置debug模式 可以查看详细发送信息 可略
		session.setDebug(true);
		
		//2.创建方法 用来组成一封完整的邮件
		//参数 session(参数配置), myAccount 发送方 , user.getEmail() 接收方
		//使用session对象 获取待发送的邮件信息
		MimeMessage message = new MimeMessage(session);
		//3.设置发件人 收件人 标题 邮件内容 附件 发送时间等等
		try {
			//3.1发件人 from
			message.setFrom(new InternetAddress(myAccount, "小米", "utf-8"));
			//3.2收件人 to 支持可以添加多个收件人 | 抄送 | 密送 如果想要发送给多个人 可以重复下面代码多次
			/*
			 * MimeMessage.RecipientType.TO 发送
			 * MimeMessage.RecipientType.CC 抄送
			 * MimeMessage.RecipientType.BCC 密送
			 * */
			message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveAccount,  "utf-8"));
			//3.3生成邮件主题
			message.setSubject(title,"utf-8");
			String ip = Inet4Address.getLocalHost().getHostAddress();//本机ip地址
			//www.xiaomi.com
			//String url = "http://"+ip+":8080/activate?c=");

			//message.setText(content);  普通文本
			//设置邮件正文 setContent 可以使用html标签
			message.setContent(content,"text/html;charset=utf-8");
			//设置邮件的发送时间 是立即发送
			//message.setSentDate(new Date());
			//保存设置
			message.saveChanges();
			//4.利用Transport 发送邮件
			Transport tran = session.getTransport();
			//连接服务器 确认发送方 是否授权
			tran.connect(myAccount,"papawrgiguwdbjaj" );
			//发送邮件 将message 对象 传给 Transport 对象 将邮件发送出去
			//参数1 要发的内容 参数2 要给哪些人发
			//message.getAllRecipients() 获取到所有的收件人 | 抄送 | 密送
			tran.sendMessage(message, message.getAllRecipients());
			//关闭连接
			tran.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

	public  static  void  main(String[]args) throws  Exception{
//		 sendEmail("哈喽","你好","498414698@qq.com");
		System.out.println(Inet4Address.getLocalHost().getHostAddress());


	}


}

2.7参数的工具类

public class SysConstant {

    public  enum  Status{
         NOT_ACTIVE(0),ACTIVE(1);
         int code ;
         Status(int code){
            this.code = code;
         }

        public int  getCode(){
             return  code;
        }

    }


    public  static final int NOT_ACTIVE=0;
    public  static final  int CUSTOMER=0;


    public  static final String FORWARD="forward";
    public  static final String REDIRECT="redirect";
    public  static final String FLAG=":";

    //订单状态 0 未付款,1已经付款未发货 2发货待收货 3 收货待评价 4订单完成 5 退货状态
}

3.BaseController(Servlet)

public class BaseController extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //得到method(controller对应的方法名)
        String method = request.getParameter("method");
        if(method==null){
            //转去首页
            response.sendRedirect("/login.jsp");
        }

        try {
            //得到对象
            Class class1 = this.getClass();
            Object o = class1.newInstance();
            //得到要处理业务的方法:比如说:login
            Method loginMethod = class1.getMethod(method,HttpServletRequest.class,HttpServletResponse.class);

            //设置 Content-type实体报头。
            //一般在Servlet中,习惯性的会首先设置请求以及响应的内容类型以及编码方式:
            if (loginMethod.isAnnotationPresent(ContentType.class)){
                ContentType contentType = loginMethod.getAnnotation(ContentType.class);
                String type = contentType.value();//image/jpeg  application/json;charset=utf-8
                response.setContentType(type);
            }else{
                response.setContentType("text/html;charset=utf-8");
            }
            //调用方法
            Object invoke = loginMethod.invoke(o, request, response);
            //如果有返回值如  return  "forward:index.jsp"
            if(invoke!=null){
                //返回值是String类型---->跳转页面(转发、重定向)
                if(invoke.getClass().getSimpleName().equalsIgnoreCase("String")){
                    String s = (String) invoke;
                    //得到页面的字符串
                    String substring = s.substring(s.indexOf(":") + 1);
                    if(s.startsWith(SysConstant.FORWARD)){
                        request.getRequestDispatcher(substring).forward(request, response);
//                        request.getRequestDispatcher("/test001.jsp").forward(request, response);
                    }else{
                        response.sendRedirect(substring);
                    }
                }else{
                    //需要转json数据
                    String s = new Gson().toJson(invoke);
                    response.getWriter().print(s);
                }
            }


        } catch (Exception e) {
            e.printStackTrace();
        }


    }
}

4.1运行流程一:

1.登陆–>

1.登陆–>2.主页

4.2运行流程二:

1.注册–>

1.注册–>2.注册页面

1.注册–>2.注册页面–>3.(注册完点击提交到)激活界面

1.注册–>2.注册页面–>3.(注册完点击提交到)激活界面–>点击激活链接可以到邮箱界面,从接收到的邮件里面点击立即激活 / 或者自己打开邮箱,从接收到的邮件里面点击立即激活

在写邮件工具类的时候,里面会有一个授权码,这个授权码需要在自己邮箱里面得到,每条1分钱