【JavaMailWeb】用户注册通过邮箱激活案例

转载请注明出处: http://blog.csdn.net/qq_26525215

本文源自【大学之旅_谙忆的博客】

前面刚刚学习了JavaMail技术,现在来应用到项目中试试~

网站用户注册:

主要实现如下两个功能:
1、用户在网站上注册完成后给用户发一封邮件。
2、用户通过邮件激活后才可以登录。

思路:

首先需要一个思路:

用户在前台点击注册,向servlet提交请求,把用户提交过来的信息封装成一个JavaBean(需要的信息有name,pwd,email这3个是用户填写的,我们帮用户生成的是id和一个邮箱激活链接地址的唯一标识码acode,还要一个用来识别用户是否已经点击链接的变量active)。
servlet调用service层,service层再去调用dao层,dao再去访问数据库,
生成2个uuid分别赋值给id和acode。通过用户是否点击激活链接(url?acode=******)新写一个servlet来判断用户是否点击链接激活。

用户点了激活链接后,再自动跳转到登录页面!

【数据库的字段名和JavaBean的成员变量名最好统一,方便自己写代码与查错】

通过下面的图片可以更好的帮你理解:

实例:

源代码

创建users表:

先准备好数据库hncu:
创建一个表:

create table users(id varchar(32) primary key,name varchar(30),pwd varchar(32),email varchar(80),active char(1),acode varchar(32)
);

需要准备的JAR包

链接:-如果链接失效-可以私信我
https://github.com/chenhaoxiang/Java/tree/master/myMailWeb/WebRoot/WEB-INF/lib

发送邮件的线程:MySendMailThread

必须用线程来做,否则网站的效率会很差。

可以想象,如果不用线程,直接servlet 中在用户请求注册后给他发邮件,然后再跳转页面,这明显很慢吧,我们需要去请求邮箱的服务器,然后邮箱的服务器需要向令一个邮箱请求,然后最后才能返回到我们这里,才能页面返回内容,这样,用户岂不是要等很久。我们如果用多线程,只要把那个线程new出来就可以了,要怎么去发邮件是那个线程的事,与我这个主线程没关系,我负责直接通知用户邮件发送成功就可以了,这样速度显然快多了。

