一个用户注册登陆的系统,用到了MD5加密处理密码,实现了一个简单的数据库连接池connectionPool,

实现了注册,登陆,登陆之后修改用户信息等功能,非常适合初学者

一.准备工作

数据库:MySQL  5.5.62-log MySQL Community Server (GPL)

创建user表,数据库为first_db;

CREATE TABLE IF NOT EXISTS `user`(
`user_id` INT UNSIGNED AUTO_INCREMENT,
 `username` VARCHAR(100) NOT NULL,
 `password` VARCHAR(100) NOT NULL,
 `phone` VARCHAR(100) NOT NULL, PRIMARY KEY ( `user_id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

二.项目结构图:

三.部分核心代码

web.xml: 

实现servlet指向CheckUser类和UpdateUser类,指定login.jsp为首页

<?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><servlet><servlet-name>CheckUser</servlet-name><servlet-class>com.Account.CheckUser</servlet-class></servlet><servlet><servlet-name>UpdateUser</servlet-name><servlet-class>com.Account.UpdateUser</servlet-class></servlet><servlet-mapping><servlet-name>CheckUser</servlet-name><url-pattern>/CheckUser</url-pattern></servlet-mapping><servlet-mapping><servlet-name>UpdateUser</servlet-name><url-pattern>/UpdateUser</url-pattern></servlet-mapping> <welcome-file-list><welcome-file>login.jsp</welcome-file></welcome-file-list>
</web-app>

login.jsp:

login.jsp是登陆页面,from表单中加了一个<input type="hidden" name="actiontype" value="login" />的隐藏按钮,用于在CheckUser类中判断是登陆还是注册,通过actiontype的值。点击登陆,根据servlet分发到CheckUser类处理请求

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><!DOCTYPE html>
<html><head><title>登陆</title></head><body><h2>欢迎登陆</h2><form action="CheckUser" method="post">账号:<input type="text" name="userName"><br/>密码:<input type="password" name="password"><br/><input type="hidden" name="actiontype" value="login" /> <!-- 用隐藏域来判断登陆还是注册 --><input type="submit" value="登陆"/><br/><br /></form><button onclick="window.location='register.jsp'">注册</button>${sessionScope.errorMsg} <!-- EL语法--获取session的errorMsg并显示 --></body>
</html>

CheckUser.java:

实现处理登陆注册的请求 向数据库请求并返回结果

package com.Account;
import java.io.IOException;import java.sql.Connection;
//import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;@SuppressWarnings("serial")
public class CheckUser extends HttpServlet {public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {HttpSession session = request.getSession();String userName = request.getParameter("userName");String password = request.getParameter("password");//md5对密码加密Md5 md5=new Md5();//判断类型是登陆还是注册String Sql="";String action_type = request.getParameter("actiontype");if(action_type.equals("login")){Sql = "SELECT user_id,username,password,phone FROM user "+ "where username='" + userName+ "' AND password='" + md5.MD5(password) + "' ";}else if(action_type.equals("register")){Sql = "INSERT into user (username,password,phone) values ('"+ userName+"' ,'"+md5.MD5(password) +"',' ')";}Connection connection = null;PreparedStatement preSta = null;ResultSet rs = null;// 建立连接,DriverManager是JDBC的管理层try {//使用连接池的方式连接数据库ConnectionPool.setUrl(ConnectionPool.getUrl());ConnectionPool.setUser(ConnectionPool.getUser());//DBTools.getDatabaseUserName()ConnectionPool.setPassword(ConnectionPool.getPassword());connection = ConnectionPool.getConnection();preSta = connection.prepareStatement(Sql);UserInfo info = null;if(action_type.equals("login")) {rs = preSta.executeQuery();while(rs.next()){info = new UserInfo();info.setuser_id(rs.getInt("user_id"));info.setUserName(rs.getString("username"));info.setPassword(rs.getString("password"));info.setPhone(rs.getString("phone"));}if(info != null){session.setAttribute("password", password);session.setAttribute("info", info);String login_suc = "success.jsp";response.sendRedirect(login_suc);}else{String login_fail = "login.jsp";session.setAttribute("errorMsg", "用户名或密码错误,登陆失败!");response.sendRedirect(login_fail); }}else if(action_type.equals("register")){int count= preSta.executeUpdate();if(count>0){session.setAttribute("registerMsg", "注册成功!");}else{session.setAttribute("registerMsg", "注册失败,请重试!");}response.sendRedirect("register.jsp");}} catch (Exception e) {e.printStackTrace();}// 关闭连接finally {if(connection!=null){try{connection.close();}catch(Exception e){}}if(preSta!=null){try{preSta.close();}catch(Exception e){}}if(rs!=null){try{rs.close();}catch(Exception e){}}}}
}

MD5.Java:

MD5加密类,给password字段加密

package com.Account;import java.security.MessageDigest;public class Md5 {public final String MD5(String s) {//MD5加密方法char hexDigits[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};       try {byte[] btInput = s.getBytes();// 获得MD5摘要算法的 MessageDigest 对象MessageDigest mdInst = MessageDigest.getInstance("MD5");// 使用指定的字节更新摘要mdInst.update(btInput);// 获得密文byte[] md = mdInst.digest();// 把密文转换成十六进制的字符串形式int j = md.length;char str[] = new char[j * 2];int k = 0;for (int i = 0; i < j; i++) {byte byte0 = md[i];str[k++] = hexDigits[byte0 >>> 4 & 0xf]; //>>>不带符号 右移 四位(位移处补0)str[k++] = hexDigits[byte0 & 0xf];}return new String(str);} catch (Exception e) {e.printStackTrace();return null;}}
}

ConnectionPool.java:

手动实现一个简单的数据库连接池,提升性能

package com.Account;import java.sql.*;
import java.lang.reflect.*;
import java.util.*;
import java.io.*;public class ConnectionPool {private static LinkedList m_notUsedConnection = new LinkedList();private static HashSet m_usedUsedConnection = new HashSet();private static String m_url = "jdbc:mysql://localhost:3306/first_db";private static String m_user = "root";private static String m_password = "123456";static final boolean DEBUG = true;static private long m_lastClearClosedConnection = System.currentTimeMillis();public static long CHECK_CLOSED_CONNECTION_TIME = 4 * 60 * 60 * 1000; // 4小时private void ConnectionPool() {}static {initDriver();}private static void initDriver() {Driver driver = null;// load mysql drivertry {driver = (Driver) Class.forName("com.mysql.jdbc.Driver").newInstance();installDriver(driver);} catch (Exception e) {}}public static void installDriver(Driver driver) {try {DriverManager.registerDriver(driver);} catch (Exception e){e.printStackTrace();}}public static synchronized Connection getConnection() {clearClosedConnection();while (m_notUsedConnection.size() > 0) {try {ConnectionWrapper wrapper = (ConnectionWrapper) m_notUsedConnection.removeFirst();if (wrapper.connection.isClosed()) {continue;}m_usedUsedConnection.add(wrapper);if (DEBUG) {wrapper.debugInfo = new Throwable("Connection initial statement");}return wrapper.connection;} catch (Exception e) {}}int newCount = getIncreasingConnectionCount();LinkedList list = new LinkedList();ConnectionWrapper wrapper = null;for (int i = 0; i < newCount; i++) {wrapper = getNewConnection();if (wrapper != null) {list.add(wrapper);}}if (list.size() == 0) {return null;}wrapper = (ConnectionWrapper) list.removeFirst();m_usedUsedConnection.add(wrapper);m_notUsedConnection.addAll(list);list.clear();return wrapper.connection;}private static ConnectionWrapper getNewConnection() {try {Connection con = DriverManager.getConnection(m_url, m_user,m_password);ConnectionWrapper wrapper = new ConnectionWrapper(con);return wrapper;} catch (Exception e) {e.printStackTrace();}return null;}static synchronized void pushConnectionBackToPool(ConnectionWrapper con) {boolean exist = m_usedUsedConnection.remove(con);if (exist) {m_notUsedConnection.addLast(con);}}public static int close() {int count = 0;Iterator iterator = m_notUsedConnection.iterator();while (iterator.hasNext()) {try {((ConnectionWrapper) iterator.next()).close();count++;} catch (Exception e) {}}m_notUsedConnection.clear();iterator = m_usedUsedConnection.iterator();while (iterator.hasNext()) {try {ConnectionWrapper wrapper = (ConnectionWrapper) iterator.next();wrapper.close();if (DEBUG) {wrapper.debugInfo.printStackTrace();}count++;} catch (Exception e) {}}m_usedUsedConnection.clear();return count;}private static void clearClosedConnection() {long time = System.currentTimeMillis();// sometimes user change system time,just returnif (time < m_lastClearClosedConnection) {time = m_lastClearClosedConnection;return;}// no need check very oftenif (time - m_lastClearClosedConnection < CHECK_CLOSED_CONNECTION_TIME) {return;}m_lastClearClosedConnection = time;// begin checkIterator iterator = m_notUsedConnection.iterator();while (iterator.hasNext()) {ConnectionWrapper wrapper = (ConnectionWrapper) iterator.next();try {if (wrapper.connection.isClosed()) {iterator.remove();}} catch (Exception e) {iterator.remove();if (DEBUG) {System.out.println("connection is closed, this connection initial StackTrace");wrapper.debugInfo.printStackTrace();}}}// make connection pool size smaller if too bigint decrease = getDecreasingConnectionCount();if (m_notUsedConnection.size() < decrease) {return;}while (decrease-- > 0) {ConnectionWrapper wrapper = (ConnectionWrapper) m_notUsedConnection.removeFirst();try {wrapper.connection.close();} catch (Exception e) {}}}/*** get increasing connection count, not just add 1 connection* * @return count*/public static int getIncreasingConnectionCount() {int count = 1;int current = getConnectionCount();count = current / 4;if (count < 1) {count = 1;}return count;}/*** get decreasing connection count, not just remove 1 connection* * @return count*/public static int getDecreasingConnectionCount() {int count = 0;int current = getConnectionCount();if (current < 10) {return 0;}return current / 3;}public synchronized static void printDebugMsg() {printDebugMsg(System.out);}public synchronized static void printDebugMsg(PrintStream out) {if (DEBUG == false) {return;}StringBuffer msg = new StringBuffer();msg.append("debug message in " + ConnectionPool.class.getName());msg.append("\r\n");msg.append("total count is connection pool: " + getConnectionCount());msg.append("\r\n");msg.append("not used connection count: " + getNotUsedConnectionCount());msg.append("\r\n");msg.append("used connection, count: " + getUsedConnectionCount());out.println(msg);Iterator iterator = m_usedUsedConnection.iterator();while (iterator.hasNext()) {ConnectionWrapper wrapper = (ConnectionWrapper) iterator.next();wrapper.debugInfo.printStackTrace(out);}out.println();}public static synchronized int getNotUsedConnectionCount() {return m_notUsedConnection.size();}public static synchronized int getUsedConnectionCount() {return m_usedUsedConnection.size();}public static synchronized int getConnectionCount() {return m_notUsedConnection.size() + m_usedUsedConnection.size();}public static String getUrl() {return m_url;}public static void setUrl(String url) {if (url == null) {return;}m_url = url.trim();}public static String getUser() {return m_user;}public static void setUser(String user) {if (user == null) {return;}m_user = user.trim();}public static String getPassword() {return m_password;}public static void setPassword(String password) {if (password == null) {return;}m_password = password.trim();}}class ConnectionWrapper implements InvocationHandler {private final static String CLOSE_METHOD_NAME = "close";public Connection connection = null;private Connection m_originConnection = null;public long lastAccessTime = System.currentTimeMillis();Throwable debugInfo = new Throwable("Connection initial statement");ConnectionWrapper(Connection con) {this.connection = (Connection) Proxy.newProxyInstance(con.getClass().getClassLoader(),new Class[]{Connection.class}, this);m_originConnection = con;}void close() throws SQLException {m_originConnection.close();}public Object invoke(Object proxy, Method m, Object[] args)throws Throwable {Object obj = null;if (CLOSE_METHOD_NAME.equals(m.getName())) {ConnectionPool.pushConnectionBackToPool(this);} else {obj = m.invoke(m_originConnection, args);}lastAccessTime = System.currentTimeMillis();return obj;}}

四.完成效果

首先user表是空的,然后在首页注册用户,然后查看数据库信息已经注册成功,再进行登陆,登陆成功后跳转到个人中心页面,修改密码手机等信息,完成后再次查看数据库

五.完整源代码包含jar包地址:

https://download.csdn.net/download/wcc27857285/10778616

PS后续:

我看了下大家都想要源代码和jar包地址,按原先的下载地址需要16个csdn积分,其实一开始我是随便设置的16积分、

后来我想改成免费的,但是无奈CSDN一波骚操作,我一通操作,还是改不了,所以我特地把代码放在了云盘上,供大家免费下载

链接:https://pan.baidu.com/s/1ccxDBkS_UaGX6Kw6uyM55A 
提取码:p4ls

Java 实现用户注册登陆相关推荐

  1. Java开发一个登陆窗体,包括用户名,密码以及提交按钮和重置按钮,当用户输入amy,密码123456,弹出登陆成功提示对话框

    java开发用户登陆窗体 package javagame;/** 本次项目采用网格布局管理器实现 */import java.awt.Container; import java.awt.GridL ...

  2. java案例----用户注册--发送邮件并激活/发送邮件验证码

    java案例----用户注册-发送邮件并激活/发送邮件验证码 一.前期准备 1.准备两个邮箱账号(一个发邮件,一个收邮件) 1.1)登录需要发送邮件的QQ邮箱,找到设置项 1.2)然后在账户栏下,找到 ...

  3. java实现模拟登陆正方教务系统

    java实现模拟登陆学校教务管理系统 全部代码总览 此版本无注释,请赏脸移步本人GitHub:https://github.com/1243418950/Jwgl import java.io.Buf ...

  4. php mysql会员注册_PHP_php+mysql实现用户注册登陆的方法,本文实例讲述了php+mysql实现用 - phpStudy...

    php+mysql实现用户注册登陆的方法 本文实例讲述了php+mysql实现用户注册登陆的方法.分享给大家供大家参考.具体分析如下: 这是一款利用php与mysql数据库实现的用户注册与登录代码,功 ...

  5. [牛客网中级项目]第四章用户注册登陆管理

    目录 1. 预习 1.1 拦截器: 1.2 MD5加密算法: 2. 内容: 3. 注册: 3.1 注册要实现的功能: 3.2 代码实现: 3.2.1 建立LoginCotroller.class 3. ...

  6. Java 实现 QQ 登陆

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 1. 前言 个人网站最近增加了评论功能,为了方便用户不用注册就可以 ...

  7. java通过jdbc登陆系统_JDBC模拟登录

    一.需求 系统需求 在使用该系统之前,需要先使用已注册(假设已注册)的用户名和密码进行登录,系统验证登录信息准确后才能进入该系统使用其功能. 用户需求 用户在使用一个系统之前需要先进行用户验证,才能使 ...

  8. java 错误登陆次数_纯java代码实现登陆次数验证,登陆错误5次之后锁定30分钟

    本方法因为是根据思路纯手写,代码可以再简化,功能尝试没问题,最主要就是在登陆验证中的逻辑,checkLogin()方法是登录前的验证,而真正的登陆方式采用的是Shiro,若不是采用Shiro登陆,将该 ...

  9. java+selenium模拟登陆新浪微博demo

    java代码 import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.seleni ...

最新文章

  1. 使用Bioconda管理生信软件(以bwa为例)
  2. 网络营销外包——网络营销外包前关键词排名反超首页的原因在哪里
  3. UVA10305 Ordering Tasks
  4. Python爬虫基本框架
  5. 中原银行 Arthas 实践之路
  6. linux 基础学,linux基础学习【1】
  7. python高斯求和_二、算法分析
  8. 敏捷软件开发:原则、模式与实践——第12章 ISP:接口隔离原则
  9. discuz php源码,Discuz7 php源码,该如何解决
  10. linux下如何升级gcc和g++编译器
  11. FTP服务器软件 虚拟目录,FTP服务器软件 虚拟目录
  12. 语言表达的6c原则是指什么,2016年商务英语初级写作6C原则
  13. 闰年2月29天,我们都知道怎样判断,但知道为什么那样做吗?
  14. 阳春三月,激情飞扬,c/c++0313就业班开班啦!
  15. 文件传输工具FileZillaWinSCP
  16. centos执行yum命令报错,There are no enable repos
  17. 三、E906移植----FPGA生成可用的比特流并实现串口发送
  18. FastCGI 进程管理器(FPM)
  19. HTTP Server和Application Server
  20. AKAZE/KAZE局部特征

热门文章

  1. JAVA实现RC4加密
  2. 【调剂】北京信息科技大学2022年接收硕士研究生调剂公告
  3. Win32学习笔记(10)临界区
  4. 我的戴尔笔记本可以自动禁用触摸板
  5. 李群(Lie Group)
  6. JVM学习笔记(九)———Shenandoah垃圾收集器
  7. 臀大肌(02):站姿直腿上摆
  8. 老前辈分享:使用python-opencv读取视频,计算视频总帧数及FPS的实现
  9. LibLInear库中数据格式介绍
  10. SMT的基本知识简介