Maven多模块项目+Java实现邮箱验证

2017-11-15 11:37:52来源:segmentfault作者:杨子子子楠人点击

分享

昨晚准备第一时间写一篇Java邮箱验证,但是由于加班太晚整个人都是晕晕乎乎的就没有写这一篇文章。
在生活中,邮箱验证已经不是什么新鲜事,其实万变不离其宗,它的原理就是注册成功后,生成一个token,然后发送给用户带有token的url,然后服务器端根据判断激活是否超时、token是否合法、用户是否已经激活过等操作,对于笔者今天写的这个项目,只是简单的完成验证,更多的操作需要后期去不断完成以及优化,项目搭建运用了《Maven多模块项目搭建》,项目已经上传到Github:项目地址
Begin正题:


一、 前端界面搭建



前端的话没有使用Bootstrap,使用了Google家的materialize(http://materializecss.com/),虽然简单的界面却变成了Android风格,运用起来比较方便,效果方面优于Boostrap。


<!DOCTYPE html>
<html><head>
<meta charset="utf-8" />
<title>注册</title>
</head>
<link href="css/materialize.min.css" rel="stylesheet" type="text/css" />
<script src="js/jquery-2.1.0.js"></script>
<style>
.box {
margin-top: 200px;
}
</style><body><div><div>
<div>
<div>
<div>
<input type="email"> <label
for="email" data-error="error" data-success="success">邮件</label>
</div>
<div>
<input type="password"> <label
for="password">密码</label>
</div>
<div>
<a>注册</a>
</div></div>
</div>
</div></div></body>
<script src="js/materialize.min.js"></script>
<script src="js/index.js"></script>
<script>
jQuery(function($) {$("#email").change(function(){var email = $("#email").val(); submit_email(email);})$("#btn").click(function() {var email = $("#email").val();
var password = $("#password").val();if(email=="" || password==""){
Materialize.toast('信息不能为空', 3000, 'rounded');
return false;
}else{
submit(email,password);
}
})})
</script></html>


当消息为空的提示


二、后端开发


1、SMTP协议


SMTP的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议,在该邮箱验证项目中因为只涉及到邮箱的发送和接受,所以使用SMTP协议


2、搭建SendEmail.java


该Java类对邮件发送进行了封装,首先需要添加JavaMail的依赖


依赖:


<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4</version>
</dependency>

项目代码:


public class SendEmail {private final static String FROM_EMAIL = "yangzinan127@163.com";
private final static String HOST = "smtp.163.com";
private final static String PASSWORD = "************";
private final static String SMTP = "smtp";
private static Properties properties = new Properties();
private static Session session;public static void sendMail(String to, String title, String context) throws Exception {properties.setProperty("mail.transport.protocol", "smtp");//电子邮箱协议

properties.setProperty("mail.smtp.host", HOST); //邮箱服务器地址properties.setProperty("mail.smtp.auth", "true"); session = Session.getInstance(properties);session.setDebug(true);//开启调试模式,可以追踪到邮件发送过程MimeMessage mimeMessage = new MimeMessage(session);mimeMessage.setSubject(title);//标题mimeMessage.setContent(context, "text/html;charset=utf-8");//内容mimeMessage.setFrom(new InternetAddress(FROM_EMAIL));//发送人mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(to));//收件人mimeMessage.setSentDate(new Date());//发送时间mimeMessage.saveChanges();//保存修改Transport transport = session.getTransport(SMTP);transport.connect(FROM_EMAIL, PASSWORD);transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());transport.close();}
}

如果你写过邮件发送,你就会发现这个代码会有一个问题transport.connect(FROM_EMAIL, PASSWORD);,问题其实就在PASSWORD上,其实这个并不是电子邮箱登录密码,如果你写了登录密码,系统将会抛出认证失败yi'chang,之前看过一些博客,但是里面都没有涉及到这个问题,解决方案如下:


首先需要开启电子邮箱协议服务:



重点我已经用箭头标注在图片中->授权码



授权码就是第三方登录时用到的认证密码


3、注册信息提交


项目代码:


Controller层


第一步,需要判断需要注册的邮箱地址是否存在,如果存在就返回1,拒绝用户提交该邮箱地址,运用前端ajax请求


@PostMapping("/jsonSelectUser.do")
@ResponseBody
public Map<String,Integer> selectUserByEmail(@RequestParam("email") String email){
User user = webService.selectUserByEmail(email);Map<String,Integer> map = new HashMap<>();if(user==null){
map.put("state", 0);
}else{
map.put("state", 1);
}return map;
}

第二步,若邮箱地址不存在,就允许用户提交信息


@PostMapping("/insertUser.do")
@ResponseBody
public Map<String, Object> insertUser(@RequestParam("email") String email,
@RequestParam("password") String password) throws Exception {Map<String, Object> map = new HashMap<String, Object>();int code = webService.insertUser(email, password);if (code > 0) {
map.put("code", SUCCESS_CODE);
map.put("message", "添加成功");
return map;
} else {
map.put("code", ERROR_CODE);
map.put("message", "添加失败");
return map;
}}

用户信息提交的流程是Controller->Service->Dao->Mapper.xml->DB


Service层


需要对控制层传输过来的密码进行MD5加密,然后生成code(用户唯一标识)


MD5依赖:


<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>
/*
* 添加用户信息
*/
@Transactional
public int insertUser(String email, String password) throws Exception {
int num = userMapper.insertUser(email,doPassword(password),doCode(email, password));String context="<p>尊敬的"+email+"用户:</p><p style=text-indent:2em>感谢您注册我们的网站,但是注册之后需要你继续完成用户激活:<a href="+URL+"register.do?code="+doCode(email, password)+"&email="+email+">"+URL+"register.do?code="+doCode(email, password)+"&email="+email+"</a></p>";//发送邮件操作
sendMail(email, "用户激活验证",context);return num;
}

用户密码加密:


/*
* 密码加密
*/
public static String doPassword(String password) {
String password_md5 = DigestUtils.md5Hex(password);
return password_md5;
}

用户唯一标识生成:


/*
* 生成code
*/
public static String doCode(String email, String password) {
String code = DigestUtils.md5Hex(email + password);
return code;
}

Dao层


持久化层:


int insertUser(@Param("email") String email,@Param("password") String doPassword,@Param("code") String doCode);User selectUserByEmail(@Param("email") String email);

Mapper.xml


<insert>
insert into user(email,password,code) values(#{email},#{password},#{code})
</insert>
<select resultType="com.web.pojo.User">
select * from user where email=#{email}
</select>
<select resultType="com.web.pojo.User">
select * from user
</select>

添加完成跳转到信息列表:



用户接收到信息:


4、邮件发送与验证


邮箱验证,首先需验证邮箱地址和唯一标识是否为用户伪造,若是伪造:



若正确:



数据库中用户信息也会进行改变,注册成功并没有激活:



注册成功并激活成功:



列表界面也会改变:


Controller层


项目代码:


@GetMapping("/register.do")
public String register(@RequestParam("code") String code, @RequestParam("email") String email) {User user = webService.selectUserByEmail(email);if (user!=null) {if((user.getCode()).equals(code) && user.getState()==0){
int num = webService.updateUserState(email);
return "success";
}else{
return "error";
}} else {
return "error";
}}

Service层


@Transactional
public int updateUserState(String email) {
int num = userMapper.updateUserState(email);
return num;
}

Dao层


int updateUserState(@Param("email") String email);

Mapper.xml层


<update>
update user set code="",state=1 where email=#{email}
</update>

基本的邮箱验证已经完成,其余的功能以及数据安全处理后面不断地完善,如果有不足的地方,还请大家多多指教,笔者很喜欢结交一些程序员朋友,大家可以加微信一起交流

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台