使用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、補充:下面是編碼結構示意圖:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM