MD5加密是一种常见的加密方式,我们经常用在保存用户密码和关键信息上。
MD5加密特点:
封装执行加密的工具类(MD5Util.java)可以直接在addUSer()方法运行前进行加密
public class MD5Util {/*** 针对明文字符串执行MD5加密* @param source* @return*/public static String encode(String source) {// 1.判断明文字符串是否有效if (source == null || "".equals(source)) {throw new RuntimeException("用于加密的明文不可为空");}// 2.声明算法名称String algorithm = "md5";// 3.获取MessageDigest对象MessageDigest messageDigest = null;try {messageDigest = MessageDigest.getInstance(algorithm);} catch (NoSuchAlgorithmException e) {e.printStackTrace();}// 4.获取明文字符串对应的字节数组byte[] input = source.getBytes();// 5.执行加密byte[] output = messageDigest.digest(input);// 6.创建BigInteger对象int signum = 1;BigInteger bigInteger = new BigInteger(signum, output);// 7.按照16进制将bigInteger的值转换为字符串int radix = 16;String encoded = bigInteger.toString(radix).toUpperCase();return encoded;}
}
测试代码如下:
void testMD5() {String pwd = "123456";// 基于spring框架中的DigestUtils工具类进行密码加密String hashedPwd1 = DigestUtils.md5DigestAsHex((pwd).getBytes());System.out.println(hashedPwd1);
}
怕不够安全可以进行“加盐”处理:
void testMD5() {String pwd = "123456";String salt = UUID.randomUUID().toString();// 基于spring框架中的DigestUtils工具类进行密码加密String hashedPwd1 = DigestUtils.md5DigestAsHex((pwd + salt).getBytes());System.out.println(hashedPwd1);
}
也可以进行多次加盐
void testMD5() {String pwd = "123456";String salt = UUID.randomUUID().toString();// 基于spring框架中的DigestUtils工具类进行密码加密String hashedPwd1 = DigestUtils.md5DigestAsHex((pwd + salt).getBytes());hashedPwd1 = DigestUtils.md5DigestAsHex((hashedPwd1 + salt).getBytes()); hashedPwd1 = DigestUtils.md5DigestAsHex((hashedPwd1 + salt).getBytes()); // ... 可使用循环加盐System.out.println(hashedPwd1);
}
package com.example.util;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;public class JDBCUtils {private static DataSource dataSource =null;private static ThreadLocal threadLocal = new ThreadLocal<>();//创建连接池static{//读取属性文件Properties prop = new Properties();//System.out.println("prop1:"+prop);InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("db.properties");try {prop.load(is);//System.out.println("prop2:"+prop);//根据属性文件创建连接池dataSource = DruidDataSourceFactory.createDataSource(prop);} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}//获取数据库连接public static Connection getConnection(){//先从ThreadLocal中获取Connection conn = threadLocal.get();//如果没有连接,说明是该线程中第一次访问,if(conn ==null ){try {//从连接池中获取一个连接conn = dataSource.getConnection();//放入到threadLocal中threadLocal.set(conn);} catch (Exception e) {e.printStackTrace();}}//返回连接return conn;}//关闭数据库连接(如果采用了连接池,就是归还连接)public static void releaseConnection(){//从threadLocal中获取Connection conn = threadLocal.get();try {if(conn !=null){conn.close(); //不是物理关闭,而是放入到连接池中,置为空闲状态}} catch (Exception e) {e.printStackTrace();}finally {//这个语句不要少//threadLocal.set(null);//连接已经放回连接池,不使用了。ThreadLocal也不需要再保存了threadLocal.remove();}}
}
package com.example.dao;import com.example.util.JDBCUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;/*** 功能:对数据库的任意表格进行增删改查* ① 增删改* ② 三个查询*/
public class BaseDao {//2. 创建QueryRunner对象private QueryRunner runner=new QueryRunner();/*** 功能:对数据库进行增删改的操作* @param sql* @param params* @return*/public boolean update(String sql,Object...params){//1. 获得数据库连接Connection connection = JDBCUtils.getConnection();//3. 执行try {int update = runner.update(connection, sql, params);if(update>0)return true;} catch (SQLException e) {e.printStackTrace();}finally {//4. 释放资源JDBCUtils.releaseConnection();}return false;}/*** 功能:查询多条数据* @param type* @param sql* @param params* @return*/public List getBeanList(Class type,String sql,Object...params){//1. 获得数据库连接Connection connection = JDBCUtils.getConnection();//3. 执行try {return runner.query(connection, sql, new BeanListHandler(type), params);} catch (SQLException e) {e.printStackTrace();}finally{//4. 释放资源JDBCUtils.releaseConnection();}return null;}/*** 功能:查询一条结果* @param type* @param sql* @param params* @return*/public T getBean(Class type,String sql,Object...params){//1. 获得数据库连接Connection connection = JDBCUtils.getConnection();//3. 执行try {return runner.query(connection,sql,new BeanHandler(type),params);} catch (SQLException e) {e.printStackTrace();}finally{//4. 释放资源JDBCUtils.releaseConnection();}return null;}/*** 功能:查询一个结果* @param sql* @param params* @return*/public Object getObject(String sql,Object...params){//1. 获得数据库连接Connection connection = JDBCUtils.getConnection();//3. 执行try {return runner.query(connection,sql,new ScalarHandler(),params);} catch (SQLException e) {e.printStackTrace();}finally{//4. 释放资源JDBCUtils.releaseConnection();}return null;}
}
package com.example.servlet;import com.example.bean.User;
import com.example.dao.UserDao;
import com.example.dao.impl.UserDaoImpl;
import com.example.util.MD5Util;
import org.apache.commons.beanutils.BeanUtils;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;@WebServlet(name = "RegistServlet", value = "/RegistServlet")
public class RegistServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request,response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1获得请求参数Map parameterMap = request.getParameterMap();User user=new User();try {BeanUtils.populate(user,parameterMap);} catch (IllegalAccessException e) {throw new RuntimeException(e);} catch (InvocationTargetException e) {throw new RuntimeException(e);}//2 处理注册业务//将信息添加到数据库,需要考虑密码加密问题。UserDao userDao=new UserDaoImpl();System.out.println("密码设置为="+user.getPassword());String encode=MD5Util.encode(user.getPassword());//encode是加密后的密码user.setPassword(encode);System.out.println("加密成功="+encode);boolean b=userDao.addUser(user);System.out.println("添加成功");//3 响应(页面跳转)if (b){request.getRequestDispatcher("/pages/user/regist_success.html").forward(request,response);}else {request.getRequestDispatcher("/pages/user/regist_error.html").forward(request,response);}}
}

数据库表:
