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

JBuilder 2005 Servlet 過濾器實戰:統一登入驗證、編碼轉換、頁首尾注入

     編輯:Java 相關知識

Filter 可在請求到達 Servlet/JSP 前、響應返回瀏覽器前攔截處理。本文示範建立 LoginCheckFilter 實現全站登入驗證,並列舉編碼轉換、統一頁首尾等典型應用場景。

建立 Filter 步驟

  1. File → New → Web → Filter Servlet
  2. Class: LoginCheckFilter,Package: bookstore.servlet
  3. URL pattern: /*(攔截所有請求)
  4. Finish

核心程式碼:LoginCheckFilter.java

public class LoginCheckFilter extends HttpServlet implements Filter {
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) {
        try {
            HttpServletRequest request = (HttpServletRequest) req;
            HttpServletResponse response = (HttpServletResponse) resp;
            
            String uri = request.getRequestURI().toUpperCase();
            boolean isLoginPage = uri.indexOf("LOGIN.JSP") != -1;
            boolean isSwitchPage = uri.indexOf("SWITCH.JSP") != -1;
            boolean hasUser = request.getSession().getAttribute("ses_userBean") != null;
            
            if (!isLoginPage && !isSwitchPage && !hasUser) {
                response.sendRedirect("/webModule/login.jsp");  // 未登入 → 導向登入頁
            } else {
                chain.doFilter(request, response);  // 放行
            }
        } catch (ServletException | IOException e) {
            filterConfig.getServletContext().log(e.getMessage());
        }
    }
}

web.xml 部署描述

<filter>
  <filter-name>logincheckfilter</filter-name>
  <filter-class>bookstore.servlet.LoginCheckFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>logincheckfilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

三大典型應用場景

1. 編碼轉換(解決亂碼)

不同伺服器/OS/資料庫預設編碼不同,Filter 統一在請求進入前設定:

request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");

2. 統一頁首尾/版權資訊

響應返回前注入共用 HTML 片段,避免每頁重複。

3. 安全控制(本文範例)

Session 檢查 ses_userBean,未登入強制導向 login.jsp。排除登入頁與處理頁避免無限迴圈。

Filter 設計原則

  • 單一職責:一個 Filter 做一件事,多重 Filter 串聯(chain.doFilter())。
  • 輕量化:邏輯簡潔,避免複雜運算拖慢請求。
  • 順序敏感:web.xml 宣告順序決定執行順序。
  • 排除靜態資源:url-pattern 避開 *.css/*.js/*.jpg,或用 DispatcherType 限制。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved