理解Servlet过滤器(javax.servlet.Filter)

理解Servlet过滤器(javax.servlet.Filter)

                 佟强  2009年12月14日

过滤器(Filter)的概念

  • 过滤器位于客户端和web应用程序之间,用于检查和修改两者之间流过的请求和响应。
  • 在请求到达Servlet/JSP之前,过滤器截获请求。
  • 在响应送给客户端之前,过滤器截获响应。
  • 多个过滤器形成一个过滤器链,过滤器链中不同过滤器的先后顺序由部署文件web.xml中过滤器映射<filter-mapping>的顺序决定。
  • 最先截获客户端请求的过滤器将最后截获Servlet/JSP的响应信息。

过滤器的链式结构

    可以为一个Web应用组件部署多个过滤器,这些过滤器组成一个过滤器链,每个过滤器只执行某个特定的操作或者检查。这样请求在到达被访问的目标之前,需要经过这个过滤器链。

过滤器链式结构

实现过滤器

在Web应用中使用过滤器需要实现javax.servlet.Filter接口,实现Filter接口中所定义的方法,并在web.xml中部署过滤器。

public class MyFilter implements Filter {

    public void init(FilterConfig fc) {
        //过滤器初始化代码
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
        //在这里可以对客户端请求进行检查
        //沿过滤器链将请求传递到下一个过滤器。
        chain.doFilter(request, response);
        //在这里可以对响应进行处理

    }

    public void destroy( ) {
        //过滤器被销毁时执行的代码
    }

}

 

Filter接口

public void init(FilterConfig config)

web容器调用本方法,说明过滤器正被加载到web容器中去。容器只有在实例化过滤器时才会调用该方法一次。容器为这个方法传递一个FilterConfig对象,其中包含与Filter相关的配置信息。

public void doFilter(ServletRequest request,
            ServletResponse response, FilterChain chain)

每当请求和响应经过过滤器链时,容器都要调用一次该方法。需要注意的是过滤器的一个实例可以同时服务于多个请求,特别需要注意线程同步问题,尽量不用或少用实例变量。 在过滤器的doFilter()方法实现中,任何出现在FilterChain的doFilter方法之前地方,request是可用的;在doFilter()方法之后response是可用的。

public void destroy()

容器调用destroy()方法指出将从服务中删除该过滤器。如果过滤器使用了其他资源,需要在这个方法中释放这些资源。

 

部署过滤器

在Web应用的WEB-INF目录下,找到web.xml文件,在其中添加如下代码来声明Filter。

<filter>
    <filter-name>MyFilter</filter-name>
    <filter-class>
        cn.edu.uibe.webdev.MyFilter
    </filter-class>
    <init-param>
        <param-name>developer</param-name>
        <param-value>TongQiang</param-value>
    </init-param>
</filter>

针对一个Servlet做过滤

<filter-mapping>
    <filter-name>MyFilter</filter-name>
    <servlet-name>MyServlet</servlet-name>
</filter-mapping>

针对URL Pattern做过滤

<filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>/book/*</url-pattern>
</filter-mapping>

<filter-mapping>标记是有先后顺序的,它的声明顺序说明容器是如何形成过滤器链的。过滤器应当设计为在部署时很容易配置的形式。通过认真计划和使用初始化参数,可以得到复用性很高的过滤器。 过滤器逻辑与Servlet逻辑不同,它不依赖于任何用户状态信息,因为一个过滤器实例可能同时处理多个完全不同的请求。

 

    OakCMS内容管理系统 http://www.oakcms.cn

 

### 配置 `javax.servlet.Filter` 的方法 在 Eclipse 中创建 Servlet 过滤器时遇到缺少 `javax.servlet.Filter` 接口的问题,通常是因为项目未正确引入所需的库或依赖项。以下是解决此问题的具体方式: #### 1. 添加必要的 JAR 文件 确保项目的构建路径中包含了 Java EE 或 Jakarta EE 提供的标准 API 库。可以通过以下步骤完成: - 右键点击项目 -> **Build Path** -> **Configure Build Path...** - 转到 **Libraries** 标签页。 - 如果尚未添加,则单击 **Add Library...**, 然后选择 **Server Runtime** 并继续下一步操作[^3]。 对于大多数情况下,默认服务器运行环境(如 Apache Tomcat)已经提供了 `servlet-api.jar`, 它实现了 `javax.servlet.Filter` 接口的功能。 如果使用 Maven 构建工具管理项目, 则需确认 pom.xml 是否包含如下依赖声明: ```xml <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>5.0.0</version> <scope>provided</scope> </dependency> ``` 上述 XML 片段定义了一个范围为 provided 的依赖关系,意味着编译阶段会加载该 jar 包,但在实际部署至容器(比如Tomcat)时不重复打包进去[^2]. #### 2. 创建并实现过滤器类 一旦解决了缺失的库问题之后,就可以着手编写自己的过滤器逻辑了。下面是一个简单的例子展示如何继承自 `HttpServlet` 类以及实现其抽象方法来处理 HTTP 请求/响应拦截功能。 ```java import jakarta.servlet.*; import java.io.IOException; public class ExampleFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("Initializing the example filter..."); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // Pre-processing logic here before passing control down the line. System.out.println("Before processing the actual servlet."); try{ chain.doFilter(request,response); }finally{ // Post-processing after all other filters and target resource have been processed. System.out.println("After completing execution of downstream components."); } } @Override public void destroy() { System.out.println("Destroying resources used by this filter instance..."); } } ``` 注意这里我们采用的是最新版本Jakarta EE标准中的包名前缀(`jakarta.*`)替代旧版JavaEE系列下使用的命名空间(`javax.*`). 若目标平台仍基于较早规格则应调整相应导入语句匹配实际情况. #### 3. 注册过滤器 最后一步是在 web 应用程序描述符文件(web.xml)里注册新建立起来的过滤器及其适用URL模式。例如: ```xml <filter> <filter-name>exampleFilter</filter-name> <filter-class>com.example.ExampleFilter</filter-class> </filter> <filter-mapping> <filter-name>exampleFilter</filter-name> <url-pattern>/secure/*</url-pattern> </filter-mapping> ``` 通过以上设置即可让指定路径下的资源请求都经过所设定好的ExampleFilter实例加以管控.
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值