package cn.hncu.reg.sendMail;import java.security.GeneralSecurityException;
import java.util.Properties;import javax.mail.Authenticator;
import javax.mail.Message.RecipientType;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;import com.sun.mail.util.MailSSLSocketFactory;import cn.hncu.domain.User;public class MySendMailThread extends Thread {private User user = null;public MySendMailThread(User user) {this.user = user;}@Overridepublic void run() {// 跟smtp服务器建立一个连接Properties p = new Properties();// 设置邮件服务器主机名p.setProperty("mail.host", "smtp.qq.com");// 指定邮件服务器,默认端口 25// 发送服务器需要身份验证p.setProperty("mail.smtp.auth", "true");// 要采用指定用户名密码的方式去认证// 发送邮件协议名称p.setProperty("mail.transport.protocol", "smtp");// 开启SSL加密,否则会失败MailSSLSocketFactory sf = null;try {sf = new MailSSLSocketFactory();} catch (GeneralSecurityException e1) {e1.printStackTrace();}sf.setTrustAllHosts(true);p.put("mail.smtp.ssl.enable", "true");p.put("mail.smtp.ssl.socketFactory", sf);// 开启debug调试,以便在控制台查看// session.setDebug(true);也可以这样设置// p.setProperty("mail.debug", "true");// 创建sessionSession session = Session.getDefaultInstance(p, new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {// 用户名可以用QQ账号也可以用邮箱的别名PasswordAuthentication pa = new PasswordAuthentication("chenhaoxiang0117", "jnj***********ab");// 后面的字符是授权码,用qq密码不行!!return pa;}});session.setDebug(true);// 设置打开调试状态try {// 声明一个Message对象(代表一封邮件),从session中创建MimeMessage msg = new MimeMessage(session);// 邮件信息封装// 1发件人msg.setFrom(new InternetAddress("61******29@qq.com"));// 2收件人msg.setRecipient(RecipientType.TO, new InternetAddress(user.getEmail()));// 3邮件内容:主题、内容msg.setSubject(user.getName() + ",欢迎注册***账号,请点击链接激活账号");// StringBuilder是线程不安全的,但是速度快,这里因为只会有这个线程来访问,所以可以用这个StringBuilder sbd = new StringBuilder();sbd.append(user.getName() + "<br/>欢迎!请确认此邮件地址以激活您的账号。<br/>");sbd.append("<font color='red'><a href='http://192.168.1.102:8080/myMailWeb/ActiveServlet?acode="+ user.getAcode() + "' target='_blank'");sbd.append(">立即激活</a></font><br/>");sbd.append("或者点击下面链接:<br/>");sbd.append("http://192.168.1.102:8080/myMailWeb/ActiveServlet?acode="+ user.getAcode() + "<br/>");sbd.append("这是一封自动发送的邮件;如果您并未要求但收到这封信件,您不需要进行任何操作。");msg.setContent(sbd.toString(), "text/html;charset=utf-8");// 发html格式的文本// 发送动作Transport.send(msg);System.out.println("给" + user.getEmail() + "发送邮件成功。");} catch (AddressException e) {e.printStackTrace();} catch (MessagingException e) {e.printStackTrace();}}
}

index.jsp:

主页,表单提交通过按钮点击事件监听来提交表单。

然后分别设置表单的action值,这样一个表单可以实现访问多个servlet。

如果要做好一点,可以添加ajax格式实时验证和验证码验证

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>带邮箱激活的注册模块</title><script type="text/javascript">function reg(){//省略: 表单数据格式校验--还有ajax实现的验证码document.forms[0].action="<c:url value='RegServlet'/>";document.forms[0].submit();}function login(){document.forms[0].action="<c:url value='LoginServlet'/>";document.forms[0].submit();}</script></head><body><c:if test="${!empty sessionScope.error}">登录失败!<c:remove var="error" scope="session"/></c:if><c:if test="${empty sessionScope.user}" var="boo"><form action="" method="post">姓名:<input type="text" name="name" /> <br/>密码:<input type="password" name="pwd" /> <br/>邮箱:<input type="text" name="email" />-登录不用填写邮箱 <br/><input type="button" value="注册" onclick="reg();"/> &nbsp;<input type="button" value="登录" onclick="login();"/> &nbsp; <input type="reset" value="重置"/> </form></c:if><c:if test="${!boo}">登录成功<br/>欢迎你,亲爱的${user.name}</c:if></body>
</html>

c3p0线程池配置文件:

这个配置没啥好讲的,大家都是按这个格式来的。

注意取名,一定要取:c3p0-config.xml
否则无法读取的。

还有路径:需要在你项目的bin目录下,当然,你放src目录下也是可以的,因为myeclipse会自动把src目录下不是.java后缀的文件原样拷贝到对应的bin文件夹下面,src目录下对应的就是bin目录。

<c3p0-config><!-- 默认配置,如果没有指定则使用这个配置 --><default-config><property name="driverClass">com.mysql.jdbc.Driver</property><property name="jdbcUrl"><![CDATA[jdbc:mysql://127.0.0.1:3306/hncu?useUnicode=true&characterEncoding=utf-8]]></property><property name="user">root</property><property name="password">1234</property><!-- 初始化池大小 --><property name="initialPoolSize">2</property><!-- 最大空闲时间 --><property name="maxIdleTime">30</property><!-- 最多有多少个连接 --><property name="maxPoolSize">10</property><!-- 最少几个连接 --><property name="minPoolSize">2</property><!-- 每次最多可以执行多少个批处理语句 --><property name="maxStatements">50</property></default-config> 
</c3p0-config> 

过滤器-实现全站编码

过滤器,很强悍的一个技术。这个必须要会。

package cn.hncu.filter;import java.io.IOException;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;public class CharsetFilter implements Filter{private String charset=null;@Overridepublic void init(FilterConfig filterConfig) throws ServletException {charset = filterConfig.getInitParameter("charset");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {request.setCharacterEncoding(charset);response.setContentType("text/html;charset="+charset);chain.doFilter(request, response);}@Overridepublic void destroy() {}}

点击邮件激活地址后的页面:result.jsp

这个就是点击注册链接后的返回页面。

根据DAO层的不同返回值,实现了分别对用户显示不同的提示。

添加了网页自动跳转!

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>带邮箱激活的注册模块</title><script type="text/javascript">var tm;     var i=5;function time(){i--;div1.innerHTML = i+"秒钟以后,自动去登录!";if(i<1){window.clearInterval(tm);//将定时器清除window.location.href="<c:url value='index.jsp'/>";      }}onload=function(){tm = window.setInterval(time, 1000);};</script></head><body><c:if test="${count==-1}">服务器异常,请重新激活!<br/><a href="<c:url value='/index.jsp'/>">登录</a><br/><div id="div1"></div></c:if>   <c:if test="${count==0}">激活地址错误,请使用正确的激活地址!<br/><a href="<c:url value='/index.jsp'/>">登录</a><br/><div id="div1"></div></c:if>   <c:if test="${count==1}">你已经激活过,请勿重复激活!<br/><a href="<c:url value='/index.jsp'/>">登录</a><br/><div id="div1"></div></c:if>   <c:if test="${count==2}">激活成功,欢迎去登录!<br/><a href="<c:url value='/index.jsp'/>">登录</a><br/><div id="div1"></div></c:if>   </body>
</html>

LoginDaoJdbc-用户登录DAO实现类

这里用到了c3p0和dbutils,在query方法中,new BeanHandler<User>(User.class) 此句可以直接给我们返回一个User对象!

package cn.hncu.login.dao;import java.sql.SQLException;import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;import cn.hncu.domain.User;
import cn.hncu.pubs.C3p0Pool;public class LoginDaoJdbc implements LoginDAO{public User login(User u){String sql = "select * from users where name=? and pwd=? and active='1' ";QueryRunner run = new QueryRunner(C3p0Pool.getDataSource());try {User user = run.query(sql, new BeanHandler<User>(User.class) , u.getName(),u.getPwd());return user;} catch (SQLException e) {e.printStackTrace();return null;}}
}

还有很多代码,就不一一列出了,
项目应用MVC框架思想,注意分层。

演示结果:

激活的原理很简单,我们链接后面向我们的ActiveServlet传递了一个acode参数,用这个参数的值(UUID生成的)到后台去校验,以让用户通过验证!

完整的项目源代码链接:

https://github.com/chenhaoxiang/Java/tree/master/myMailWeb

转载请注明出处: http://blog.csdn.net/qq_26525215

本文源自【大学之旅_谙忆的博客】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/26600.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谷歌邮箱SMTP小白教程

废话不多说&#xff01; 谷歌邮箱地址&#xff1a;https://www.google.com/intl/zh-CN_cn/gmail/about/ 注册后&#xff0c;第一步 打开IMAP&#xff0c;查看所有设置 设置 -> 转发和POP/IMAP 第二步&#xff0c;设置授权码 验证完账户密码后需要手机验证 输入验证码 验证…

激活注册邮箱

一、目标 对注册时填写的邮箱进行激活,当注册成功以后,会显示一个前往激活邮箱的按钮,点击即可登录邮箱激活. 情况1:修改了邮箱账号或者激活码,激活失败error;情况2:在指定时间内未激活,激活失败,重新获取激活码再次激活error;情况3:在符合条件的情况下,连续两次激活,第二次激…

一文教你学会实现以邮件激活的注册账户代码

实现思路 通常&#xff0c;我们在进行各大平台进行注册账户时&#xff0c;都会在邮箱收到一封激活邮件&#xff0c;而在点击其中的激活链接之后&#xff0c;我们就能够激活账户&#xff0c;否则&#xff0c;我们将无法正常使用账户&#xff0c;这使得服务平台所拥有的激活用户…

实现邮箱激活账号功能

原文地址&#xff1a;http://blog.sina.com.cn/s/blog_636ed7d00100nss0.html 我们在注册大型网站的时候&#xff0c;比如像新浪&#xff0c;阿里巴巴网站的时候&#xff0c;填写完注册信息后&#xff0c;都会给用户的邮箱发送一个激活注册账号的邮件&#xff0c;让我们激活&am…

别把 OpenAI 太当回事,它远未达到替换前端的地步

最近几个月&#xff0c;我和很多初入行的开发人员交谈&#xff0c;他们对AI越来越感到焦虑。他们看到像GPT-4这样的工具展示的越来越令人印象深刻的演示&#xff0c;担心等他们掌握了HTML/CSS/JS&#xff0c;就没有任何工作机会了。这种情绪现在在Twitter上广泛存在&#xff1a…

AI 时代,知识工作者的生存指南

最近&#xff0c;大家可能已经见识过 AI 的威力了吧&#xff0c;以 ChatGPT 为代表的 人工智能&#xff08;AI&#xff09;展现出接近人一样的回答水准。 来自 Craft AI Assitant AI 就在那里&#xff0c;是房间里的大象&#xff0c;大家不能总装做对自己没有影响。要知道&…

这 13 种职业用AI提效的 40 类场景盘点

随着人工智能技术的发展&#xff0c;职业领域出现了诸如我们“小蜜蜂助手Beezy”等神奇的工具&#xff0c;大幅度提升了各行各业里从业人员的工作效率。 笔者今天将详述13种常见职业&#xff0c;分别是如何利用这些工具在实际工作过程中来帮助自己提升效率的。大量干货和私藏宝…

【猫娘小可爱频道】闲聊+1

本篇是居士养的一只喵&#xff0c;看了一个视频后的观后感&#xff0c;视频已附在文章末尾&#xff0c;可点击小程序观看。 欢迎大家讨论~ 喵喵看这个视频突然产生的一个想法&#xff0c;是比较有实感的感觉到了时间的美感或者四维时间轴对事物的影响。就是有时候很美的东西是某…

文心一言实际测试——让我们拿实际说好坏

文心一言实际测试——让我们拿实际说好坏 4月16日&#xff0c;文心一言闪亮登场&#xff0c;就关于大家最关心的几个问题&#xff0c;让我们一起来看看效果吧~ 创作能力&#xff1a; 听说飞桨高校领航团缺少一个slogan&#xff0c;让我们听听文心一言怎么说 “聚焦科研&am…

网络编程的开始(猫娘和汪君的凄美爱情故事)

现在让我们&#xff08;快乐的&#xff09;来学习java中的网络编程 &#xff08;猫娘和汪君在最后&#xff09; 一、认识InetAddress 1.首先通过查阅API帮助文档 我们知道&#xff0c;InetAddress是net包下的一个类&#xff0c;表示互联网协议&#xff08;IP&#xff09;地址。…

IT 领导者揭示了对 ChatGPT 的网络恐惧

根据黑莓的最新研究&#xff0c;大多数(51%)安全领导者预计ChatGPT将在一年内成为成功的网络攻击的核心。 对北美、英国和澳大利亚的1500名IT决策者的调查还发现&#xff0c;71%的人认为民族国家可能已经将该技术用于针对其他国家的恶意目的。 ChatGPT是由OpenAI开发的人工…

一群中国芯片技术小球的奋斗故事系列:“中科融合的AI-3D芯片追赶美国德州仪器DLP技术之产业和技术初探-part III”

引子 2023年初春&#xff0c;冬雪未化&#xff0c;ChatGPT和GPT4一声惊雷&#xff0c;以颠覆的表现震惊全球&#xff0c;被称之为AI的“iPhone时刻”。微软全线产品迅速导入&#xff0c;生产力工具与搜索&#xff0c;经过了30年&#xff0c;再次分久必合&#xff01;全世界人民…

干货!来自北大、KAUST、斯坦福、达摩院的大模型前沿动态:表格推理、代码生成、MiniGPT-4、生成式推理...

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; ChatGPT的发布使得国内外众多的研究机构掀起了一股AI热潮&#xff0c;而这也进一步推动了人们对大语言模型的深入研究。2023年4月26日&#xff0c;AI TIME举办的大模型专场四活动邀请了阿里巴巴达摩院NLP研究员…

5月25日活动报名 | 与五位来自AI产业和开发者工具服务领域的大咖一起思辨代码自动生成...

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 10年内AI会淘汰程序员这个职业么&#xff1f; AI技术的发展已经给我们带来了很多的变化&#xff0c;尤其是在计算机编程领域&#xff0c;基于大模型能力的代码生成工具在这1年来得到了越来越多的关注&#xff0…

永远年轻,永远在路上的AI TIME

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 在2019年的智源人工智能大会上&#xff0c;我第一次接触AI TIME&#xff0c;时至今日&#xff0c;加入AI TIME已经四年了。在过去的四年里&#xff0c;AI技术、产业发生了翻天覆地的变化&#xff0c;我自己的思…

除了AIGC,2023年还要面临哪些技术“双刃剑”?

最近两个月&#xff0c;人们惊叹于AIGC的“超能力”&#xff0c;但也对AIGC带来的潜在风险表示担忧。ChatGPT之父Sam Altman在最近的一次访谈中表示&#xff0c;AI在为人类的聪明才智提供力量倍增器的同时&#xff0c;也可能带来技术滥用、事故等安全风险。他重点指出「恶意人员…

生成式AI火爆全球,你是否已经做好了准备?

2023年&#xff0c;随着ChatGPT的火爆全球&#xff0c;生成式AI也引发了各界人士的广泛关注。一时间&#xff0c;从国际科技巨头到国内人工智能企业&#xff0c;几乎所有我们耳熟能详的科技公司&#xff0c;都纷纷杀入了生成式AI市场。 作为全球云计算技术的开创者和领导者&…

面对AI“龙卷风”破坏力 白宫“软着陆”欧盟“硬防御”

ChatGPT的风靡与风险将OpenAI的CEO山姆奥特曼&#xff08;Sam Altman&#xff09;送进白宫&#xff0c;他被蹲守在美国总统府邸的记者们围追&#xff0c;面对5月4日白宫发起的AI风险治理会议&#xff0c;奥特曼很官方地给出“重要也很及时”的回应&#xff0c;自信的反复强调“…

QQGC?揭秘QQ的AI绘画大模型技术

&#x1f449;腾小云导读 2022年来&#xff0c;AIGC概念迅速出圈并快速形成产业生态&#xff0c;成为继PGC、UGC之后新的数字内容创作形式。QQ影像中心提出了自研的AI画画技术方案——QQGC&#xff0c;本文将介绍在QQGC基础大模型训练中的实践和探索&#xff0c;接着往下看吧~ …

Worldcoin,大众的加密货币还是个人的数字身份?

2022年8月&#xff0c;在印度班加罗尔一间大学的教室里&#xff0c;摩西•阿莫得&#xff08;Moiz Ahmed&#xff09;举起一个排球大小、中间有一个玻璃开口的铬合金球。阿莫得向学生们解释说&#xff0c;如果用这个叫做“Orb”的设备扫描他们的虹膜&#xff0c;他们将获得25个…