Java Servlet 中過濾器 的必要性


為了確保請求得到正確處理,開發人員通常使用過濾器來準備和後處理請求。這些物件可以執行各種有用的操作,例如輸入驗證、轉換、日誌記錄、壓縮、加密和解密。

Servlet 過濾器的特別之處在於其易於操作性:作為 web.xml 檔案中定義的可插拔實體,刪除或調整過濾器就像從程式碼庫中刪除一個條目一樣簡單。這個簡化的流程意味著更低的維護成本。

過濾器的使用

當資料在業務運營中具有內在重要性時,資料的驗證就變得至關重要。透過伺服器將來自客戶端的資訊儲存到資料庫中,驗證資訊的有效性非常重要,因為無效資料會對系統的功能產生災難性的影響。儘管可以在客戶端新增過濾器,但在客戶端停用 JavaScript 的情況下,不會檢查請求或資料,這使得伺服器端過濾器成為必需。

以下是 Java Servlet 中過濾器的一些主要用途:

  • 記錄所有傳入請求

  • 轉換

  • 資料壓縮

  • 輸入驗證

  • 加密和解密

Java Servlet 中過濾器的優勢

  • 對資源請求進行身份驗證和授權。在轉發使用者的請求之前確認使用者的真實性。

  • 為了將其傳遞給 servlet,格式化請求體或標頭。原始資料需要準備。

  • 客戶端傳送的響應資料將被壓縮。(例如:加密)

  • 包含標頭資訊、cookie 等以修改響應。

  • 輸入檢查。(非常重要)

如何實現一個過濾器?

如果要有效地實現 Filter API(或介面),請確保記住三個關鍵方法——init()、doFilter() 和 destroy()。覆蓋這些方法對於過濾器的正確生命週期管理是必要的。另請注意,在使用 ServletRequest 和 ServletResponse 透過 doFilter() 方法執行 FilterChain 時。

過濾器示例

在此示例中,我們僅提供有關在請求後處理後自動呼叫的過濾器的資訊。

Index.html

示例

<a href="servlet1">click here </a>

Myfilter.java

示例

import java.io.IOException;  
import java.io.PrintWriter;  
  
import javax.servlet.*;  
  
public class MyFilter implements Filter{  
  
   public void init(FilterConfig arg0) throws ServletException {}  
      
   public void doFilter(ServletRequest req, ServletResponse resp,  
   FilterChain chain) throws IOException, ServletException {  
          
      PrintWriter out=resp.getWriter();  
      out.print("filter is invoked before");  
          
      chain.doFilter(req, resp);//sends request to next resource  
          
      out.print("filter is invoked after");  
   }  
   public void destroy() {}  
}

HelloServlet.java

示例

import java.io.IOException;  
import java.io.PrintWriter;  
  
import javax.servlet.ServletException;  
import javax.servlet.http.*;  
  
public class HelloServlet extends HttpServlet {  
   public void doGet(HttpServletRequest request, HttpServletResponse response)  
   throws ServletException, IOException {    
      response.setContentType("text/html");  
      PrintWriter out = response.getWriter();        
      out.print("<br>welcome to servlet<br>");             
   }   
}

Web.xml

示例

<web-app>   
   <servlet>  
      <servlet-name>s1</servlet-name>  
      <servlet-class>HelloServlet</servlet-class>  
   </servlet>  
  
   <servlet-mapping>  
      <servlet-name>s1</servlet-name>  
      <url-pattern>/servlet1</url-pattern>  
   </servlet-mapping>  
  
   <filter>  
      <filter-name>f1</filter-name>  
      <filter-class>MyFilter</filter-class>  
   </filter>  
   
   <filter-mapping>  
      <filter-name>f1</filter-name>  
      <url-pattern>/servlet1</url-pattern>  
   </filter-mapping>    
</web-app>

結論

在 Java Servlet 開發過程中使用過濾器,可以採取措施來保護 Web 應用程式的功能並增強其競爭優勢。這些強大的工具為開發人員提供了許多優勢,例如針對日誌記錄或效能監控等橫切關注點的自定義實現,同時提高可靠性和效率。但是,值得注意的是,應考慮最佳化,以免因過高的開銷而抵消這些好處。

更新於:2023年8月1日

瀏覽量 150

開啟您的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.