Servlet 是 Java Web 開發的基石,掌握其請求處理、響應生成、會話管理等核心機制至關重要。本文通過一個完整的用戶登錄驗證案例,展示 Servlet 開發的標準流程:登錄頁面展示、表單提交處理、驗證邏輯、重定向跳轉及 web.xml 配置。
src/
└── com.ncu/
├── login.java // 登錄頁面 Servlet(GET)
├── LoginPro.java // 登錄處理 Servlet(POST)
└── Welcome.java // 歡迎頁 Servlet(GET)
WebContent/
└── WEB-INF/
└── web.xml // Servlet 映射配置
響應 GET 請求,動態生成 HTML 登錄表單:
package com.ncu;
import java.io.PrintWriter;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class login extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res) {
try {
// 設置響應編碼與內容類型
res.setContentType("text/html;charset=gbk");
PrintWriter pw = res.getWriter();
// 輸出完整 HTML 頁面
pw.print("<html><head><title>登錄界面</title></head><body>");
pw.print("<h1>用戶登錄界面</h1>");
pw.print("<form action='loginpro' method='post'>");
pw.print("用戶名:<input type='text' name='userName'><br>");
pw.print("密碼:<input type='password' name='Pwd'><br>");
pw.print("<input type='submit' value='提交'>");
pw.print("</form></body></html>");
} catch (Exception e) {
e.printStackTrace();
}
}
}
關鍵點:
PrintWriter 直接輸出 HTML,適合簡單頁面;複雜頁面建議使用 JSPaction='loginpro' 對應處理 Servlet 的 URL 映射method='post' 提交敏感數據(密碼),避免 URL 暴露處理 POST 請求,驗證用戶憑證並重定向:
package com.ncu;
import java.io.PrintWriter;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginPro extends HttpServlet {
public void doPost(HttpServletRequest req, HttpServletResponse res) {
try {
// 1. 獲取請求參數
String user = req.getParameter("userName");
String pwd = req.getParameter("Pwd");
// 2. 空值防護
if (user == null) user = "";
if (pwd == null) pwd = "";
// 3. 業務驗證邏輯(示例:硬編碼用戶名密碼均為 nicolas)
if ("nicolas".equals(user) && "nicolas".equals(pwd)) {
// 驗證成功:重定向到歡迎頁
res.sendRedirect("welcome");
} else {
// 驗證失敗:重定向回登錄頁
res.sendRedirect("login");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
關鍵點:
req.getParameter() 獲取表單數據,需做 null 防護res.sendRedirect() 進行客戶端重定向,瀏覽器地址欄會變化package com.ncu;
import java.io.PrintWriter;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Welcome extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res) {
try {
res.setCharacterEncoding("gbk");
PrintWriter pw = res.getWriter();
pw.print("welcome,您好");
} catch (Exception e) {
e.printStackTrace();
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="https://java.sun.com/xml/ns/javaee"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://java.sun.com/xml/ns/javaee
https://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 登錄頁面 Servlet -->
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.ncu.login</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<!-- 登錄處理 Servlet -->
<servlet>
<servlet-name>loginpro</servlet-name>
<servlet-class>com.ncu.LoginPro</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>loginpro</servlet-name>
<url-pattern>/loginpro</url-pattern>
</servlet-mapping>
<!-- 歡迎頁 Servlet -->
<servlet>
<servlet-name>welcome</servlet-name>
<servlet-class>com.ncu.Welcome</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>welcome</servlet-name>
<url-pattern>/welcome</url-pattern>
</servlet-mapping>
</web-app>
配置說明:
<servlet-name>:邏輯名稱,映射中引用<servlet-class>:全限定類名<url-pattern>:瀏覽器訪問路徑,/login 對應 https://host:port/context/login@WebServlet),可替代 web.xml用戶訪問 /login
↓
login.doGet() 生成登錄頁 HTML
↓
用戶填寫表單點擊提交 → POST /loginpro
↓
LoginPro.doPost() 獲取參數驗證
↓
驗證成功 → sendRedirect("/welcome") → Welcome.doGet() 顯示歡迎信息
驗證失敗 → sendRedirect("/login") → 回到登錄頁
| 現狀 | 問題 | 改進方案 |
|---|---|---|
| 硬編碼用戶名密碼 | 無法擴展、不安全 | 連接數據庫查詢、密碼加密存儲 (BCrypt/SCrypt) |
| 無會話管理 | 無法識別登錄狀態 | 驗證成功後 req.getSession().setAttribute("user", user) |
| 直接輸出 HTML | 維護困難、前後端耦合 | 使用 JSP/Thymeleaf 模板引擎、前後端分離 |
| 明文傳輸密碼 | 網絡抓包洩露 | 全站 HTTPS、前端加密傳輸 |
| 無防暴力破解 | 安全風險 | 驗證碼、登錄失敗鎖定、IP 限流 |