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

實用 Servlet Filter 三例:防快取、登入檢查、編碼設定

     編輯:Java 相關知識

1. ForceNoCacheFilter — 強制瀏覽器不快取

public class ForceNoCacheFilter implements Filter {
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        HttpServletResponse resp = (HttpServletResponse) res;
        resp.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
        resp.setHeader("Pragma", "no-cache");
        resp.setDateHeader("Expires", -1);
        chain.doFilter(req, res);
    }
    @Override public void init(FilterConfig cfg) {}
    @Override public void destroy() {}
}

web.xml:

<filter>
  <filter-name>noCache</filter-name>
  <filter-class>com.yourpkg.ForceNoCacheFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>noCache</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

2. CheckLoginFilter — 統一登入攔截

public class CheckLoginFilter implements Filter {
    private String redirectURL;           // 登入頁 (不含 contextPath)
    private String sessionKey;            // Session 屬性名
    private Set<String> excludeUrls = new HashSet<>(); // 不攔截路徑

    @Override
    public void init(FilterConfig cfg) {
        redirectURL = cfg.getInitParameter("redirectURL");
        sessionKey = cfg.getInitParameter("checkSessionKey");
        String list = cfg.getInitParameter("notCheckURLList");
        if (list != null) {
            for (String s : list.split(";")) excludeUrls.add(s.trim());
        }
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        String uri = request.getServletPath() + 
                     (request.getPathInfo() == null ? "" : request.getPathInfo());

        if (excludeUrls.contains(uri)) {
            chain.doFilter(req, res);
            return;
        }

        HttpSession session = request.getSession(false);
        if (session == null || session.getAttribute(sessionKey) == null) {
            response.sendRedirect(request.getContextPath() + redirectURL);
            return;
        }
        chain.doFilter(req, res);
    }

    @Override public void destroy() { excludeUrls.clear(); }
}

web.xml 配置範例:

<filter>
  <filter-name>loginCheck</filter-name>
  <filter-class>com.yourpkg.CheckLoginFilter</filter-class>
  <init-param><param-name>redirectURL</param-name><param-value>/login.jsp</param-value></init-param>
  <init-param><param-name>checkSessionKey</param-name><param-value>USER_INFO</param-value></init-param>
  <init-param><param-name>notCheckURLList</param-name><param-value>/login.jsp;/static/;/error.jsp</param-value></init-param>
</filter>
<filter-mapping>
  <filter-name>loginCheck</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

3. CharacterEncodingFilter — 統一請求編碼 (解決中文亂碼)

public class CharacterEncodingFilter implements Filter {
    private String encoding;

    @Override
    public void init(FilterConfig cfg) {
        encoding = cfg.getInitParameter("encoding");
        if (encoding == null) encoding = "UTF-8";
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        if (encoding != null) {
            req.setCharacterEncoding(encoding); // 必須在讀取參數前呼叫
        }
        chain.doFilter(req, res);
    }

    @Override public void destroy() {}
}

web.xml:

<filter>
  <filter-name>encodingFilter</filter-name>
  <filter-class>com.yourpkg.CharacterEncodingFilter</filter-class>
  <init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param>
</filter>
<filter-mapping>
  <filter-name>encodingFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

Filter 排序原則

web.xml 中 <filter-mapping> 宣告順序決定執行鏈順序。建議順序:

  1. CharacterEncodingFilter (最早設定編碼)
  2. ForceNoCacheFilter
  3. CheckLoginFilter (需讀取 Session)
  4. 業務 Filter...

Spring Boot 整合方式

@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean<CharacterEncodingFilter> encodingFilter() {
        FilterRegistrationBean<CharacterEncodingFilter> bean = new FilterRegistrationBean<>();
        bean.setFilter(new CharacterEncodingFilter());
        bean.addUrlPatterns("/*");
        bean.setOrder(1);
        return bean;
    }
    // 其他 Filter 同理...
}

結語

這三個 Filter 涵蓋 Web 應用最基礎的橫切關注:快取控制、安全攔截、字元編碼。掌握 Filter 鏈機制與初始化參數配置,即可快速建構可維護的攔截體系。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved