需求:在线注册,填写邮箱后发送邮件然后进行激活,才能登陆。
canMailWeb
用到的包:
类:
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name>
<filter>
<filter-name>charset</filter-name>
<filter-class>cn.hncu.filter.CharacterFilter</filter-class>
<init-param>
<param-name>charset</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>charset</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>RegServlet</servlet-name>
<servlet-class>cn.hncu.reg.servlet.RegServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>ActiveServlet</servlet-name>
<servlet-class>cn.hncu.active.ActiveServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>cn.hncu.login.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RegServlet</servlet-name>
<url-pattern>/RegServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ActiveServlet</servlet-name>
<url-pattern>/ActiveServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/LoginServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<script type="text/javascript">
function reg(){
document.forms[0].action="<c:url value='/RegServlet'/>";
document.forms[0].submit();
}
function login(){
document.forms[0].action="<c:url value='/LoginServlet' />";
document.forms[0].submit();
}
</script>
</head>
<body>
<c:if test="${!empty error}">
<font color="red">登录失败,账号或密码错误或者本账号未激活!</font>
<c:remove var="error" />
</c:if>
<c:if test="${empty user}" var="boo">
<form action="" method="post">
姓名:<input type="text" name="name"><br>
密码:<input type="text" name="pwd"><br>
邮箱:<input type="text" name="mail"><br>
<input type="button" οnclick="reg()" value="注册">
<input type="button" οnclick="login()" value="登录">
</form>
</c:if>
<c:if test="${!boo}">
欢迎你,${user.name}!
</c:if>
</body>
</html>
主页:
注册部分:
RegServlet.java
package cn.hncu.reg.servlet;
import java.io.IOException;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.hncu.domain.User;
import cn.hncu.reg.sendMail.MySendMailThread;
import cn.hncu.reg.service.IRegService;
import cn.hncu.reg.service.RegServiceImpl;
public class RegServlet extends HttpServlet {
//注入 service
IRegService service = new RegServiceImpl();
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name=request.getParameter("name");
String pwd=request.getParameter("pwd");
String mail=request.getParameter("mail");
User user=new User();
user.setName(name);
user.setPwd(pwd);
user.setMail(mail);
try {
user=service.reg(user);
new MySendMailThread(user).start();
response.getWriter().println("你已经注册成功,请去接收邮件并激活账号,若因网络延迟未收到验证邮件,请耐心等待!");
} catch (SQLException e) {
response.getWriter().println("注册失败!");
}
}
}
IRegService.java
package cn.hncu.reg.service;
import java.sql.SQLException;
import cn.hncu.domain.User;
public interface IRegService {
public abstract User reg(User user) throws SQLException;
}
RegServiceImpl.java
package cn.hncu.reg.service;
import java.sql.SQLException;
import cn.hncu.domain.User;
import cn.hncu.reg.dao.RegDao;
import cn.hncu.reg.dao.RegDaoJdbc;
public class RegServiceImpl implements IRegService{
//注入 dao
RegDao dao=new RegDaoJdbc();
@Override
public User reg(User user) throws SQLException {
return dao.reg(user);
}
}
RegDao.java
package cn.hncu.reg.dao;
import java.sql.SQLException;
import cn.hncu.domain.User;
public interface RegDao {
public abstract User reg(User user) throws SQLException;
}
RegDaoJdbc.java
package cn.hncu.reg.dao;
import java.sql.SQLException;
import java.util.UUID;
import org.apache.commons.dbutils.QueryRunner;
import cn.hncu.domain.User;
import cn.hncu.pubs.C3p0Utils;
public class RegDaoJdbc implements RegDao{
@Override
public User reg(User user) throws SQLException {
String sql="insert into user(id,name,pwd,mail,acode,active) values(?,?,?,?,?,?)";
if(C3p0Utils.getDataSource()==null){
System.out.println("为空.....");
return null;
}
QueryRunner run=new QueryRunner(C3p0Utils.getDataSource());
String id=UUID.randomUUID().toString().replace("-", "");
String acode=UUID.randomUUID().toString().replace("-", "");
run.update(sql,id,user.getName(),user.getPwd(),user.getMail(),acode,"0");
user.setId(id);
user.setAcode(acode);
user.setActive("0");//激活状态:0 代表未激活
System.out.println(user);
return user;
}
}
MySendMailThread.java
package cn.hncu.reg.sendMail;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Message.RecipientType;
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 cn.hncu.domain.User;
public class MySendMailThread extends Thread{
private User u;
public MySendMailThread(User user) {
this.u=user;
}
@Override
public void run() {
try {
//1.创建一个进行邮件发送会话的session对象
Properties p=new Properties();
p.setProperty("mail.host", "smtp.qq.com");//
p.setProperty("mail.smtp.auth", "true");
p.setProperty("mail.smtp.port", "587");//QQ: 官网上给出发送端口为587/465,但是我这里只有587成功了
Session session=Session.getDefaultInstance(p,new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
PasswordAuthentication pa=new PasswordAuthentication("862482770@qq.com", "wlidwygoikqcbfci");//QQ: 用户名为QQ邮箱,密码是QQ给的16位SMTP口令
return pa;
}
});
session.setDebug(true);//设置让程序和邮件服务器进行问答式交互
//2.声明一封邮件-----MimeMessage
MimeMessage msg=new MimeMessage(session);
msg.setFrom(new InternetAddress("862482770@qq.com"));
msg.setRecipient(RecipientType.TO, new InternetAddress(u.getMail()));
//设置邮件发送的内容
msg.setSubject("邮箱验证激活");
StringBuilder sb=new StringBuilder();
sb.append(" <a href='http://127.0.0.1:8080/canMailWeb/ActiveServlet?acode"+u.getAcode()+"'>请点击此处激活账号</a>");
sb.append("<br/>若点击无反应,则把这段网址贴到地址栏中进行访问:");
sb.append(http://127.0.0.1:8080/canMailWeb/ActiveServlet?acode+u.getAcode());
msg.setContent(sb.toString(), "text/html;charset=utf-8");
//3.发送
Transport.send(msg);
} catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
![](https://img-blog.csdn.net/20170221212551899?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvenVvc2l4aWFvbmVuZ3Nob3U=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
工具类:
C3p0Utils.java
package cn.hncu.pubs;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class C3p0Utils {
//本地线程管理对象,用于实现:统一线程获取同一个连接
private static ThreadLocal<Connection> t=new ThreadLocal<Connection>();
private static DataSource pool;
static{
try {
//配置文件和当前类放在一起
pool=new ComboPooledDataSource();//使用默认配置选项
} catch (Exception e) {
e.printStackTrace();
}
}
public static DataSource getDataSource(){
return pool;
}
public static Connection getCon(){
//先从t 中拿,如果有就拿出去,如果没有再到池中拿且把该对象放到t 中
Connection con=t.get();
if(con==null){
try {
con=pool.getConnection();
t.set(con);//放到t中
} catch (SQLException e) {
throw new RuntimeException(e.getMessage(), e);
}
}
System.out.println("获取一个连接:"+con.hashCode());
return con;
}
}
c3p0-config.xml
<c3p0-config>
<!-- 默认配置,如果没有指定则使用这个配置 -->
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">
<![CDATA[jdbc:mysql://127.0.0.1:3306/hncu?useUnicode=true&characterEncoding=UTF-8]]>
</property>
<property name="user">hncu</property>
<property name="password">1234</property>
<!-- 初始化池大小 -->
<property name="initialPoolSize">2</property>
<!-- 最大空闲时间 -->
<property name="maxIdleTime">30</property>
<!-- 最多有多少个连接 -->
<property name="maxPoolSize">10</property>
<!-- 最少几个连接 -->
<property name="minPoolSize">2</property>
<!-- 每次最多可以执行多少个批处理语句 -->
<property name="maxStatements">50</property>
</default-config>
<!-- 命名的配置 -->
<named-config name="hncu">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">
<![CDATA[jdbc:mysql://127.0.0.1:3306/hncu?useUnicode=true&characterEncoding=UTF-8]]>
</property>
<property name="user">hncu</property>
<property name="password">1234</property>
<property name="acquireIncrement">5</property><!-- 如果池中数据连接不够时一次增长多少个 -->
<property name="initialPoolSize">10</property>
<property name="minPoolSize">5</property>
<property name="maxPoolSize">15</property>
<property name="maxStatements">0</property>
<property name="maxStatementsPerConnection">5</property> <!-- he's important, but there's only one of him -->
</named-config>
</c3p0-config>
值对象:
User.java
package cn.hncu.domain;
public class User {
private String id;
private String name;
private String pwd;
private String mail;
private String acode;
private String active;//对应数据库中的char(1)类型
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getAcode() {
return acode;
}
public void setAcode(String acode) {
this.acode = acode;
}
public String getActive() {
return active;
}
public void setActive(String active) {
this.active = active;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getMail() {
return mail;
}
public void setMail(String mail) {
this.mail = mail;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", pwd=" + pwd + ", mail="
+ mail + ", acode=" + acode + ", active=" + active + "]";
}
}
过滤器:
CharacterFilter.java
package cn.hncu.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class CharacterFilter implements Filter{
private String charset;
@Override
public void init(FilterConfig config) throws ServletException {
charset=config.getInitParameter("charset");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding(charset);
response.setContentType("text/html;charset=utf-8");
chain.doFilter(request, response);
}
@Override
public void destroy() {
}
}
激活部分:
ActiveServlet.java
package cn.hncu.active;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ActiveServlet extends HttpServlet {
//这里省略了service和dao的接口
private ActiveServiceImpl service=new ActiveServiceImpl();
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String acode=request.getParameter("acode");
boolean boo=service.active(acode);
request.setAttribute("active", boo);
request.getRequestDispatcher("/jsps/result.jsp").forward(request, response);
}
}
ActiveServiceImpl.java
package cn.hncu.active;
public class ActiveServiceImpl {
private ActiveDaoJdbc dao=new ActiveDaoJdbc();
public boolean active(String acode) {
return dao.active(acode);
}
}
ActiveDaoJdbc.java
package cn.hncu.active;
import java.sql.SQLException;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import cn.hncu.pubs.C3p0Utils;
public class ActiveDaoJdbc {
public boolean active(String acode) {
try {
String sql="select count(1) from user where acode=?";
QueryRunner run=new QueryRunner(C3p0Utils.getDataSource());
int num=Integer.valueOf(""+run.query(sql, new ScalarHandler(),acode));
if(num==0){
return false;
}
sql="update user set active='1' where acode=?";
run.update(sql,acode);
return true;
} catch (SQLException e) {
return false;
}
}
}
![](https://img-blog.csdn.net/20170221214535205?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvenVvc2l4aWFvbmVuZ3Nob3U=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
登录部分:
LoginServlet.java
package cn.hncu.login;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.hncu.domain.User;
public class LoginServlet extends HttpServlet {
private LoginServiceImpl service=new LoginServiceImpl();
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name=request.getParameter("name");
String pwd=request.getParameter("pwd");
User user=new User();
user.setName(name);
user.setPwd(pwd);
user=service.login(user);
if(user==null){
request.getSession().setAttribute("error", "1");
}else{
request.getSession().setAttribute("user", user);
}
response.sendRedirect(request.getContextPath()+"/index.jsp");
}
}
LoginServiceImpl.java
package cn.hncu.login;
import cn.hncu.domain.User;
public class LoginServiceImpl {
private LoginDaoJdbc dao=new LoginDaoJdbc();
public User login(User user) {
return dao.login(user);
}
}
LoginDaoJdbc.java
package cn.hncu.login;
import java.sql.SQLException;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import cn.hncu.domain.User;
import cn.hncu.pubs.C3p0Utils;
public class LoginDaoJdbc {
public User login(User user) {
String sql="select * from user where name=? and pwd=? and active='1'";
QueryRunner run=new QueryRunner(C3p0Utils.getDataSource());
try {
user =run.query(sql, new BeanHandler<User>(User.class),user.getName(),user.getPwd());
return user;
} catch (SQLException e) {
return null;
}
}
}
result.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<script type="text/javascript">
var time;
var i=5;
function skip(){
i--;
d1.innerHTML=i+" 秒后自动跳转到登录界面";
if(i<1){
window.clearInterval(time);
window.location.href="<c:url value='/index.jsp' />";
}
}
οnlοad=function(){
time=window.setInterval(skip,1000);
};
</script>
</head>
<body>
<c:if test="${active}">
<font color="red">恭喜您,激活成功!</font><a href="<c:url value='/index.jsp' />">点击此处跳转到登录界面</a><br/><br/>
<c:remove var="boo"/>
</c:if>
<div id="d1"></div><br/>
<c:if test="${!active}">
<font color="red">激活失败!</font>
</c:if>
</body>
</html>