Penapis JSP


Penapis dalam Servlets dan JSP ialah kelas Java, dan tujuan kewujudannya adalah seperti berikut:

  • Pemintasan apabila meminta akses kepada sumber back-end

  • Uruskan respons yang dikembalikan daripada pelayan kepada pelanggan

Terdapat beberapa jenis penapis yang biasa digunakan disenaraikan di bawah:

  • Penapis pengesahan

  • Penapis mampatan data

  • Penapis penyulitan

  • Cetuskan akses sumber Penapis untuk acara

  • Penapis penukaran imej

  • Penapis log masuk dan pengesahan

  • Penapis rantai Jenis MIME

  • Penapis token

  • Penapis XSL/T yang mengubah kandungan XML

Penapis akan dimasukkan ke dalam web .xml dan petakan servlet, nama fail JSP atau corak URL. Fail penerangan pengerahan web.xml boleh didapati dalam direktori <Tomcat-installation-directory>conf.

Apabila bekas JSP memulakan aplikasi web, ia akan mencipta tika setiap penapis ini mesti diisytiharkan dalam fail deskriptor penggunaan web.xml dan dilaksanakan mengikut susunan pengisytiharan.


Kaedah penapis servlet

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

< th>Kaedah &Penerangan
Nombor siri
1public void doFilter (ServletRequest, ServletResponse, FilterChain)
序号方法 &描述
1public void doFilter (ServletRequest, ServletResponse, FilterChain)


每当 request/response要通过过滤链时容器会调用这个方法,因为客户端请求链尾的资源
2public void init(FilterConfig filterConfig)


容器调用这个方法来表明一个过滤器被安置在服务中
3public void destroy()


容器调用这个方法来表明一个过滤器正在从服务中移除

<🎜>Bekas akan memanggil kaedah ini apabila permintaan/tindak balas melalui rantai penapis, kerana pelanggan meminta sumber pada penghujungnya daripada rantaian< /td>
2public void init(FilterConfig filterConfig)<🎜>
<🎜>The container memanggil kaedah ini Menunjukkan bahawa penapis diletakkan dalam perkhidmatan
3public void destroy()<🎜>
<🎜>Bekas memanggil kaedah ini untuk menunjukkan bahawa penapis sedang dialih keluar daripada perkhidmatan

Contoh penapis JSP

Contoh ini akan mencetak alamat IP serta tarikh dan masa setiap akses kepada fail JSP. Sudah tentu, ini hanyalah contoh mudah untuk memberi anda idea tentang penggunaan penapis mudah, tetapi anda boleh menggunakan konsep ini untuk membina program yang lebih kompleks sendiri.

//  引入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实例在服务器上被移除前调用。*/
   }
}

Kompilasikan fail LogFilter.java, dan kemudian letakkan fail kelas yang dihimpun dalam direktori <Tomcat installation>/webapps/ROOT/WEB-INF/classes.


Pemetaan penapis JSP dalam fail web.xml

Penapis ditakrifkan dan kemudian dipetakan ke URL atau nama fail JSP, sama seperti servlet ditakrifkan dan kemudian dipetakan. Dalam fail huraian penempatan web.xml, gunakan teg <penapis> untuk pemetaan penapis:

<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 akan digunakan pada semua servlet dan program JSP kerana kami menentukan " /*". Anda juga boleh menentukan laluan servlet atau JSP jika anda hanya mahu menggunakan penapis pada beberapa servlet atau program JSP.


Sekarang, akses halaman servlet atau JSP seperti biasa, dan anda akan mendapati bahawa rekod akses ini dijana dalam log pelayan. Anda juga boleh menggunakan logger Log4J untuk log ke fail lain.


Menggunakan berbilang penapis

Aplikasi web anda boleh mentakrifkan banyak penapis yang berbeza. Memandangkan anda mempunyai dua penapis yang ditakrifkan, AuthenFilter dan LogFilter, langkah lain adalah sama seperti sebelumnya, kecuali anda membuat pemetaan yang berbeza, seperti ini:

<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>

Pesanan Aplikasi Penapis

Susunan elemen <penapis> dipetakan dalam web.xml menentukan susunan bekas menggunakan penapis ini. Untuk membalikkan susunan aplikasi, anda hanya membalikkan susunan elemen <penapis>

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

<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>