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];
相关推荐
JSP的本质是Servlet,由服务器负责解析并转换为Servlet执行。在JSP页面中,我们可以使用以下元素: 1. **脚本元素**:`<% %>` 用于编写Java代码,可以是声明、表达式或脚本块。 2. **指令元素**:如`<%@ page %>`, ...
在IT行业中,Tomcat、Struts2和Servlet Filter是Java Web开发中的重要组成部分。了解它们的工作原理对于构建高效、安全的Web应用程序至关重要。下面将详细阐述这三个组件的基本概念和工作流程。 首先,Tomcat是一个...
这篇博客"Servlet工作原理解析"深入探讨了Servlet的工作原理,帮助开发者更好地理解和使用这个强大的技术。以下是Servlet工作原理的详细解析: 1. **Servlet接口与生命周期** Servlet是通过实现`javax.servlet....
filter 之后,否则当解析到 filter-mapping 时,它所对应的 filter-name 还未定义。 web.xml 文件的加载顺序非常重要,它对 Web 应用的性能和稳定性产生了直接的影响。同时,我们也需要注意在 web.xml 文件中,各个...
Servlet、Filter和Listener是Java Web开发中的核心组件,它们在构建动态Web应用程序中扮演着重要角色。下面将分别深入解析这三个概念。 **Servlet接口** Servlet是Java编程语言中定义的一个接口,它允许开发者创建...
而在Servlet3.0中,我们可以通过`@WebFilter`注解来直接定义过滤器,指定其过滤的URL模式、DispatcherType等。这样,过滤器的配置就更加灵活和直观。 下面是一个使用注解声明的过滤器示例: ```java @WebFilter...
Web服务器中的三大组件,即Servlet、Filter和Listener,是构建动态Web应用程序的关键元素。这些组件都是基于Java的,主要用于增强和扩展Web服务器的功能。 Servlet是Java中用于处理HTTP请求的核心组件,它是动态...
1. **过滤器接口实现**:首先定义一个实现了`javax.servlet.Filter`接口的类`Filter`。 2. **初始化方法`init()`**:在过滤器创建时被调用,可以用来进行一些初始化操作。 3. **销毁方法`destroy()`**:在过滤器销毁...
6. **过滤器**(Filter):在Servlet处理请求之前和之后,可以添加过滤器来执行预处理或后处理任务,例如字符编码转换、权限检查等。 7. **监听器**(Listener):监听Web应用中特定事件,如会话创建、销毁、上下文...
【标题】"基于jdbc+servlet+filter的网上投票系统.zip" 涉及到的核心技术是Java Web开发中的三大重要组件:JDBC(Java Database Connectivity)、Servlet和Filter。这是一个典型的Web应用程序,用于实现在线投票的...
在这个解析中,我们将深入探讨Servlet3.0的核心特性,特别是Servlet注解的使用。 首先,Servlet3.0引入了注解驱动的配置,这极大地简化了web应用的部署描述符(web.xml)。以前,我们需要在web.xml中手动定义...
源码中,可以研究DispatcherServlet如何解析请求,以及如何将请求映射到相应的Servlet或Filter。 三、HTTP请求与响应处理 Jakarta Servlet API 4.0改进了对HTTP/2的支持,使得性能得到提升。`HttpServletRequest`和...
而"Servlet-api-src"则表明这是一个关于Servlet API源代码的资源,可能包含了一些示例、注释或者解析,对于学习和研究Servlet API的实现非常有益。 在压缩包文件的文件名称列表中,如果包含的是`javax`,那么可能...
7. **MIME多部分解析**:Servlet 3.0引入了`Part`接口,用于处理MIME多部分请求,这在处理上传文件时非常有用。 8. **安全增强**:添加了新的安全相关API,如`HttpServletRequest.isUserInRole()`和`...
在本主题"Servlet简单模拟Struts2"中,我们将探讨如何利用Servlet来实现类似Struts2框架的一些关键功能,包括请求拦截、XML配置解析、动态代理以及日志拦截。 首先,让我们了解一下Struts2框架的核心特性。Struts2...
它们负责管理Servlet的生命周期,解析请求,调用Servlet的方法,并将响应返回给客户端。 6. **Servlet的线程安全问题**: 由于Servlet实例默认是多线程的,因此在编写Servlet时需要注意线程安全问题。例如,避免在...
Java Web入门源代码是初学者踏入Web开发领域的宝贵资源,主要涵盖了Servlet、JSP和Filter这三个核心组件。这里将详细解析这些技术以及它们在实际应用中的作用。 Servlet是Java平台上的一个服务器端程序,用于扩展...
Servlet3.1引入了预定义的Filter和Servlet,例如`ContainerLoginService`和`ErrorPage`,这些预定义的组件可以帮助开发者更快地实现常见的功能,如用户认证和错误页面处理。 4. **WebSocket支持**: 该版本添加了...