`
Notebookdong
  • 浏览: 122285 次
社区版块
存档分类
最新评论

Servlet Filter解析

 
阅读更多

   Servlet Filter(过滤器)是小型的web组件,它能够处理传入的请求和传出的响应。它能够在一个request到达Servlet之前预处理request,也可以在离开Servlet时处理response。它具有高度的透明性,无需更改应用程序代码,就可以根据需要添加、修改或从应用程序中将它删除。

   一个Filter 包括: 

  • 在servlet被调用之前截获; 
  • 在servlet被调用之前检查servlet request; 
  • 根据需要修改request头和request数据; 
  • 根据需要修改response头和response数据; 
  • 在servlet被调用之后截获. 

创建一个Filter我们只要implements Filter接口然后重写Filter接口中的三个方法就可以了,下面创建一个我们自己的Filter名字叫MyFilter:

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class MyFilter implements Filter {

	public void destroy() {
		// TODO Auto-generated method stub
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		System.out.println("enter filter....");
		chain.doFilter(request, response);
		System.out.println("out  filter....");
	}

	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

}

 在创建完MyFilter类之后,需要在web.xml文件加入相应代码进行部署:

  <filter>
    <display-name>MyFilter</display-name>
    <filter-name>MyFilter</filter-name>
    <filter-class>cookie.MyFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

 这样配置完之后,当我们再通过浏览器去访问的时候,所有的请求都会先经过MyFilter,首先执行doFilter方法中的System.out.println("enter filter...."); 然后执行chain.doFilter(request, response);如果还有其它的Filter则会继续调用其它的Filter,如果没有其它的Filter则调用所请求的Servlet,在调用完Servlet之后就执行System.out.println("out  filter....");然后请求结束。

   如果要建立多个Filter写法也和上面的一样创建另一个Filter类,在web.xml中进行部署。在这里如果项目中有多个Filter,它们的执行顺序是怎么区别的呢?通过测试发现,服务器会通过web.xml中Filter部署的顺序来决定每个Filter执行的顺序:

  <filter>
    <display-name>MyFilter2</display-name>
    <filter-name>MyFilter2</filter-name>
    <filter-class>cookie.MyFilter2</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>MyFilter2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <filter>
    <display-name>MyFilter</display-name>
    <filter-name>MyFilter</filter-name>
    <filter-class>cookie.MyFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

   上面有两个Filter,MyFilter和MyFilter2但MyFilter2在web.xml中是放在MyFilter的前面的,所以当执行的时候是会先执行MyFilter2。

   通过源码可以看到FilterChain接口的实现类ApplicationFilterChain有个数组filters,这个里面放的就是我们所定义的所有Filter。当启动服务器的时候服务器通过web.xml所定义的<filter>标签中的内容去实例化每个过渡器,并把每个实例添加到filters这个数组中。

final class ApplicationFilterChain  implements FilterChain, CometFilterChain{
 private static final ThreadLocal lastServicedRequest;
 private static final ThreadLocal lastServicedResponse;
 public static final int INCREMENT = 10;
 private ApplicationFilterConfig[] filters = new ApplicationFilterConfig[0];

 

 

 

  • 大小: 17.8 KB
分享到:
评论

相关推荐

    jsp,servlet,filter温故知新

    JSP的本质是Servlet,由服务器负责解析并转换为Servlet执行。在JSP页面中,我们可以使用以下元素: 1. **脚本元素**:`&lt;% %&gt;` 用于编写Java代码,可以是声明、表达式或脚本块。 2. **指令元素**:如`&lt;%@ page %&gt;`, ...

    tomcat、struts2、servlet Filter(过滤器) 工作原理

    在IT行业中,Tomcat、Struts2和Servlet Filter是Java Web开发中的重要组成部分。了解它们的工作原理对于构建高效、安全的Web应用程序至关重要。下面将详细阐述这三个组件的基本概念和工作流程。 首先,Tomcat是一个...

    Servlet 工作原理解析

    这篇博客"Servlet工作原理解析"深入探讨了Servlet的工作原理,帮助开发者更好地理解和使用这个强大的技术。以下是Servlet工作原理的详细解析: 1. **Servlet接口与生命周期** Servlet是通过实现`javax.servlet....

    web.xml 中的listener、 filter、servlet 加载顺序及其详解.doc

    filter 之后,否则当解析到 filter-mapping 时,它所对应的 filter-name 还未定义。 web.xml 文件的加载顺序非常重要,它对 Web 应用的性能和稳定性产生了直接的影响。同时,我们也需要注意在 web.xml 文件中,各个...

    Servlet、Filter、Listener深入理解.docx

    Servlet、Filter和Listener是Java Web开发中的核心组件,它们在构建动态Web应用程序中扮演着重要角色。下面将分别深入解析这三个概念。 **Servlet接口** Servlet是Java编程语言中定义的一个接口,它允许开发者创建...

    Servlet3.0新特性解析

    而在Servlet3.0中,我们可以通过`@WebFilter`注解来直接定义过滤器,指定其过滤的URL模式、DispatcherType等。这样,过滤器的配置就更加灵活和直观。 下面是一个使用注解声明的过滤器示例: ```java @WebFilter...

    web服务器三大组件servlet、Filter、Listener——浅浅笔记

    Web服务器中的三大组件,即Servlet、Filter和Listener,是构建动态Web应用程序的关键元素。这些组件都是基于Java的,主要用于增强和扩展Web服务器的功能。 Servlet是Java中用于处理HTTP请求的核心组件,它是动态...

    Servlet过滤器小实例

    1. **过滤器接口实现**:首先定义一个实现了`javax.servlet.Filter`接口的类`Filter`。 2. **初始化方法`init()`**:在过滤器创建时被调用,可以用来进行一些初始化操作。 3. **销毁方法`destroy()`**:在过滤器销毁...

    servlet基础与servlet容器模型

    6. **过滤器**(Filter):在Servlet处理请求之前和之后,可以添加过滤器来执行预处理或后处理任务,例如字符编码转换、权限检查等。 7. **监听器**(Listener):监听Web应用中特定事件,如会话创建、销毁、上下文...

    基于jdbc+servlet+filter的网上投票系统.zip

    【标题】"基于jdbc+servlet+filter的网上投票系统.zip" 涉及到的核心技术是Java Web开发中的三大重要组件:JDBC(Java Database Connectivity)、Servlet和Filter。这是一个典型的Web应用程序,用于实现在线投票的...

    Servlet3.0新特性解析01

    在这个解析中,我们将深入探讨Servlet3.0的核心特性,特别是Servlet注解的使用。 首先,Servlet3.0引入了注解驱动的配置,这极大地简化了web应用的部署描述符(web.xml)。以前,我们需要在web.xml中手动定义...

    jakarta-servletapi-4-src.zip servlet源码

    源码中,可以研究DispatcherServlet如何解析请求,以及如何将请求映射到相应的Servlet或Filter。 三、HTTP请求与响应处理 Jakarta Servlet API 4.0改进了对HTTP/2的支持,使得性能得到提升。`HttpServletRequest`和...

    servlet源码 servlet-api-src javax.servlet.Servlet源码

    而"Servlet-api-src"则表明这是一个关于Servlet API源代码的资源,可能包含了一些示例、注释或者解析,对于学习和研究Servlet API的实现非常有益。 在压缩包文件的文件名称列表中,如果包含的是`javax`,那么可能...

    servlet-api-3.0.jar包

    7. **MIME多部分解析**:Servlet 3.0引入了`Part`接口,用于处理MIME多部分请求,这在处理上传文件时非常有用。 8. **安全增强**:添加了新的安全相关API,如`HttpServletRequest.isUserInRole()`和`...

    Servlet简单模拟Struts2

    在本主题"Servlet简单模拟Struts2"中,我们将探讨如何利用Servlet来实现类似Struts2框架的一些关键功能,包括请求拦截、XML配置解析、动态代理以及日志拦截。 首先,让我们了解一下Struts2框架的核心特性。Struts2...

    Servlet技术入门教学

    它们负责管理Servlet的生命周期,解析请求,调用Servlet的方法,并将响应返回给客户端。 6. **Servlet的线程安全问题**: 由于Servlet实例默认是多线程的,因此在编写Servlet时需要注意线程安全问题。例如,避免在...

    java web 入门源代码,包含servlet,jsp,filter等

    Java Web入门源代码是初学者踏入Web开发领域的宝贵资源,主要涵盖了Servlet、JSP和Filter这三个核心组件。这里将详细解析这些技术以及它们在实际应用中的作用。 Servlet是Java平台上的一个服务器端程序,用于扩展...

    servlet3 api 文档

    Servlet3.1引入了预定义的Filter和Servlet,例如`ContainerLoginService`和`ErrorPage`,这些预定义的组件可以帮助开发者更快地实现常见的功能,如用户认证和错误页面处理。 4. **WebSocket支持**: 该版本添加了...

Global site tag (gtag.js) - Google Analytics