📜  Java Servlet 过滤器

📅  最后修改于: 2022-05-13 01:55:10.308000             🧑  作者: Mango

Java Servlet 过滤器

自 2.3 以来,过滤器是 Servlet API 的一部分。与 Servlet 一样,过滤器对象由 Container 实例化和管理,并遵循类似于 Servlet 的生命周期。一个 Servlet 有 4 个阶段,如下图所示

  1. 实例化。
  2. 初始化。
  3. 筛选。
  4. 破坏。

Java Servlet 过滤器

这些阶段类似于 servlet 的 Instantiate、Initialize、Filter、destroy。过滤器用于预处理请求和后处理响应。过滤器是一个Java对象,它在对资源的请求或来自资源的响应或两者上执行过滤任务。

一些使用过滤器的应用程序

  1. 验证。
  2. 日志记录和审计过滤器
  3. 图像转换过滤器。
  4. 数据压缩过滤器。
  5. 加密和解密过滤器。

接口属于过滤器。

  • 筛选。
  • 过滤器配置。
  • 过滤链。

所有这些接口都在javax.Servlet包中可用

筛选

  • 过滤器是一个接口。
  • 每个过滤器都必须继承自该接口。
  • 它提供了生命周期方法

方法

MethodAction performed
init(FilterConfig filterconfig)Called by the web container to indicate to a filter that it is being placed into service
doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)It is called by the container each time a request/response pair is passed through the chain due to a client request for a resource at the end of the chain.
destroy()to indicate to a filter that is being out of service. 

文件:web.xml

XML

 
   name
   Servlet class name
 
 
name
Filter class name

 
 name
 /name
 

   name
   /url
 


HTML

   
       TODO supply a title
       
       
   
   
     click here  
       
        


Java
// Java Program to Illustrate MyBlockFilter
  
// Importing required classes
import java.io.IOException;
import java.io.PrintWriter;
// Importing all servlet classes
import javax.servlet.*;
  
// Class
// Implementing Filter class
public class MyBlockFilter implements Filter {
  
    // Method
    public void init(FilterConfig config)
        throws ServletException
    {
    }
  
    // Method
    public void doFilter(ServletRequest req,
                         ServletResponse resp,
  
                         FilterChain fc)
        throws IOException, ServletException
    {
  
        String ip = req.getRemoteAddr();
  
        PrintWriter out = resp.getWriter();
  
        if (ip.equals("127.0.0.1")) {
            out.print(
                ",

Your ip address is blocked ny this websites

");         }            else {             fc.doFilter(req, resp);         }     }        // Method     public void destroy() {} }


Java
import java.io.IOException;
  
import java.io.PrintWriter;
  
import javax.servlet.ServletException;
  
import javax.servlet.http.HttpServlet;
  
import javax.servlet.http.HttpServletRequest;
  
import javax.servlet.http.HttpServletResponse;
  
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("

Hello Client welcome to my Website...

");    }    }


XML

    
 
   HelloServlet
   HelloServlet
 
    
 
   HelloServlet
   /servlet1
 
    
 
 f1
 MyBlockFilter
 
    
 
 f1
 /servlet1
 
    


过滤链

FilterChain 是一个接口,由 servlet 容器实现。过滤器使用 FilterChain 调用链中的下一个过滤器,或者如果调用过滤器是链中的最后一个过滤器,则调用链末端的资源。

方法: doFilter()

导致调用链中的下一个过滤器,或者如果调用过滤器是链中的最后一个过滤器,则导致调用链末尾的资源。

返回类型:无效

参数:

  • HttpServletRequest 请求
  • HttpServletResponse 响应

句法:

void doFilter(HttpServletRequest request, HttpServletResponse response)

我们可以开发三种类型的过滤器,如下所示:

(1) 请求过滤器:仅包含请求前处理逻辑。

示例:请求计数过滤器、身份验证过滤器、授权过滤器、验证过滤器等。

(2) 响应过滤器:仅包含响应后生成逻辑。

示例:转换过滤器、压缩过滤器等。

(3) 请求-响应过滤器:包含请求前和响应后生成逻辑。

示例:性能测试过滤器。

实现:过滤器示例

A.文件: 索引.html

HTML


   
       TODO supply a title
       
       
   
   
     click here  
           
   

B.文件:MyBlockFilter。Java

Java

// Java Program to Illustrate MyBlockFilter
  
// Importing required classes
import java.io.IOException;
import java.io.PrintWriter;
// Importing all servlet classes
import javax.servlet.*;
  
// Class
// Implementing Filter class
public class MyBlockFilter implements Filter {
  
    // Method
    public void init(FilterConfig config)
        throws ServletException
    {
    }
  
    // Method
    public void doFilter(ServletRequest req,
                         ServletResponse resp,
  
                         FilterChain fc)
        throws IOException, ServletException
    {
  
        String ip = req.getRemoteAddr();
  
        PrintWriter out = resp.getWriter();
  
        if (ip.equals("127.0.0.1")) {
            out.print(
                ",

Your ip address is blocked ny this websites

");         }            else {             fc.doFilter(req, resp);         }     }        // Method     public void destroy() {} }

C.文件:HelloServlet

Java

import java.io.IOException;
  
import java.io.PrintWriter;
  
import javax.servlet.ServletException;
  
import javax.servlet.http.HttpServlet;
  
import javax.servlet.http.HttpServletRequest;
  
import javax.servlet.http.HttpServletResponse;
  
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("

Hello Client welcome to my Website...

");    }    }

D.文件:web.xml

XML


    
 
   HelloServlet
   HelloServlet
 
    
 
   HelloServlet
   /servlet1
 
    
 
 f1
 MyBlockFilter
 
    
 
 f1
 /servlet1
 
    

输出:如果我们的PC IP地址是“ 127.0.0.1” ,我们就不能访问这个网站