SpringBoot实现网站注册,邮件激活码激活功能
项目源码:https://gitee.com/smfx1314/springbootemail
上一篇文章已经讲到如何,趁热打铁,这篇文章实现如下功能。
很多网站注册功能都会给您注册的邮箱发送一封邮件,里面是一串连接,点击链接激活功能,今天咱们就实现这个功能。
原理:
在您注册的时候,user类中设置一个邮件码code,同时用户状态未激活。邮件码可以通过uuid实现,这样在注册的时候发送一封邮件,把这个邮件码以html的格式发送到指定邮箱,然后通过点击链接,把邮件码在提交到后台进行对比,如果邮件中的邮件码跟发送时设置的一样,就把用户状态改为激活,然后登陆即可。
开始编码
第一步搭搭建开发环境,只需要通过springboot整合mybatis实现用户注册登录功能即可,然后在注册的时候调用邮件接口发送邮件就可以了
项目结构
引入相关依赖,这里使用的是阿里巴巴druid数据库连接池
pom.xml
<properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-web</artifactid> </dependency> <!--mybatis--> <dependency> <groupid>org.mybatis.spring.boot</groupid> <artifactid>mybatis-spring-boot-starter</artifactid> <version>1.3.2</version> </dependency> <!--springboot测试支持--> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-test</artifactid> <scope>test</scope> </dependency> <!--mysql--> <dependency> <groupid>mysql</groupid> <artifactid>mysql-connector-java</artifactid> <scope>runtime</scope> </dependency> <!--springboot热部署--> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-devtools</artifactid> <optional>true</optional> <!-- 这个需要为 true 热部署才有效 --> </dependency> <!--druid数据库连接池--> <dependency> <groupid>com.alibaba</groupid> <artifactid>druid-spring-boot-starter</artifactid> <version>1.1.10</version> </dependency> <!--邮件--> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-mail</artifactid> </dependency> <!--thymeleaf--> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-thymeleaf</artifactid> </dependency> </dependencies>
上面引入了热部署依赖,不引人页是可以的。另外还有thymeleaf模板引擎,springboot默认支持此引擎
引入相关依赖之后,节下来根据项目结构创建对应的包,请参考上文中的结构图。在目录结构完善之后,下面开始配置相关属性
application.properties配置
##热部署 spring.devtools.remote.restart.enabled=true spring.devtools.restart.additional-paths=src/main ## 数据库连接配置 spring.datasource.type=com.alibaba.druid.pool.druiddatasource spring.datasource.driver-class-name=com.mysql.jdbc.driver spring.datasource.url=jdbc:mysql://localhost:3306/test2?characterencoding=utf-8&servertimezone=gmt%2b8 spring.datasource.username=“你的用户名” spring.datasource.password=“你的密码” #默认编码配置 spring.http.encoding.charset=utf-8 spring.http.encoding.force=true spring.http.encoding.enabled=true server.tomcat.uri-encoding=utf-8 ## mybatis相关配置 mybatis.type-aliases-package=com.jiangfeixiang.springbootemail.entity mybatis.mapper-locations=mapper/*.xml spring.thymeleaf.prefix=classpath:/templates/ ##邮箱服务器地址 ##qq smtp.qq.com ##sina smtp.sina.cn ##aliyun smtp.aliyun.com ##163 smtp.163.com spring.mail.host=smtp.qq.com ##邮箱用户名 spring.mail.username=1016767658@qq.com ##邮箱密码(注意:qq邮箱应该使用独立密码,去qq邮箱设置里面获取) spring.mail.password=ivhkrccrallkbdcf ##编码格式 spring.mail.default-encoding=utf-8 ##发送邮件地址 spring.mail.from=1016767658@qq.com
注意:数据库配置全部改写成您自己的账号密码,数据库等信息。邮箱配置不明白的可以参考上一篇。
以上都完成之后,接下来是完善实体类,另外数据库这里就不在提示了,只有一个user类,可以自己完善一下
实体类user
public class user implements serializable { private integer id; private string username; private string password; private string useremail; /** * 状态:0代表未激活,1代表激活 */ private integer status; /** * 利用uuid生成一段数字,发动到用户邮箱,当用户点击链接时 * 在做一个校验如果用户传来的code跟我们发生的code一致,更改状态为“1”来激活用户 */ private string code; public integer getid() { return id; } public void setid(integer id) { this.id = id; } public string getusername() { return username; } public void setusername(string username) { this.username = username; } public string getpassword() { return password; } public string getuseremail() { return useremail; } public void setuseremail(string useremail) { this.useremail = useremail; } public void setpassword(string password) { this.password = password; } public integer getstatus() { return status; } public void setstatus(integer status) { this.status = status; } public string getcode() { return code; } public void setcode(string code) { this.code = code; } @override public string tostring() { return "user{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + ", useremail='" + useremail + '\'' + ", status=" + status + ", code='" + code + '\'' + '}'; } }
说明:
- 用户状态status:0代表未激活,1代表激活,注册的时候,默认是0,只有激活邮箱激活码可以更改为1
- 邮箱激活码code:利用uuid生成一段数字,发动到用户邮箱,当用户点击链接时,在做一个校验,如果用户传来的code跟我们发送的code一致,更改状态为“1”来激活用户
实体类完成之后下面开始完善dao以及对应的mapper.xml文件
对应userdao
public interface userdao { /** * 用户注册,注册的时候默认状态为0:未激活,并且调用邮件服务发送激活码到邮箱 * @param user */ void register(user user); /** * 点击邮箱中的激活码进行激活,根据激活码查询用户,之后再进行修改用户状态为1进行激活 * @param code * @return */ user checkcode(string code); /** * 激活账户,修改用户状态为“1”进行激活 * @param user */ void updateuserstatus(user user); /** * 登录,根据用户状态为“1”来查询 * @param user * @return */ user loginuser(user user); }
代码中有详细说明,接下来是userdao对应的映射文件usermapper.xml
usermapper.xml
<?xml version="1.0" encoding="utf-8" ?> <!doctype mapper public "-//mybatis.org//dtd mapper 3.0//en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace="com.jiangfeixiang.springbootemail.dao.userdao" > <!--注册用户--> <insert id="register" parametertype="com.jiangfeixiang.springbootemail.entity.user" > insert into user ( username, password,useremail,status,code) values (#{username,jdbctype=varchar}, #{password,jdbctype=varchar}, #{useremail,jdbctype=varchar}, #{status,jdbctype=integer},#{code,jdbctype=integer}) </insert> <!--根据激活码code查询用户--> <select id="checkcode" parametertype="string" resulttype="com.jiangfeixiang.springbootemail.entity.user"> select * from user where code = #{code} </select> <!--激活账户,修改用户状态--> <update id="updateuserstatus" parametertype="com.jiangfeixiang.springbootemail.entity.user"> update user set status=1,code=null where id=#{id} </update> <!--登录,根据 status=1 进行查询--> <select id="loginuser" resulttype="com.jiangfeixiang.springbootemail.entity.user" > select * from user where username=#{username} and password=#{password} and status=1 </select> </mapper>
dao以及对象映射文件完成之后,开始编写service接口与实现类
userservice接口
public interface userservice { /** * 用户注册, * @param user */ void register(user user); /** * 根据激活码code查询用户,之后再进行修改状态 * @param code * @return */ user checkcode(string code); /** * 激活账户,修改用户状态为“1” * @param user */ void updateuserstatus(user user); /** * 登录 * @param user * @return */ user loginuser(user user); }
下面是与之对应的实现类
userserviceimpl实现类
@service @transactional public class userserviceimpl implements userservice { @autowired private userdao userdao; /** * 注入邮件接口 */ @autowired private mailservice mailservice; /** * 用户注册,同时发送一封激活邮件 * @param user */ @override public void register(user user) { userdao.register(user); //获取激活码 string code = user.getcode(); system.out.println("code:"+code); //主题 string subject = "来自xxx网站的激活邮件"; //user/checkcode?code=code(激活码)是我们点击邮件链接之后根据激活码查询用户,如果存在说明一致,将用户状态修改为“1”激活 //上面的激活码发送到用户注册邮箱 string context = "<a href=\"/user/checkcode?code="+code+"\">激活请点击:"+code+"</a>"; //发送激活邮件 mailservice.sendhtmlmail (user.getuseremail(),subject,context); } /** * 根据激活码code进行查询用户,之后再进行修改状态 * @param code * @return */ @override public user checkcode(string code) { return userdao.checkcode(code); } /** * 激活账户,修改用户状态 * @param user */ @override public void updateuserstatus(user user) { userdao.updateuserstatus(user); } /** * 登录 * @param user * @return */ @override public user loginuser(user user) { user user1 = userdao.loginuser(user); if (user1 !=null){ return user1; } return null; } }
邮件接口
public interface mailservice { /** * 发送文本邮件 * @param to * @param subject * @param content */ //void sendsimplemail(string to, string subject, string content); /** * 发送html邮件,方便用户点击附带的code用来验证激活账户 * @param to * @param content */ void sendhtmlmail(string to, string subject, string content); }
下面是对应的实现类
mailserviceimpl实现类
@service public class mailserviceimpl implements mailservice { private final logger logger = loggerfactory.getlogger(this.getclass()); @autowired private javamailsender mailsender; /** * 配置文件中我的qq邮箱 */ @value("${spring.mail.from}") private string from; /** * 发送html邮件 * @param to 收件者 * @param subject 邮件主题 * @param content 文本内容 */ @override public void sendhtmlmail(string to,string subject,string content) { mimemessage message = mailsender.createmimemessage(); mimemessagehelper helper = null; try { helper = new mimemessagehelper(message, true); helper.setfrom(from); helper.setto(subject); helper.setto(to); helper.settext(content, true); mailsender.send(message); //日志信息 logger.info("邮件已经发送。"); } catch (messagingexception e) { logger.error("发送邮件时发生异常!", e); } } }
主程序入口上不要忘记添加@mapperscan
@springbootapplication @mapperscan("com.jiangfeixiang.springbootemail.dao") public class springbootemailapplication { public static void main(string[] args) { springapplication.run(springbootemailapplication.class, args); } }
druiddbconfig数据源配置
@configuration public class druiddbconfig { private logger logger = loggerfactory.getlogger(druiddbconfig.class); @configurationproperties(prefix = "spring.datasource") @bean public druiddatasource druidconfig(){ return new druiddatasource(); } }
uuidutils 随机生成激活码
public class uuidutils { public static string getuuid(){ return uuid.randomuuid().tostring().replace("-",""); } }
usercontroller控制类
@controller @requestmapping("/user") public class usercontroller { @autowired private userservice userservice; /** * 注册 * @param user * @return */ @requestmapping(value = "/registeruser") public string register(user user){ user.setstatus(0); string code = uuidutils.getuuid()+ uuidutils.getuuid(); user.setcode(code); userservice.register(user); return "success"; } /** *校验邮箱中的code激活账户 * 首先根据激活码code查询用户,之后再把状态修改为"1" */ @requestmapping(value = "/checkcode") public string checkcode(string code){ user user = userservice.checkcode(code); system.out.println(user); //如果用户不等于null,把用户状态修改status=1 if (user !=null){ user.setstatus(1); //把code验证码清空,已经不需要了 user.setcode(""); system.out.println(user); userservice.updateuserstatus(user); } return "login"; } /** * 跳转到登录页面 * @return login */ @requestmapping(value = "/loginpage") public string login(){ return "login"; } /** * 登录 */ @requestmapping(value = "/loginuser") public string login(user user, model model){ user u = userservice.loginuser(user); if (u !=null){ return "welcome"; } return "login"; } }
首页控制类
@controller public class indexcontroller { /** * 首页,localhost:8080直接返回index页面 */ @requestmapping(value = "/") public string index(){ return "index"; } }
templates下html页面
index.html
<!doctype html> <html lang="en" xmlns:th="http://www.w3.org/1999/xhtml"> <head> <meta charset="utf-8"> <title>注册</title> </head> <body> <form action="/user/registeruser" method="post"> 用户名:<input type="text" id="username" name="username"/><br> 密码:<input type="password" id="password" name="password"/><br> 邮箱:<input type="email" id="email" name="useremail"><br> <input type="submit" value="注册"> </form> <a href="/user/loginpage">登录</a> </body> </html>
login.html
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>登录</title> </head> <body> <form action="/user/loginuser" method="post"> 用户名:<input type="text" id="username" name="username"/><br> 密码:<input type="password" id="password" name="password"/><br> <input type="submit" value="登录"> </form> </body> </html>
success.html
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>注册成功</title> </head> <body> 前往邮箱激活账户 </body> </html>
welcome.html
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>欢迎</title> </head> <body> 登录成功 </body> </html>
上一篇: 儿子被立为太子,母亲却被皇帝赐死
下一篇: 再探Redux Middleware