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

阅读:988 2019-03-20 14:09:14 来源:新网

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

首先需要一个思路:

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

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

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

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

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

createtableusers(idvarchar(32)primarykey,namevarchar(30),pwdvarchar(32),emailvarchar(80),activechar(1),acodevarchar(32));12345678需要准备的jar包

链接:-如果链接失效-可以私信我https://github.com/yangchunjian/java/tree/master/mymailweb/webroot/web-inf/lib

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

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

packagecn.hncu.reg.sendmail;importjava.security.generalsecurityexception;importjava.util.properties;importjavax.mail.authenticator;importjavax.mail.message.recipienttype;importjavax.mail.messagingexception;importjavax.mail.passwordauthentication;importjavax.mail.session;importjavax.mail.transport;importjavax.mail.internet.addressexception;importjavax.mail.internet.internetaddress;importjavax.mail.internet.mimemessage;importcom.sun.mail.util.mailsslsocketfactory;importcn.hncu.domain.user;publicclassmysendmailthreadextendsthread{privateuseruser=null;publicmysendmailthread(useruser){this.user=user;}@overridepublicvoidrun(){//跟smtp服务器建立一个连接propertiesp=newproperties();//设置邮件服务器主机名p.setproperty("mail.host","smtp.qq.com");//指定邮件服务器,默认端口25//发送服务器需要身份验证p.setproperty("mail.smtp.auth","true");//要采用指定用户名密码的方式去认证//发送邮件协议名称p.setproperty("mail.transport.protocol","smtp");//开启ssl加密,否则会失败mailsslsocketfactorysf=null;try{sf=newmailsslsocketfactory();}catch(generalsecurityexceptione1){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");//创建sessionsessionsession=session.getdefaultinstance(p,newauthenticator(){@overrideprotectedpasswordauthenticationgetpasswordauthentication(){//用户名可以用qq账号也可以用邮箱的别名passwordauthenticationpa=newpasswordauthentication("chenhaoxiang0117","jnj***********ab");//后面的字符是授权码,用qq密码不行!!returnpa;}});session.setdebug(true);//设置打开调试状态try{//声明一个message对象(代表一封邮件),从session中创建mimemessagemsg=newmimemessage(session);//邮件信息封装//1发件人msg.setfrom(newinternetaddress("61******29@qq.com"));//2收件人msg.setrecipient(recipienttype.to,newinternetaddress(user.getemail()));//3邮件内容:主题、内容msg.setsubject(user.getname()+",欢迎注册***账号,请点击链接激活账号");//stringbuilder是线程不安全的,但是速度快,这里因为只会有这个线程来访问,所以可以用这个stringbuildersbd=newstringbuilder();sbd.append(user.getname()+"
欢迎!请确认此邮件地址以激活您的账号。
");sbd.append("立即激活
");sbd.append("或者点击下面链接:
");sbd.append("http://192.168.1.102:8080/mymailweb/activeservlet?acode="+user.getacode()+"
");sbd.append("这是一封自动发送的邮件;如果您并未要求但收到这封信件,您不需要进行任何操作。");msg.setcontent(sbd.tostring(),"text/html;charset=utf-8");//发html格式的文本//发送动作transport.send(msg);system.out.println("给"+user.getemail()+"发送邮件成功。");}catch(addressexceptione){e.printstacktrace();}catch(messagingexceptione){e.printstacktrace();}}}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104index.jsp:

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

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

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

<%@pagelanguage="java"import="java.util.*"pageencoding="utf-8"%><%@tagliburi="http://java.sun.com/jsp/jstl/core"prefix="c"%>带邮箱激活的注册模块functionreg(){//省略:表单数据格式校验--还有ajax实现的验证码document.forms[0].action="";document.forms[0].submit();}functionlogin(){document.forms[0].action="";document.forms[0].submit();}登录失败!姓名:
密码:
邮箱:-登录不用填写邮箱
  登录成功
欢迎你,亲爱的${user.name}1234567891011121314151617181920212223242526272829303132333435363738394041424344c3p0线程池配置文件:

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

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

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

com.mysql.jdbc.driverroot12342301025012345678910111213141516171819202122过滤器-实现全站编码

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

packagecn.hncu.filter;importjava.io.ioexception;importjavax.servlet.filter;importjavax.servlet.filterchain;importjavax.servlet.filterconfig;importjavax.servlet.servletexception;importjavax.servlet.servletrequest;importjavax.servlet.servletresponse;publicclasscharsetfilterimplementsfilter{privatestringcharset=null;@overridepublicvoidinit(filterconfigfilterconfig)throwsservletexception{charset=filterconfig.getinitparameter("charset");}@overridepublicvoiddofilter(servletrequestrequest,servletresponseresponse,filterchainchain)throwsioexception,servletexception{request.setcharacterencoding(charset);response.setcontenttype("text/html;charset="+charset);chain.dofilter(request,response);}@overridepublicvoiddestroy(){}}1234567891011121314151617181920212223242526272829303132333435点击邮件激活地址后的页面:result.jsp

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

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

添加了网页自动跳转!

<%@pagelanguage="java"import="java.util.*"pageencoding="utf-8"%><%@tagliburi="http://java.sun.com/jsp/jstl/core"prefix="c"%>带邮箱激活的注册模块vartm;vari=5;functiontime(){i--;div1.innerhtml=i+"秒钟以后,自动去登录!";if(i<1){window.clearinterval(tm);//将定时器清除window.location.href="";}}onload=function(){tm=window.setinterval(time,1000);};服务器异常,请重新激活!
">登录

激活地址错误,请使用正确的激活地址!
">登录
你已经激活过,请勿重复激活!
">登录
激活成功,欢迎去登录!
">登录
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758logindaojdbc-用户登录dao实现类

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

packagecn.hncu.login.dao;importjava.sql.sqlexception;importorg.apache.commons.dbutils.queryrunner;importorg.apache.commons.dbutils.handlers.beanhandler;importcn.hncu.domain.user;importcn.hncu.pubs.c3p0pool;publicclasslogindaojdbcimplementslogindao{publicuserlogin(useru){stringsql="select*fromuserswherename=?andpwd=?andactive='1'";queryrunnerrun=newqueryrunner(c3p0pool.getdatasource());try{useruser=run.query(sql,newbeanhandler(user.class),u.getname(),u.getpwd());returnuser;}catch(sqlexceptione){e.printstacktrace();returnnull;}}}123456789101112131415161718192021222324

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

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

下一篇: AKKA 邮箱Mailbox
相关文章
{{ v.title }}
{{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
你可能感兴趣
推荐阅读 更多>
推荐商标

{{ v.name }}

{{ v.cls }}类

立即购买 联系客服