定义
Servlet过滤器从字面上的字意理解为经过一层次的过滤处理才达到使用的要求,而其实Servlet过滤器就是服务器与客户端请求与响应的中间层组件,在实际项目开发中Servlet过滤器主要用于对浏览器的请求进行过滤处理,将过滤后的请求再转给下一个资源。总的来说,Servlet的过滤器是通过一个配置文件来灵活的声明的模块化可重用组件。过滤器动态的截获传入的请求和传出的响应,在不修改程序代码的情况下,透明的添加或删除他们。其独立于任何平台和web容器。
特点
● 声明式的:通过在web.xml配置文件中声明,允许添加、删除过滤器,而无需改动任何应用程序代码或jsp页面。
● 灵活的:过滤器可用于客户端的直接调用执行预处理和后期的处理工作,通过过滤链可以实现一些灵活的功能。
● 可移植的:由于现今各个web容器都是以Servlet的规范进行设计的,因此Servlet过滤器同样是跨容器的。
● 可重用的:基于其可移植性和声明式的配置方式,Filter是可重用的。
基本概念
Filter是在Servlet 2.3之后增加的新功能,当需要限制用户访问某些资源或者在处理请求时提前处理某些资源的时候,就可以使用过滤器完成。
过滤器是以一种组件的形式绑定到WEB应用程序当中的,与其他的WEB应用程序组件不同的是,过滤器是采用了“链”的方式进行处理的。
Filter可以应用在客户端和Servlet之间、servlet和serlvet或jsp之间,以及jsp之间。并且可以通过配置信息,灵活的使用那个过滤器。
工作原理
客户端浏览器在访问web服务器的某个具体资源的时候,经过过滤器1中code1代码块的相关处理之后,将request请求传递给过滤链中的下一个过滤器2,(过滤链的顺序以配置文件中的顺序为基准)过滤器2处理完之后,request就传递的Servlet完成相应的逻辑。返回响应的过程类似,只是过滤链的顺序相反。
作用
- 对服务器接收的请求和响应给浏览器的资源进行管理
- 保护Servlet
使用
过滤器定义
在Servlet中,如果要定义一个过滤器,则直接让一个类实现javax.servlet.Filter接口即可,此接口定义了三个操作方法
- 实现javax.servlet.Filter接口
- 实现init方法,读取过滤器的初始化参数,服务器启动执行
- 实现doFilter方法,完成对请求或响应的过滤
- 调用FilterChain接口对象的doFilter方法,向后续的过滤器传递请求或响应(放行请求和响应)
- 实现destroy方法,服务器关闭执行
public class MyFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("MyFilter.init(第一个过滤器初始化成功)");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("MyFilter.doFilter(第一个过滤器执行成功)");
//设置编码格式
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setContentType("text/html;charset=utf-8");
//判断session
HttpSession hs = ((HttpServletRequest)servletRequest).getSession();
if (hs.getAttribute("user") == null) {
((HttpServletResponse)servletResponse).sendRedirect("/manage/login.jsp");
}else {
// 转发放行到下一个组件,进行后续的处理(组件可以是一个过滤器,也可以是一个servlet)
filterChain.doFilter(servletRequest,servletResponse);
}
System.out.println("MyFilter.doFilter(第一个过滤器执行成功2)");
}
@Override
public void destroy() {
System.out.println("MyFilter.destroy(第一个过滤器销毁成功)");
}
}
web.xml配置
<!--配置过滤器
/*:表示拦截所有请求,包括servlet和jsp
*.model:表示拦截以do结尾的请求,一般用来进行模块拦截处理
/servletName:表示拦截指定url请求,针对某个Servlet的请求进行拦截,保护Servlet
-->
<filter>
<filter-name>myFilter</filter-name>
<filter-class>com.mt.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>myFilter2</filter-name>
<filter-class>com.mt.filter.MyFilter2</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter2</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<filter>
<filter-name>myFilter3</filter-name>
<filter-class>com.mt.filter.MyFilter3</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter3</filter-name>
<url-pattern>/NoFilterServlet.do</url-pattern>
</filter-mapping>
生命周期
服务器启动到服务器关闭
使用案例
- 统一编码格式设置
- session管理
- 权限控制
- 资源管理(统一水印、敏感词处理)