一套完整的登陆注册业务逻辑
- 准备部分
- 基础工具类
- Base
package com.jericho.tools; import com.google.gson.Gson; import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Field; import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.util.HashMap; import java.util.Map; import java.util.Random; public class Base { static Gson gson = new Gson(); private static Map
- DbUtils
package com.yjzblog.web.utils; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.ResourceBundle; /** * 数据库工具类 */ public class DbUtils { private static String driver = null; private static String dns = null; private static String user = null; private static String pwd = null; static { // 读取配置文件 ResourceBundle rb = ResourceBundle.getBundle("db"); DbUtils.driver = rb.getString("driver"); DbUtils.dns = rb.getString("dns"); DbUtils.user = rb.getString("user"); DbUtils.pwd = rb.getString("pwd"); // 获取数据库驱动 // 获取数据库驱动 try { Class.forName(DbUtils.driver); } catch (Exception e) { e.printStackTrace(); } } /** * 获取链接 * * @return Connection * @throws Exception */ public static Connection getConn() throws Exception { return DriverManager.getConnection(dns, user, pwd); } /** * 关闭资源 * * @param conn 链接 * @param stmt 参数 * @param rs 结果集 * @throws Exception */ public static void kill(Connection conn, Statement stmt, ResultSet rs) throws Exception { if (conn != null) { conn.close(); } if (stmt != null) { stmt.close(); } if (rs != null) { rs.close(); } } }
- 数据库配置db.properties
driver=com.mysql.jdbc.Driver dns=jdbc:mysql://localhost:3306/yjzblog user=root pwd=1
- web.xml
- 基础工具类
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
Index
com.yjzblog.web.servlet.IndexServlet
Index
/index
Register
com.yjzblog.web.servlet.RegisterServlet
Register
/register
Login
com.yjzblog.web.servlet.LoginServlet
Login
/login
Welcome
com.yjzblog.web.servlet.WelcomeServlet
Welcome
/welcome
Demo
com.yjzblog.web.servlet.DemoServlet
Demo
/demo
Exit
com.yjzblog.web.servlet.ExitServlet
Exit
/exit
```
2. 实体类
1. User
```js
package com.yjzblog.web.domain;
/**
* user实体类
*/
public class User {
private long id;
private String mobile_no;
private String pwd;
private String salt;
private String nickname;
@Override
public String toString() {
return "User{" +
"id=" + id +
", mobile_no='" + mobile_no + '\'' +
", pwd='" + pwd + '\'' +
", salt='" + salt + '\'' +
", nickname='" + nickname + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
if (id != user.id) return false;
if (mobile_no != null ? !mobile_no.equals(user.mobile_no) : user.mobile_no != null) return false;
if (pwd != null ? !pwd.equals(user.pwd) : user.pwd != null) return false;
if (salt != null ? !salt.equals(user.salt) : user.salt != null) return false;
return nickname != null ? nickname.equals(user.nickname) : user.nickname == null;
}
@Override
public int hashCode() {
int result = (int) (id ^ (id >>> 32));
result = 31 * result + (mobile_no != null ? mobile_no.hashCode() : 0);
result = 31 * result + (pwd != null ? pwd.hashCode() : 0);
result = 31 * result + (salt != null ? salt.hashCode() : 0);
result = 31 * result + (nickname != null ? nickname.hashCode() : 0);
return result;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getMobile_no() {
return mobile_no;
}
public void setMobile_no(String mobile_no) {
this.mobile_no = mobile_no;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getSalt() {
return salt;
}
public void setSalt(String salt) {
this.salt = salt;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
}
```
- 业务实现
- 主页(引导页)
- index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
webStu Hello Java
注册 登陆- IndexServlet
package com.yjzblog.web.servlet; 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 java.io.IOException; import java.io.PrintWriter; @WebServlet(name = "IndexServlet") public class IndexServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); PrintWriter out = response.getWriter(); request.getRequestDispatcher("/index.jsp").forward(request, response); } }
- 注册
- register.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
注册 注册
- RegisterServlet
package com.yjzblog.web.servlet; import com.google.gson.Gson; import com.jericho.tools.Base; import com.yjzblog.web.domain.User; import com.yjzblog.web.service.UserService; import com.yjzblog.web.service.impl.UserServiceImpl; 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 java.io.IOException; import java.io.PrintWriter; @WebServlet(name = "RegisterServlet") public class RegisterServlet extends HttpServlet { UserService userService = new UserServiceImpl(); Gson gson = new Gson(); protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); PrintWriter out = response.getWriter(); Base.showRequest(request); // 获取表单数据 try { User user = Base.requestToBean(User.class, request, "repeat"); String repeat = request.getParameter("repeat"); // 判断两次密码是否一致 if (user.getPwd().equals(repeat)) { // 两次密码一致,生成MD5密码 user.setPwd(Base.md5(user.getPwd())); // 密码加盐 user.setSalt(Base.getRandomString(4)); user.setPwd(Base.md5(user.getPwd() + user.getSalt())); // 保存到数据库 boolean register = this.userService.register(user); System.out.println(register); out.print(Base.jsonSuccess(register ? "注册成功" : "注册失败")); } } catch (Exception e) { e.printStackTrace(); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); PrintWriter out = response.getWriter(); request.getRequestDispatcher("/register.jsp").forward(request, response); } }
- UserDao
package com.yjzblog.web.dao; import com.yjzblog.web.domain.User; /** * user数据处理接口 */ public interface UserDao { /** * 创建信息用户 * * @param user 用户信息 * @return int * @throws Exception */ public int add(User user) throws Exception; /** * 根据mobile_no查询数据 * * @param mobile_no 手机号 * @return User * @throws Exception */ public User readOneBymobile_no(String mobile_no) throws Exception; }
- UserDaoImpl
package com.yjzblog.web.dao.impl; import com.jericho.tools.Base; import com.yjzblog.web.dao.UserDao; import com.yjzblog.web.domain.User; import com.yjzblog.web.utils.DbUtils; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; /** * user数据处理实现类 */ public class UserDaoImpl implements UserDao { /** * 创建新用户 * * @param user 用户信息 * @return int * @throws Exception */ @Override public int add(User user) throws Exception { Connection conn = DbUtils.getConn(); PreparedStatement ps = conn.prepareStatement("INSERT INTO `user` (mobile_no,pwd,salt,nickname) VALUES (?,?,?,?)"); try { ps.setString(1, user.getMobile_no()); ps.setString(2, user.getPwd()); ps.setString(3, user.getSalt()); ps.setString(4, user.getNickname()); int i = ps.executeUpdate(); return i; } catch (Exception e) { e.printStackTrace(); } finally { DbUtils.kill(conn, ps, null); } return 0; } /** * 根据mobile_no 查询数据 * * @param mobile_no 手机号 * @return User * @throws Exception */ @Override public User readOneBymobile_no(String mobile_no) throws Exception { Connection conn = DbUtils.getConn(); PreparedStatement preparedStatement = conn.prepareStatement("SELECT * FROM user WHERE mobile_no = ?"); ResultSet rs = null; // 获取用户数据 try { preparedStatement.setString(1, mobile_no); rs = preparedStatement.executeQuery(); return Base.resultSetToBean(rs, User.class); } catch (Exception e) { e.printStackTrace(); } finally { DbUtils.kill(conn, preparedStatement, rs); } return null; } }
- UserService
package com.yjzblog.web.service; import com.yjzblog.web.domain.User; /** * 用户服务接口 */ public interface UserService { /** * 注册 * * @param user 用户信息 * @return boolean * @throws Exception */ public boolean register(User user) throws Exception; /** * 登陆 * * @param user 用户数据 * @return User * @throws Exception */ public User login(User user) throws Exception; }
- UserServiceImpl
package com.yjzblog.web.service.impl; import com.jericho.tools.Base; import com.yjzblog.web.dao.UserDao; import com.yjzblog.web.dao.impl.UserDaoImpl; import com.yjzblog.web.domain.User; import com.yjzblog.web.service.UserService; /** * 用户服务实现类 */ public class UserServiceImpl implements UserService { UserDao userDao = new UserDaoImpl(); /** * 注册 * * @param user 用户信息 * @return boolean * @throws Exception */ @Override public boolean register(User user) throws Exception { int add = this.userDao.add(user); return add > 0; } /** * 登陆 * * @param user 用户数据 * @return User * @throws Exception */ @Override public User login(User user) throws Exception { // 获取数据库信息 User userData = this.userDao.readOneBymobile_no(user.getMobile_no()); // 密码加盐运算 String pwd = Base.md5(Base.md5(user.getPwd()) + userData.getSalt()); if (pwd.equals(userData.getPwd())) { // 密码正确 userData.setSalt("");// 去掉多余字段 return userData; } else { // 密码错误 return null; } } }
- 登陆
- login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
登陆 登陆
- LoginServlet
package com.yjzblog.web.servlet; import com.google.gson.Gson; import com.jericho.tools.Base; import com.yjzblog.web.domain.User; import com.yjzblog.web.service.UserService; import com.yjzblog.web.service.impl.UserServiceImpl; 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 java.io.IOException; import java.io.PrintWriter; @WebServlet(name = "LoginServlet") public class LoginServlet extends HttpServlet { Gson gson = new Gson(); User user = null; UserService userService = new UserServiceImpl(); protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); PrintWriter out = response.getWriter(); try { // 获取表单数据 this.user = Base.requestToBean(User.class, request, "id,salt,nickname"); // 执行登陆 User user = this.userService.login(this.user); if (user != null) { // 登陆成功,保存到session request.getSession().setAttribute("user", user); out.print(Base.jsonSuccess("登陆成功")); } else { out.print(Base.jsonFail("账号或密码错误")); } } catch (Exception e) { e.printStackTrace(); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); PrintWriter out = response.getWriter(); // 读取session数据,判断是否已经登陆 User user = (User) request.getSession().getAttribute("user"); if (user != null) { // 已登陆 request.getRequestDispatcher("/welcome.jsp").forward(request, response); } else { // 未登陆 request.getRequestDispatcher("/login.jsp").forward(request, response); } } }
- 欢迎页
- welcome.jsp
<%@ page import="com.yjzblog.web.domain.User" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %>
登陆成功 登陆成功
<% User user = (User) request.getSession().getAttribute("user"); %> 欢迎登陆:<%=user.getNickname()%>
退出登陆- WelcomeServlet
package com.yjzblog.web.servlet; import com.google.gson.Gson; 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 java.io.IOException; import java.io.PrintWriter; @WebServlet(name = "WelcomeServlet") public class WelcomeServlet extends HttpServlet { Gson gson = new Gson(); protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); PrintWriter out = response.getWriter(); this.doGet(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); PrintWriter out = response.getWriter(); Object user = request.getSession().getAttribute("user"); if (user == null) { request.getRequestDispatcher("/login.jsp").forward(request, response); } else { request.getRequestDispatcher("/welcome.jsp").forward(request, response); } } }
- 退出登陆
- ExitServlet
package com.yjzblog.web.servlet; import com.google.gson.Gson; import com.jericho.tools.Base; 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 java.io.IOException; import java.io.PrintWriter; @WebServlet(name = "ExitServlet") public class ExitServlet extends HttpServlet { Gson gson = new Gson(); protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); PrintWriter out = response.getWriter(); // 清除session request.getSession().invalidate(); out.print(this.gson.toJson(Base.returnSuccess("退出成功"))); } }
- 主页(引导页)