注册码 - UUID的介绍
UUID(Universally Unique Identifier)是通用唯一识别码。UUID是全球唯一的,不会重复的 、固定长度的随机字符串。(java自带UUID在java.util.UUID
中)
标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8个 - 4个 - 4个 - 4个 - 12个)
,可以从cflib 下载CreateGUID() UDF进行转换。(其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字)
UUID是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定
注册的用户给其一个UUID码,可以通过算法加密。
1. UUID的使用 - 这里用于生成激活码
1.1 UUID工具类创建(java.util.UUID)
import java.util.UUID;
/**
* UUID工具类,能够产生UUID随机字符串工具类,全世界唯一的,不重复的字符串
*/
public final class UuidUtil {
private UuidUtil(){
}
//获取一个UUID随机字符串
public static String getUuid(){
return UUID.randomUUID().toString().replace("-","");
}
}
1.2 测试UUID能否使用
//测试UUID工具类
public class UuidUtilTest {
//测试生成十个随机的UUID字符串
@Test
public void getUuid() {
for (int i = 0; i < 10; i++) {
String code = UuidUtil.getUuid();
System.out.println(code);
}
}
}
运行结果(生成了十个随机且不重复的字符串)
d401d62bddb64653b6f33d9706f5cac1
75e95b17668f4b8a99ac34439db32548
89b951b76caf41ceb0fa2b8c0a8f22be
4e9aac6a375b4011bc387917f46847f3
25886a64779249e3a95f13c4d4d6ef7c
bb32a0cd7beb42d1a2d0f13d753534d5
c9b6bb0e82424cda86ad232ed411045c
ff31c97a69c2439d8601b120f9ce9867
da0b3cd4106c4fac99dd2f3a9d34aaf1
0c16da9b54494cc7954bcfef25542bfb
2. 激活用户实现
user的status和code系统生成赋值,注册成功之后会给用户一个UUID的激活码发送到邮箱,用户进入邮箱点击激活,就完成激活。否则就未激活无法登录。
激活就是产生一个超链接,发送给注册邮箱。然后用户进入邮箱,点击注册,调用注册servlet,然后将status激活状态设置为Y,并且存储激活码code。
激活码还有一个好处,就是如果你非法使用或违反使用规则,可以通过设置激活状态为N未激活,来实现类似封号的行为。
3.1 修改UserService
的注册方法,注册时生成激活码存入用户表
public int register(User user) {
//查找username是否存在,存在就返回错误,不能注册
User u = userDao.findByUserName(user.getUsername());
if(u == null){
user.setStatus("N");//注册成功,但是设置为未激活
//通过UUID获取一个激活码
user.setCode(UuidUtil.getUuid());//生成激活码
//保存用户注册数据
userDao.saveUser(user);
return 1;//未存在,可以注册
}else {
return 0;//已存在,不可注册
}
}
3.2 在测试类TestUserService
里面编写测试测试方法,测试是否能够激活。
//用户激活
@Test
public void test03() {
UserService userService = new UserService();
//根据 code激活码 -> 将status激活专题 改为Y激活,这里的激活码
//用户激活
@Test
public void test03() {
UserService userService = new UserService();
//根据 code激活码 -> 将status激活专题 改为Y激活,这里的激活码,是通过UUID生成的,并且注册的时候存储到用户表里面的
//测试code激活码为0c16da9b54494cc7954bcfef25542bfb的用户激活
int code = userService.active("0c16da9b54494cc7954bcfef25542bfb");
if(code == 1){
System.out.println("激活成功");
}else if(code == 0){
System.out.println("激活失败");
}
}
3.3 在UserServce
里面编写激活方法active
//激活 账号激活
public int active(String activCode) {
//判断激活码是否正确
//激活,更新激活码
int code = userDao.updateStatus(activeCode); //1 表示成功
return code;
}
3.4 编写dao层激活方法和对应的映射文件UserDao.xml
public interface UserDao {
//用户激活
int updateStatus(String code);
}
<!-- 激活用户,更改激活状态status -->
<update id="updateStatus" parameterType="String">
update tab_user set status = 'Y' where code = #{code};
</update>
3.5 运行测试方法,测试激活逻辑是否可用
控制台输出:激活成功
查看数据库,当前激活码0c16da9b54494cc7954bcfef25542bfb
的用户激活状态status。
3.6 激活逻辑没有问题,就来编写激活的ActiveServlet
用户激活,就是从邮箱接收一个超链接主机ip/项目名/activeServlet?activeCode=激活码
比如主机/TravelNetwork/activeServlet?activeCode=0c16da9b54494cc7954bcfef25542bfb
,通过点击访问该链接,调用servlet实现激活。
//激活user
@WebServlet("/activeServlet")
public class ActiveServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
UserService userService = new UserService();
//获取参数 activeCode
//这个激活码,是发送给用户邮箱后面带的参数,比如 /TravelNetwork/activeServlet?activeCode=0c16da9b54494cc7954bcfef25542bfb
String activeCode = request.getParameter("activeCode");
//处理参数,激活用户
int code = userService.active(activeCode);
System.out.println("activeCode = " + activeCode);
//将激活情况响应给浏览器
int activeMsg = 0;
if(code==1){
activeMsg = 1;
//跳转登录界面
//response.sendRedirect(request.getContextPath() + "/login.jsp");
}else{
activeMsg = 0;
}
request.setAttribute("activeMsg",activeMsg);
//激活成功跳转响应界面
request.getRequestDispatcher("ActiveMessage.jsp").forward(request,response);
}
}
3.7 编写激活提示信息页面ActiveMessage.jsp
用到jstl标签库,不会jstl的使可以意看这个 JSTL标签库的使用
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>激活情况</title>
</head>
<body>
<c:if test="${activeMsg != null && activeMsg == 1}">
<div style="color: green">激活成功,欢迎您的使用。</div><a href=${pageContext.request.contextPath}/login.jsp title="点击,进入登录页面">前往登录</a>
</c:if>
<c:if test="${activeMsg == null || activeMsg == 0}">
<div style="color: red">激活失败,请尝试重新激活。</div>
</c:if>
</body>
</html>
3.8 通过url地址进行测试激活
- 比如激活码为
d9a421a341fe4ae7b2ca4ccb1062b7b8
的用户当前是未激活状态。
- 通过地址访问激活:
http://localhost:8080/TravelNetwork/activeServlet?activeCode=d9a421a341fe4ae7b2ca4ccb1062b7b8
,这里用到的是本地主机localhost,实际使用配置域名/IP。
- 查看数据库当前用户是否激活
3. 邮件MailUtil的使用,通过邮件点击链接激活。
注册成功之后,服务器会给用户发送一个激活邮件,里面是激活的链接,点击就能实现激活成功。
因为现在没有服务器,我们就用QQ来当我们的服务器,因为QQ有一个邮件代发功能。通过QQ邮箱代理发送邮件。
3.1 QQ代发邮箱的设置
进入QQ邮箱 -> 点击设置 -> 点击帐户
往下拉找到账号管理,设置发送邮件帐户(可以不设置)
往下拉找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务
,开启POP3/SMTP服务
开启的时候需要进行验证,毕竟是系统代发邮件(防止别人用你的邮箱发送一些广告导致封号)。
发送短信:配置邮件客户端
到手机号1069 0700 69
然后就开启成了:
【注意***】这里会生成一个授权码(我打码了),需要备注一下,到时候连接邮箱的时候需要这个当密码。
3.2 使用邮箱发送邮件激活码到用户注册邮箱
需要导入邮箱的依赖
<!--javaMail-->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>javax.mail-api</artifactId>
<version>1.5.6</version>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.5.3</version>
</dependency>
3.2.1 编写邮箱工具类MailUtils
这里通过QQ邮箱代发,所以需要填写参数
//qq邮箱
private static final String USER = "[email protected]"; // 发件人称号,同邮箱地址
//刚刚开启生成的授权码
private static final String PASSWORD = "你的qq邮箱开启POP3/SMTP服务生成的那个授权码"; // 如果是qq邮箱可以使户端授权码,或者登录密码
发送邮箱工具类MailUtils
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
/**
* 发邮件工具类
*/
public final class MailUtils {
//qq邮箱
private static final String USER = "[email protected]"; // 发件人称号,同邮箱地址
//刚刚开启生成的授权码
private static final String PASSWORD = "你的qq邮箱开启POP3/SMTP服务生成的那个授权码"; // 如果是qq邮箱可以使户端授权码,或者登录密码
/**
*sendMail参数
* @param1 to 收件人邮箱
* @param2 text 邮件正文
* @param3 title 标题
*/
/* 发送验证信息的邮件 */
public static boolean sendMail(String to, String text, String title){
try {
final Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.host", "smtp.qq.com");
// 发件人的账号
props.put("mail.user", USER);
//发件人的密码
props.put("mail.password", PASSWORD);
// 构建授权信息,用于进行SMTP进行身份验证
Authenticator authenticator = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
// 用户名、密码
String userName = props.getProperty("mail.user");
String password = props.getProperty("mail.password");
return new PasswordAuthentication(userName, password);
}
};
// 使用环境属性和授权信息,创建邮件会话
Session mailSession = Session.getInstance(props, authenticator);
// 创建邮件消息
MimeMessage message = new MimeMessage(mailSession);
// 设置发件人
String username = props.getProperty("mail.user");
InternetAddress form = new InternetAddress(username);
message.setFrom(form);
// 设置收件人
InternetAddress toAddress = new InternetAddress(to);
message.setRecipient(Message.RecipientType.TO, toAddress);
// 设置邮件标题
message.setSubject(title);
// 设置邮件的内容体
message.setContent(text, "text/html;charset=UTF-8");
// 发送邮件
Transport.send(message);
return true;
}catch (Exception e){
e.printStackTrace();
}
return false;
}
}
3.2.2 编写测试类测试发送邮件给指定邮箱。
public class MailUtilsTest {
//测试发送邮箱,谁注册就发送给注册用户的邮箱
@Test
public void sendMail(){
//参1:收件的邮箱 参2:邮箱内容,支持html语句,就是我们要发送的那个激活链接 参3:邮件标题
MailUtils.sendMail("[email protected]","<a href='http://localhost:8080/TravelNetwork/activeServlet?activeCode=d9a421a341fe4ae7b2ca4ccb1062b7b8'>点击激活账户</a>","点击激活账户");
}
}
3.2.3 测试邮箱发送和激活
- 测试结果:(收到激活邮箱)
- 点开邮箱可以查看发送的内容(就是那个text文本,也就是激活超链接)
- 点击激活链接,激活成功,然后就可以正常登陆了
3.2.4 将发送邮箱和激活码的代码写入注册方法中UserService的register方法
public int register(User user) {
//查找username是否存在,存在就返回错误,不能注册
User u = userDao.findByUserName(user.getUsername());
if(u == null){
user.setStatus("N");//注册成功,但是设置为未激活
//通过UUID获取一个激活码
user.setCode(UuidUtil.getUuid());//生成激活码
//参1:收件的邮箱(注册邮箱) 参2:邮箱内容,支持html语句(激活码的链接) 参3:邮件标题
MailUtils.sendMail(user.getEmail(),"<a href='http://localhost:8080/TravelNetwork/activeServlet?activeCode="+user.getCode()+"'>点击激活账户</a>","点击激活账户");
//保存用户注册数据
userDao.saveUser(user);
return 1;//未存在,可以注册
}else {
return 0;//已存在,不可注册
}
}
3.2.5 测试注册激活功能
注册成功收到激活邮件:
查看数据库,用户注册情况。
进入邮箱,点击激活链接激活。
查看数据库,激活状态变为Y了,激活成功。
登录测试,登录成功。