首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java Servlet 實現用戶登錄驗證完整示例:從頁面到業務邏輯

     編輯:Java 相關知識

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 映射配置

核心代碼實現

1. 登錄頁面 Servlet (login.java)

響應 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,適合簡單頁面;複雜頁面建議使用 JSP
  • 表單 action='loginpro' 對應處理 Servlet 的 URL 映射
  • method='post' 提交敏感數據(密碼),避免 URL 暴露

2. 登錄驗證處理 Servlet (LoginPro.java)

處理 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() 進行客戶端重定向,瀏覽器地址欄會變化
  • 實際項目中應查詢數據庫、使用加密密碼比對、建立 Session 會話

3. 歡迎頁 Servlet (Welcome.java)

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();
        }
    }
}

4. web.xml 完整配置

<?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
  • Servlet 3.0+ 支持註解配置 (@WebServlet),可替代 web.xml

運行流程圖解

用戶訪問 /login
    ↓
login.doGet() 生成登錄頁 HTML
    ↓
用戶填寫表單點擊提交 → POST /loginpro
    ↓
LoginPro.doPost() 獲取參數驗證
    ↓
驗證成功 → sendRedirect("/welcome") → Welcome.doGet() 顯示歡迎信息
驗證失敗 → sendRedirect("/login") → 回到登錄頁

進階改進方向

Servlet 3.0+ 註解配置示例(可替代 web.xml)

@WebServlet(urlPatterns = "/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
        // ...
    }
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
        // ...
    }
}

本示例展示了 Servlet 處理 HTTP 請求的完整生命周期,是理解 Java Web 開發基礎的絕佳切入點。實際項目中建議採用成熟框架(Spring MVC、Spring Boot)提升開發效率與代碼質量。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
現狀問題改進方案
硬編碼用戶名密碼無法擴展、不安全連接數據庫查詢、密碼加密存儲 (BCrypt/SCrypt)
無會話管理無法識別登錄狀態驗證成功後 req.getSession().setAttribute("user", user)
直接輸出 HTML維護困難、前後端耦合使用 JSP/Thymeleaf 模板引擎、前後端分離
明文傳輸密碼網絡抓包洩露全站 HTTPS、前端加密傳輸
無防暴力破解安全風險驗證碼、登錄失敗鎖定、IP 限流