【Java】【MVC】一套完整的登陆注册逻辑

一套完整的登陆注册业务逻辑

  1. 准备部分
    1. 基础工具类
      1. 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 _makeReturnMap(boolean isSuccess) {
          Map map = new HashMap<>();
          if (isSuccess) {
              map.put("err", 0);
          } else {
              map.put("err", 1);
          }
          return map;
      }
      
      /**
       * 生成成功返回结果信息
       *
       * @param message 描述
       * @return Map
       */
      public static Map returnSuccess(String message) {
          Map map = Base._makeReturnMap(true);
          map.put("msg", message);
          return map;
      }
      
      /**
       * 生成成功返回结果信息
       *
       * @param map 描述
       * @return Map
       */
      public static Map returnSuccess(Map map) {
          Map res = Base._makeReturnMap(true);
          res.putAll(map);
          return res;
      }
      
      /**
       * 返回json格式成功信息
       *
       * @param message 描述
       * @return String
       */
      public static String jsonSuccess(String message) {
          return Base.gson.toJson(Base.returnSuccess(message));
      }
      
      /**
       * 返回json格式成功信息
       *
       * @param map 描述
       * @return String
       */
      public static String jsonSuccess(Map map) {
          return Base.gson.toJson(Base.returnSuccess(map));
      }
      
      /**
       * 生成失败返回结果信息
       *
       * @param message 描述
       * @return Map
       */
      public static Map returnFail(String message) {
          Map map = Base._makeReturnMap(false);
          map.put("msg", message);
          return map;
      }
      
      /**
       * 生成失败返回结果信息
       *
       * @param map 描述
       * @return Map
       */
      public static Map returnFail(Map map) {
          Map res = Base._makeReturnMap(false);
          res.putAll(map);
          return res;
      }
      
      /**
       * 生成json格式失败信息
       *
       * @param message 描述
       * @return String
       */
      public static String jsonFail(String message) {
          return Base.gson.toJson(Base.returnFail(message));
      }
      
      /**
       * 生成json格式失败信息
       *
       * @param map 描述
       * @return String
       */
      public static String jsonFail(Map map) {
          return Base.gson.toJson(Base.returnFail(map));
      }
      
      /**
       * 生成md5
       *
       * @param str 待加密字符串
       * @return String
       * @throws NoSuchAlgorithmException
       */
      public static String md5(Object str) throws NoSuchAlgorithmException {
          MessageDigest md5 = MessageDigest.getInstance("MD5");
          md5.update(str.toString().getBytes());
          return new BigInteger(1, md5.digest()).toString(16);
      }
      
      /**
       * 显示请求结果
       *
       * @param request 请求数据
       */
      public static void showRequest(HttpServletRequest request) {
          Map map = request.getParameterMap();
          for (Map.Entry m :
                  map.entrySet()) {
              String key = m.getKey();
              String[] values = m.getValue();
              System.out.print(key + ":");
              for (String value :
                      values) {
                  System.out.print(value + " ");
              }
              System.out.println();
          }
      }
      
      /**
       * 获取生成随机字符串
       *
       * @param length 生成字符串长度
       * @return String
       */
      public static String getRandomString(int length) {
          String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";//含有字符和数字的字符串
          Random random;//随机类初始化
          random = new Random();
          StringBuffer sb = new StringBuffer();//StringBuffer类生成,为了拼接字符串
      
          for (int i = 0; i < length; ++i) {
              int number = random.nextInt(62);// [0,62)
      
              sb.append(str.charAt(number));
          }
          return sb.toString();
      }
      
      /**
       * 将请求表单保存到实体类
       *
       * @param entity  实体类
       * @param request 请求数据
       * @param      T
       * @return T
       * @throws Exception
       */
      public static  T requestToBean(Class entity, HttpServletRequest request) throws Exception {
          Map map = request.getParameterMap();
          T cls = entity.newInstance();
          Class clsClass = cls.getClass();
      
          for (Map.Entry m :
                  map.entrySet()) {
              String key = m.getKey();
              String[] value = m.getValue();
      
              Field field = clsClass.getDeclaredField(key);
              field.setAccessible(true);
              if (value.length == 1) {
                  field.set(cls, value[0]);
              } else {
                  field.set(cls, (Object) value);
              }
          }
          return cls;
      }
      
      /**
       * 将请求表单保存到实体类
       *
       * @param entity    实体类
       * @param request   请求数据
       * @param exception 排除在外的字段
       * @param        T
       * @return T
       * @throws Exception
       */
      public static  T requestToBean(Class entity, HttpServletRequest request, String exception) throws Exception {
          Map map = request.getParameterMap();
          T cls = entity.newInstance();
          Class clsClass = cls.getClass();
      
          for (Map.Entry m :
                  map.entrySet()) {
              String key = m.getKey();
              String[] value = m.getValue();
      
              if (exception.indexOf(key) != -1) {
                  continue;
              } else {
                  Field field = clsClass.getDeclaredField(key);
                  field.setAccessible(true);
                  if (value.length == 1) {
                      field.set(cls, value[0]);
                  } else {
                      field.set(cls, (Object) value);
                  }
              }
          }
          return cls;
      }
      
      public static  T resultSetToBean(ResultSet rs, Class cls)
              throws Exception {
          T resultObject = null;
          int index = 1;
      
          ResultSetMetaData metaData = rs.getMetaData();
          int cols_len = metaData.getColumnCount();
          while (rs.next()) {
              // 通过反射机制创建一个实例
              resultObject = cls.newInstance();
              for (int i = 0; i < cols_len; i++) {
                  String cols_name = metaData.getColumnName(i + 1);
                  Object cols_value = rs.getObject(cols_name);
      
                  if (cols_value == null) {
                      cols_value = "";
                  }
                  Field field = cls.getDeclaredField(cols_name);
                  field.setAccessible(true); // 打开javabean的访问权限
                  field.set(resultObject, cols_value);
              }
          }
      
          return resultObject;
      }
      }
      
      1. 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();
          }
      }
      }
      
      1. 数据库配置db.properties
      driver=com.mysql.jdbc.Driver
      dns=jdbc:mysql://localhost:3306/yjzblog
      user=root
      pwd=1
      
      1. web.xml
      
      

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">

15


index
index.jsp
demo

        
        
            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;
    }
    }
    ```
  1. 业务实现
    1. 主页(引导页)
      1. index.jsp
      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      
      
          webStu
          
      
      
      

      Hello Java

      注册 登陆
      1. 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);
      }
      }
      
    2. 注册
      1. register.jsp
      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      
      
          注册
          
      
      
      

      注册

      注册
      1. 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);
      }
      }
      
      1. 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;
      }
      
      1. 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;
      }
      }
      
      1. 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;
      }
      
      1. 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;
          }
      }
      }
      
    3. 登陆
      1. login.jsp
      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      
      
          登陆
          
      
      
      

      登陆

      登陆
      1. 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);
          }
      }
      }
      
    4. 欢迎页
      1. 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()%>
      退出登陆
      1. 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);
          }
      }
      }
      
    5. 退出登陆
      1. 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("退出成功")));
      }
      }
      

你可能感兴趣的:(【Java】【MVC】一套完整的登陆注册逻辑)