Penapis tulisan Servlet


Penapis Servlet ialah kelas Java yang boleh digunakan dalam pengaturcaraan Servlet dengan tujuan berikut:

  • Memintas permintaan pelanggan sebelum mereka mengakses sumber bahagian belakang.

  • Kendalikan respons daripada pelayan sebelum dihantar semula kepada pelanggan.

Pelbagai jenis penapis disyorkan mengikut spesifikasi:

  • Penapis Pengesahan.

  • Penapis pemampatan data.

  • Penapis Penyulitan.

  • Cetus penapis acara akses sumber.

  • Penapis Penukaran Imej.

  • Penapis Log dan Pengauditan.

  • Penapis Rantai JENIS MIME.

  • Penapis Token.

  • Penapis XSL/T (Penapis XSL/T), tukar kandungan XML.

Penapis digunakan dalam fail deskriptor penempatan web.xml dan kemudian dipetakan kepada nama Servlet atau corak URL dalam deskriptor penggunaan aplikasi anda.

Apabila bekas web memulakan aplikasi web, ia mencipta tika untuk setiap penapis yang anda isytiharkan dalam deskriptor penggunaan. Penapis dilaksanakan mengikut susunan ia diisytiharkan dalam deskriptor penggunaan.

Kaedah penapis servlet

Penapis ialah kelas Java yang melaksanakan antara muka javax.servlet.Filter. Antara muka javax.servlet.Filter mentakrifkan tiga kaedah:

Nombor siriKaedah & Penerangan
1
序号方法 & 描述
1public void doFilter (ServletRequest, ServletResponse, FilterChain)
该方法在每次一个请求/响应对因客户端在链的末端请求资源而通过链传递时由容器调用。
2public void init(FilterConfig filterConfig)
该方法由 Web 容器调用,指示一个过滤器被放入服务。
3public void destroy()
该方法由 Web 容器调用,指示一个过滤器被取出服务。
public void doFilter (ServletRequest, ServletResponse, FilterChain)<🎜>
The Kaedah dipanggil oleh bekas setiap kali pasangan permintaan/tindak balas dilalui melalui rantai kerana pelanggan meminta sumber di penghujung rantai.
2<🎜>public void init(FilterConfig filterConfig)<🎜>
Kaedah ini dipanggil oleh bekas Web untuk menunjukkan penapis telah dimasukkan ke dalam perkhidmatan.
3<🎜>public void destroy()<🎜>
Kaedah ini dipanggil oleh bekas Web untuk menunjukkan bahawa penapis dibawa keluar Hidangkan.

Contoh penapis Servlet

Berikut ialah contoh penapis Servlet yang akan mengeluarkan alamat IP pelanggan serta tarikh dan masa semasa. Contoh ini memberi anda pemahaman asas tentang penapis Servlet dan anda boleh menggunakan konsep yang sama untuk menulis aplikasi penapis yang lebih kompleks:

// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

// 实现 Filter 类
public class LogFilter implements Filter  {
   public void  init(FilterConfig config) 
                         throws ServletException{
      // 获取初始化参数
      String testParam = config.getInitParameter("test-param"); 

      // 输出初始化参数
      System.out.println("Test Param: " + testParam); 
   }
   public void  doFilter(ServletRequest request, 
                 ServletResponse response,
                 FilterChain chain) 
                 throws java.io.IOException, ServletException {

      // 获取客户机的 IP 地址   
      String ipAddress = request.getRemoteAddr();

      // 记录 IP 地址和当前时间戳
      System.out.println("IP "+ ipAddress + ", Time "
                                       + new Date().toString());

      // 把请求传回过滤链
      chain.doFilter(request,response);
   }
   public void destroy( ){
      /* 在 Filter 实例被 Web 容器从服务移除之前调用 */
   }
}

Kompilkan LogFilter.java dengan cara biasa, Letakkan kelas anda fail dalam <Tomcat-installation-directory>/webapps/ROOT/WEB-INF/classes.

Pemetaan Penapis Servlet dalam Web.xml

Tentukan penapis dan kemudian petakannya ke URL atau Servlet, yang sama seperti mentakrifkan Servlet dan kemudian memetakannya ke corak URL yang sama. Cipta entri berikut untuk teg penapis dalam fail deskriptor penempatan web.xml:

<filter>
   <filter-name>LogFilter</filter-name>
   <filter-class>LogFilter</filter-class>
   <init-param>
	  <param-name>test-param</param-name>
	  <param-value>Initialization Paramter</param-value>
   </init-param>
</filter>
<filter-mapping>
   <filter-name>LogFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

Penapis di atas digunakan untuk semua Servlet kerana kami menentukan /* dalam konfigurasi . Jika anda hanya mahu menggunakan penapis pada beberapa servlet, anda boleh menentukan laluan servlet tertentu.

Sekarang cuba panggil mana-mana Servlet dengan cara biasa dan anda akan melihat log yang dijana dalam pelayan web. Anda juga boleh menggunakan logger Log4J untuk log di atas ke fail berasingan.

Menggunakan Berbilang Penapis

Aplikasi web boleh mentakrifkan beberapa penapis berbeza berdasarkan tujuan tertentu. Katakan anda mentakrifkan dua penapis AuthenFilter dan LogFilter. Anda perlu membuat pemetaan berbeza seperti yang diterangkan di bawah, dan pemprosesan selebihnya adalah lebih kurang sama seperti yang dijelaskan di atas:

<filter>
   <filter-name>LogFilter</filter-name>
   <filter-class>LogFilter</filter-class>
   <init-param>
	  <param-name>test-param</param-name>
	  <param-value>Initialization Paramter</param-value>
   </init-param>
</filter>

<filter>
   <filter-name>AuthenFilter</filter-name>
   <filter-class>AuthenFilter</filter-class>
   <init-param>
	  <param-name>test-param</param-name>
	  <param-value>Initialization Paramter</param-value>
   </init-param>
</filter>

<filter-mapping>
   <filter-name>LogFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

<filter-mapping>
   <filter-name>AuthenFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

Susunan penggunaan penapis

elemen pemetaan penapis dalam web. xml Pesanan menentukan susunan bekas Web menggunakan penapis pada Servlet. Untuk membalikkan susunan penapis, anda hanya perlu membalikkan elemen pemetaan penapis dalam fail web.xml anda.

Sebagai contoh, contoh di atas akan menggunakan LogFilter dahulu dan kemudian AuthenFilter, tetapi contoh berikut akan membalikkan susunan ini:

<filter-mapping>
   <filter-name>AuthenFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

<filter-mapping>
   <filter-name>LogFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>