Web教程(9) 邮件发送和验证码

一、使用QQ邮箱发送邮件

1.获取QQ邮箱的授权码

QQ邮箱–> 设置–>账户–> 生成授权码
在这里插入图片描述
生成验证码
在这里插入图片描述

2.导入jar包 —— mail.jar

添加到构建路径WEB-INF/lib
右键–> Build Path–> Add to Build Path
在这里插入图片描述

3.测试代码

import java.util.Properties;

import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class JavaMailLearn {

	public static void main(String[] args) throws Exception {
		//设置参数
		Properties prop = new Properties();
	    prop.setProperty("mail.smtp.host", "smtp.qq.com");
	    prop.setProperty("mail.transport.protocol", "smtp");
	    prop.setProperty("mail.smtp.auth", "true");     //是否要验证用户
	    prop.setProperty("mail.smtp.port", "465");
	    prop.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
	    prop.setProperty("mail.smtp.socketFactory.port", "465");
	    
	    //发送邮件的5个步骤
        //1. 获取session
        Session session=Session.getInstance(prop);
        session.setDebug(true);
        //2.创建ts对象
        Transport ts=session.getTransport();
        //3.连接发件服务器
        //通过第三方连接QQ邮箱服务器,需要邮箱地址、授权码
        ts.connect("smtp.qq.com", "[email protected]", "avpvwswhgufvbdhh");
        //4.创建邮件对象
        Message message=createMessage(session);
        //5.发送邮件
        ts.sendMessage(message,message.getAllRecipients());
        ts.close();
	}
	
	//创建邮件
	public static MimeMessage createMessage(Session session) throws Exception{
		//创建邮件对象
		MimeMessage message=new MimeMessage(session);
		//声明发件人
		message.setFrom(new InternetAddress("[email protected]"));
		//声明收件人
		message.setRecipient(Message.RecipientType.TO, new InternetAddress("[email protected]"));
		//声明主题
		message.setSubject("邮箱发送测试");
		//声明内容
		message.setContent("<a href='http://www.baidu.com'>百度一下</a>","text/html;charset=utf-8");
		return message;
	}
}

验证码实现

1.图片验证码原理

在登录的时候,登陆页面上有一个img标签,在src路径填写获取验证码的地址,验证码由后台生成。后台接收到请求之后,先生成随机的数字和字符,把随机生成的字串放入session,等待校验,然后调用验证码生成工具类生成验证码,返回前台。
前台输入验证码和session里面的验证码对比,一样就对比通过。

2.验证码工具类

有点长,略(见源码)

3.VerifyCodeServlet

package org.lanqiao.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.lanqiao.util.VerifyCodeUtils;

/**
 * 生成验证码的servlet
 */
@WebServlet("/VerifyCodeServlet")
public class VerifyCodeServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
    public VerifyCodeServlet() {
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//取消浏览器缓存
		response.setHeader("Pragma", "No-cache"); 
		response.setHeader("Cache-Control", "no-cache"); 
		response.setDateHeader("Expires", 0); 
		response.setContentType("image/jpeg");    //设置上下文类型 图片响应
		//获取随机的字符和数字
		String code=VerifyCodeUtils.generateVerifyCode(4);
		request.getSession().setAttribute("code", code);
		//通过字符生成验证码
		VerifyCodeUtils.outputImage(100, 43, response.getOutputStream(), code);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}
}

4.UserServlet.java

package org.lanqiao.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.lanqiao.bean.User;
import org.lanqiao.service.IUserService;
import org.lanqiao.service.impl.UserServiceImpl;

import jdk.nashorn.internal.ir.RuntimeNode.Request;

/**
 * Servlet implementation class UserServlet
 */
@WebServlet("/UserServlet")
public class UserServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	//声明并创建UserService
	IUserService userService=new UserServiceImpl();

	//所有的请求都会进入service方法
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//设置字符集编码
		request.setCharacterEncoding("utf-8");
		//接收flag,判断要执行的操作
		String flag=request.getParameter("flag");
		
		if("checkCode".equals(flag)) {
			//执行验证码验证
			checkCode(request,response);
		}
	}
	
	//验证码验证
	public void checkCode(HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException {
		//获取用户输入的验证码
		String userCode=request.getParameter("userCode");
		//取出session中的验证码
		String code=(String)request.getSession().getAttribute("code");
		//创建pw对象
		PrintWriter pw=response.getWriter();
		//两者进行对比,如果输入正确验证成功
		if(code.equalsIgnoreCase(userCode)) {			//验证码是不区分大小写的对比
			pw.write("200");
		}else {
			pw.write("400");
		}		
	}
}

5.login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>登录</title>  
    <link rel="stylesheet" href="css/pintuer.css">
    <link rel="stylesheet" href="css/admin.css">
    <script src="js/jquery.js"></script>
    <script src="js/pintuer.js"></script>  
</head>
<body>
<div class="bg"></div>
<div class="container">
    <div class="line bouncein">
        <div class="xs6 xm4 xs3-move xm4-move">
            <div style="height:150px;"></div>
            <div class="media media-y margin-big-bottom">           
            </div>         
            <form action="UserServlet" method="post">
            <input type="hidden" name="flag" value="login"/>
            <div class="panel loginbox">
                <div class="text-center margin-big padding-big-top"><h1>后台管理中心</h1></div>
                <div class="panel-body" style="padding:30px; padding-bottom:10px; padding-top:10px;">
                    <div class="form-group">
                        <div class="field field-icon-right">
                            <input type="text" class="input input-big" name="username" placeholder="登录账号" data-validate="required:请填写账号" />
                            <span class="icon icon-user margin-small"></span>
                        </div>
                    </div>
                    <div class="form-group">
                        <div class="field field-icon-right">
                            <input type="password" class="input input-big" name="pass" placeholder="登录密码" data-validate="required:请填写密码" />
                            <span class="icon icon-key margin-small"></span>
                        </div>
                    </div>
                    <div class="form-group">
                        <div class="field">
                            <input type="text" class="input input-big" name="code" placeholder="填写右侧的验证码" data-validate="required:请填写右侧的验证码" onblur="checkCode(this)" />
                        < img src="VerifyCodeServlet" alt="" width="100" height="32" class="passcode" style="height:43px;cursor:pointer;" onclick="this.src=this.src+'?'"    //此处加 '>'
                                                   
                        </div
                    </div>
                </div>
                <div style="padding:30px;"><input type="submit" class="button button-block bg-main text-big input-big" value="登录"></div>
            </div>
            </form>          
        </div>
    </div>
</div>
</body>
<script type="text/javascript">
	function checkCode(data){
		var data=$(data).val();
		$.ajax({
			url:"UserServlet",
			method:"get",
			data:{
				userCode:data,		//用户输入的验证码
				flag:"checkCode"
			},
			success:function(result){
				if(result=="200"){
					alert('验证码输入正确');
				}else if(result="400"){
					alert('验证码输入错误')
				}else{
					alert("未知错误")
				}
			}
		})
	}
</script>
</html>

猜你喜欢

转载自blog.csdn.net/weixin_42073620/article/details/94616548