摘要:昨晚准备第一时间写一篇邮箱验证,但是由于加班太晚整个人都是晕晕乎乎的就没有写这一篇文章。
昨晚准备第一时间写一篇Java邮箱验证,但是由于加班太晚整个人都是晕晕乎乎的就没有写这一篇文章。
在生活中,邮箱验证已经不是什么新鲜事,其实万变不离其宗,它的原理就是注册成功后,生成一个token,然后发送给用户带有token的url,然后服务器端根据判断激活是否超时、token是否合法、用户是否已经激活过等操作,对于笔者今天写的这个项目,只是简单的完成验证,更多的操作需要后期去不断完成以及优化,项目搭建运用了《Maven多模块项目搭建》,项目已经上传到Github:项目地址
Begin正题:
一、 前端界面搭建
前端的话没有使用Bootstrap,使用了Google家的materialize(http://materializecss.com/),虽然简单的界面却变成了Android风格,运用起来比较方便,效果方面优于Boostrap。
注册
当消息为空的提示
二、后端开发
1、SMTP协议
SMTP的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议,在该邮箱验证项目中因为只涉及到邮箱的发送和接受,所以使用SMTP协议
2、搭建SendEmail.java
该Java类对邮件发送进行了封装,首先需要添加JavaMail的依赖
依赖:
javax.mail 1.4
项目代码:
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 MapselectUserByEmail(@RequestParam("email") String email){ User user = webService.selectUserByEmail(email); Map map = new HashMap<>(); if(user==null){ map.put("state", 0); }else{ map.put("state", 1); } return map; }
第二步,若邮箱地址不存在,就允许用户提交信息
@PostMapping("/insertUser.do") @ResponseBody public MapinsertUser(@RequestParam("email") String email, @RequestParam("password") String password) throws Exception { Map map = new HashMap (); 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依赖:
commons-codec commons-codec 1.10
/* * 添加用户信息 */ @Transactional public int insertUser(String email, String password) throws Exception { int num = userMapper.insertUser(email,doPassword(password),doCode(email, password)); String context="尊敬的"+email+"用户:
感谢您注册我们的网站,但是注册之后需要你继续完成用户激活:"+URL+"register.do?code="+doCode(email, password)+"&email="+email+"
"; //发送邮件操作 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 into user(email,password,code) values(#{email},#{password},#{code})
添加完成跳转到信息列表:
用户接收到信息:
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 user set code="",state=1 where email=#{email}
基本的邮箱验证已经完成,其余的功能以及数据安全处理后面不断地完善,如果有不足的地方,还请大家多多指教,笔者很喜欢结交一些程序员朋友,大家可以加微信一起交流
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/67992.html
摘要:目前该功能并未完善,敬请期待。反正每次都会有新的东西补充上去一开始我本来想做的是可以使用微信登陆,也可以使用账户邮箱登陆,也可以使用短信登陆的。后来发现微信登陆要企业认证,做不了。 从零开发项目概述 最近这一直在复习数据结构和算法,也就是前面发出去的排序算法八大基础排序总结,Java实现单向链表,栈和队列就是这么简单,十道简单算法题等等... 被虐得不要不要的,即使是非常简单有时候绕半...
摘要:刚下载时项目中使用后得不到某宝的数据,因为数据是动态生成的。使用去获取数据某宝的取不到用某度的首页试了下是可以的。我是根据店铺名称卖家地区中包含特定关键字来过滤的。把宝贝列表的做为输入循环宝贝列表并进入抓取交易量数据并保存。 项目背景 因前段时间公司有需求,想得到我们公司所在地区(四线城市)的电商企业的销售额排名情况,时间紧急,调研无 果,花费RMB若干买了某工具的数据服务(避...
摘要:时间年月日星期三说明本文部分内容均来自慕课网。用户过生日,系统发送生日祝福邮件。将最新活动和优惠以邮件的形式告知会员。通常把处理用户请求邮件发送请求的邮件服务器称为服务器。提供了加密的协议被称为。 时间:2017年06月07日星期三说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学示例源码:无个人学习源码:https://github.com/zcc...
摘要:文件项目隶属的实际项目名实际项目中的一个项目模块名称版本号当前项目打包的方式,默认为以上的配置会获得一个格式的包用于定义构建输出的一些附属的构建。 pom.xml文件 org.son.nexus//项目隶属的实际项目名 nexus-indexer//实际项目中的一个maven项目模块名称 2.0.0//版本号 jar//当前maven项目打包的方式,默认为jar 以上的配置会获得一个-...
阅读 1600·2021-09-02 09:55
阅读 1067·2019-08-30 13:19
阅读 1376·2019-08-26 13:51
阅读 1423·2019-08-26 13:49
阅读 2321·2019-08-26 12:13
阅读 430·2019-08-26 11:52
阅读 1876·2019-08-26 10:58
阅读 3063·2019-08-26 10:19