SSH注册通过邮箱激活原理就是在数据库中添加一个字段,例如state:激活为1,未激活为0,从而判断是否有登录系统的权限
大概步骤,我们注册成功后,向输入的邮箱发送信息,点击邮箱中的链接(链接可以是自己系统的登录链接),使state字段改为1
1.使用的两个工具类
(1)邮件创建工具类
package com.yinhe.util;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Message;
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 javax.mail.internet.MimeMessage.RecipientType;
/**
* 邮件创建工具类
* @author
*
*/
public class MailUtils {
public static void sendMail(String email, String emailMsg)
throws AddressException, MessagingException {
Properties props = new Properties();
// 发送邮件协议名称
props.setProperty("mail.transport.protocol", "SMTP");
// 设置邮件服务器主机名
props.setProperty("mail.host", "smtp.163.com");
// 发送服务器需要身份验证
props.setProperty("mail.smtp.auth", "true");
// // 开启debug调试
// props.setProperty("mail.debug", "true");
Authenticator auth = new Authenticator() {
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("yinyancheng161@163.com", "yinyancheng161");
}
};
Session session = Session.getInstance(props, auth);
//2创建邮件对象
Message message = new MimeMessage(session);
//2.1设置发件人
message.setFrom(new InternetAddress("yinyancheng161@163.com"));
//2.2设置收件人
message.setRecipient(RecipientType.TO, new InternetAddress(email));
//2.3设置邮件主题
message.setSubject("你要马上激活,我们不是病毒");
//2.4邮件的正文
message.setContent(emailMsg, "text/html;charset=utf-8");
//3发送
Transport.send(message);
}
}
(2)uuid工具类
package com.yinhe.util;
import java.util.UUID;
public class CommonsUtils {
//生成uuid
public static String getUUID(){
return UUID.randomUUID().toString();
}
}
2.dao层代码,用来注册用户信息,用链接后跟的code字段来查询表,修改激活的状态
//注册用户信息
public void addUser(User user) {
this.getHibernateTemplate().save(user);
}
//查询code
public User findByCode(String code) {
List<User> users = (List<User>) this.getHibernateTemplate().find("from User where code = ?",code);
return users.size() == 0 ? null : users.get(0);
}
//修改激活状态
public void updateUser(User user) {
this.getHibernateTemplate().update(user);
}
接口类代码
public interface IUserDao {
public void addUser(User user);
public User findByCode(String code);
public void updateUser(User user);
}
3.Service层代码,用来调用dao层方法
public class UserServiceImpl implements IUserService{
@Resource
private IUserDao userDao;
@Override
public void addUser(User user) {
userDao.addUser(user);
}
@Override
public void updateUser(User user) {
userDao.updateUser(user);
}
@Override
public User findByCode(String code) {
return userDao.findByCode(code);
}
}
service层接口类代码
public interface IUserService {
public void addUser(User user);
public User findByCode(String code);
public void updateUser(User user);
}
4.action层代码,判断用户等录的信息,注册用户信息,其中夹杂着验证码的判断,但是并无影响,注意自己生成get,set方法
public class UserAction extends ActionSupport{
@Resource
private IUserService userService;
private User user;
private String checkcode;
private String code;
public String login() {
if (user != null) {
User result_user = userService.findUserByAccount(user);
if (result_user != null) {
//判断验证码程序
//从Session中获得验证码的随机值
String checkcode1 =(String)ServletActionContext.getRequest().getSession().getAttribute("checkcode");
if(!checkcode.equalsIgnoreCase(checkcode1)){
this.addActionError("验证码输入错误!");
return "checkcodeFail";
}else if(result_user.getState() == 1){
ActionContext.getContext().getSession().put("user", result_user);
return "loginSuccess";
}else {
return "loginFail";
}
}
}
return "loginFail";
}
public String saveUser() {
//判断验证码程序
//从Session中获得验证码的随机值
String checkcode1 =(String)ServletActionContext.getRequest().getSession().getAttribute("checkcode");
if(!checkcode.equalsIgnoreCase(checkcode1)){
this.addActionError("验证码输入错误!");
return "checkRegister";
}else {
code = CommonsUtils.getUUID();
System.out.println(code);
String emailMsg = "恭喜您注册成功,请点击下面的连接进行激活账户" + "<a href='http://localhost:8080/ShopStore-SSH/user_jihuo.action?code="
+ code + "'>" + "http://localhost:8080/ShopStore-SSH/user_jihuo.action?code=" + code + "</a>";
user.setCode(code);
userService.addUser(user);
try {
MailUtils.sendMail(user.getEmail(), emailMsg);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return "saveUser";
}
//激活用户登录权限
public String jihuo() {
User user = userService.findByCode(code);
if(user!=null) {
user.setState(1);
user.setCode(null);
userService.updateUser(user);
return "jihuoSuccess";
}
return "jihuoFail";
}
}
5.struts,书写跳转路径
<package name="user" extends="struts-default" strict-method-invocation="false">
<action name="user_*" class="userAction" method="{1}">
<result name="loginSuccess">/index.jsp</result>
<result name="loginFail">/login.jsp</result>
<result name="checkcodeFail">/login.jsp</result>
<result name="saveUser">/registerSuccess.jsp</result>
<result name="checkRegister">/register.jsp</result>
<result name="jihuoFail">/jihuoFail.jsp</result>
<result name="jihuoSuccess">/login.jsp</result>
</action>
</package>
6.前台页面,注册成功页面,页面跳转到激活页面,注册页面、注册失败页面以及激活失败页面大同小异,下面就不在书写了,只附上注册成功后中间的跳转页面
<body>
<h2>恭喜您注册成功,请赶快前往注册邮箱激活您的帐户</h2>
<div>
<span><a href="http://mail.163.com/">网易163邮箱</a></span>
<span><a href="http://mail.126.com/">网易126邮箱</a></span>
<span><a href="https://mail.qq.com/cgi-bin/loginpage">腾讯QQ邮箱</a></span>
</div>
</body>
激活成功后,state为1,激活失败,state为0