使用servlet+jdbc+MD5实现用户加密登录
/**
* 分析流程:
* 1、前端页面提交登录请求
* 2、被web.xml拦截,进入到LoginServlet(有两种方式:方式一,在web.xml文件中配置servlet拦截器;方式二,不用在web.xml中配置,直接在类中通过 @WebServlet("/login")注解 //请求路径)
* 3、获取页面输入的用户名和密码
* 4、创建一个工具类,用于生成连接工厂
* 5、调用UserDao层,通过连接工厂连接数据库,根据名字查询用户
* 6、拼接sql语句,set参数,执行预编译,返回结果集
* 7、判断结果集是否存在,如果存在,就return数据
* 8、在LoginServlet中调用dao层后获取到数据,获取session对象,将获取到的数据存储到session对象中
* 9、资源跳转到页面
* 10、跳转到成功页面,显示数据
*/
代码示例:
1、前端页面提交登录请求
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>登录页面</title> </head> <body> <form action="login" method="post"> 用户名:<input name="username" type="text"><br> 密 码:<input name="password" type="password"><br> <button type="submit">登录</button> </form> </body> </html>
2、被web.xml拦截,进入到LoginServlet(有两种方式:方式一,在web.xml文件中配置servlet拦截器;方式二,不用在web.xml中配置,直接在类中通过 @WebServlet("/login")注解 //请求路径)
配置的web.xml文件如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>demo2</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>loginServlet</servlet-name> <servlet-class>org.fkjava.Servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>loginServlet</servlet-name> <url-pattern>/</url-pattern> //拦截所有的请求 </servlet-mapping> </web-app>
3、请求被拦截后跳转到LoginServlet类中,获取页面输入的用户名和密码,调用dao层获取数据,将获取到的数据保存到session对象中,然后重定向,将数据发到成功页面
package org.fkjava.Servlet; import java.io.IOException; 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 javax.servlet.http.HttpSession; import org.fkjava.bean.User; import org.fkjava.dao.UserDao; import org.fkjava.util.MD5; /** * Servlet implementation class LoginServlet */ @WebServlet("/login")//请求路径, 如果配置了@WebServlet注解就不配置web.xml,两者二选一 public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public LoginServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response) */ protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /**设置请求编码*/ request.setCharacterEncoding("UTF-8"); /**设置响应类型*/ response.setContentType("text/html"); /**设置响应编码*/ response.setCharacterEncoding("UTF-8");
//获取MD5加密对象 MD5 pwd = new MD5(); //获取输入的用户名和密码 String name = request.getParameter("username"); String pass = null; try { pass = pwd.getMD5(request.getParameter("password")); } catch (Exception e) { // TODO: handle exceptio e.printStackTrace(); } //初始化dao层 UserDao userDao = new UserDao(); /**调用dao层的获取用户的方法*/ try { String user = userDao.findUserByName(name,pass); System.out.println(user); //获取session,将获取到的数据保存到session中 HttpSession session = request.getSession(); session.setAttribute("user", user); //重定向,跳转到成功页面 response.sendRedirect("success.jsp"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
4、创建一个工具类,用于生成连接工厂,这里需要使用的数据库的驱动jar包mysql-connector-java-5.1.40.jar
package org.fkjava.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class ConnectionFactory { //准备参数 private static String url = "jdbc:mysql://127.0.0.1:3306/rqzc_db?useSSL=false"; private static String user = "root"; private static String password =""; //使用静态代码块加载驱动 static{ try { /**使用类名加载数据库驱动*/ Class.forName("com.mysql.jdbc.Driver"); } catch (Exception e) { e.printStackTrace(); /**创建运行时异常*/ throw new RuntimeException("数据库驱动加载异常!", e); } } /**提供公共、静态的连接数据库的方法*/ public static Connection getConnection() throws SQLException{ Connection conn = DriverManager.getConnection(url, user, password); return conn; } }
5、创建UserDao类,通过连接工厂获取连接,拼接sql语句,执行预编译(方式sql语句攻击,例如admin' or '1'='1会直接通过),设置参数,执行查询语句返回结果集
package org.fkjava.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import org.fkjava.jdbc.ConnectionFactory; public class UserDao { public String findUserByName(String name, String pass) throws Exception { /**获取连接,因为连接工厂设置的静态方法,可以指定使用类名调用方法*/ Connection conn = ConnectionFactory.getConnection(); /**拼接sql语句*/ String sql = "select * from r_employee where username= ? and password = ?"; /**预编译sql语句,这样是为了防止sql语句攻击*/ PreparedStatement statement = conn.prepareStatement(sql); /**set参数,1表示第一个参数,2表示第二个参数*/ statement.setString(1, name); statement.setString(2, pass); //执行sql语句,返回结果集 ResultSet rs = statement.executeQuery(); /**判断结果集是否有数据*/ if(rs.last()){ /**返回用户真实姓名*/ return rs.getString("realname"); }else{ return "查询失败!"; } } }
6、如果查询到数据,保存到session对象中,并重定向到成功页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>成功页面</title> </head> <body> ${sessionScope.user}:登录成功! </body> </html>
7、bean实体类
package org.fkjava.bean; public class User { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
8、补充:下面是编码结构示意图: