mysql-connector-java-5.1.6-bin.jar 放入 WEB-INF/lib
瀏覽器 → JSP 頁面 → JDBC → MySQL
頁面流轉:login.jsp → login_action.jsp → welcome.jsp
↳ register.jsp → register_action.jsp → login.jsp
↳ logout.jsp → login.jsp
<form action="login_action.jsp" method="post"> 用戶名: <input name="username"><br> 密碼: <input type="password" name="password"><br> <input type="submit" value="登錄"> | <a href="register.jsp">注冊</a> </form>
<%@ page import="java.sql.*" %>
<%
String u = request.getParameter("username");
String p = request.getParameter("password");
if (u==null || p==null) { response.sendRedirect("login.jsp"); return; }
Class.forName("com.mysql.jdbc.Driver");
Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/library_system","root","root");
Statement s = c.createStatement();
ResultSet rs = s.executeQuery("select * from userInfo where username='"+u+"' and password='"+p+"'");
if (rs.next()) {
session.setAttribute("username", u);
response.sendRedirect("welcome.jsp");
} else response.sendRedirect("login.jsp");
rs.close(); s.close(); c.close();
%>
歡迎你,<%= session.getAttribute("username") %>
<form action="logout.jsp" method="post"><input type="submit" value="退出"></form>
<% session.removeAttribute("username"); response.sendRedirect("login.jsp"); %>
注冊頁收集 username/password1/password2/email;處理頁校驗兩次密碼一致、用戶名唯一,通過則 INSERT 入庫並跳轉登錄頁。
CREATE TABLE userInfo (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) UNIQUE NOT NULL,
password VARCHAR(50) NOT NULL,
mail VARCHAR(100)
);
| 問題 | 風險 | 改進 |
|---|---|---|
| SQL 拼接 | SQL 注入 | PreparedStatement + 參數化 |
| 明文密碼 | 數據洩露 | BCrypt/SCrypt 加密存儲 |
| 連接未池化 | 性能差、洩露 | Druid/HikariCP 連接池 |
| 業務邏輯寫在 JSP | 難維護、難測試 | MVC 分層:Servlet/Service/DAO |
| 異常僅打印堆棧 | 用戶見紅字、無友好提示 | 統一異常處理、錯誤頁面 |
本例演示了最基礎的 JSP+JDBC 交互流程,適合初學者理解請求處理、會話管理、數據庫操作全鏈路。生產環境必須引入分層架構、連接池、參數化 SQL、密碼加密等安全與工程化措施。