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

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

1、 前端界面搭建html

clipboard.png

前端的话没有使用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 class="container box">

        <div class="row valign-wrapper">
            <div class="col l4 offset-l4">
                <div class="row">
                    <div class="input-field">
                        <input id="email" type="email" class="validate"> <label
                            for="email" data-error="error" data-success="success">邮件</label>
                    </div>
                    <div class="input-field">
                        <input id="password" type="password" class="validate"> <label
                            for="password">密码</label>
                    </div>
                    <div class="input-field center-align">
                        <a class="btn waves-effect waves-light" id="btn">注册</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>

clipboard.png

当消息为空的提示java

2、后端开发jquery

一、SMTP协议git

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

二、搭建SendEmail.javagithub

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

依赖:ajax

<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,以前看过一些博客,可是里面都没有涉及到这个问题,解决方案以下:

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

clipboard.png

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

clipboard.png

受权码就是第三方登陆时用到的认证密码

三、注册信息提交

项目代码:

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 id="insertUser">
       insert into user(email,password,code) values(#{email},#{password},#{code})
    </insert>
    <select id="selectUserByEmail" resultType="com.web.pojo.User">
       select * from user where email=#{email}
    </select>
    <select id="selectUserList" resultType="com.web.pojo.User">
         select * from user
    </select>

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

clipboard.png

用户接收到信息:
clipboard.png

四、邮件发送与验证

邮箱验证,首先需验证邮箱地址和惟一标识是否为用户伪造,如果伪造:
clipboard.png

clipboard.png

若正确:

clipboard.png

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

clipboard.png

注册成功并激活成功:

clipboard.png

列表界面也会改变:
clipboard.png

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 id="updateUserState">
         update user set code="",state=1 where email=#{email}
    </update>

基本的邮箱验证已经完成,其他的功能以及数据安全处理后面不断地完善,若是有不足的地方,还请你们多多指教,笔者很喜欢结交一些程序员朋友,你们能够加微信一块儿交流
微信

相关文章
相关标签/搜索