一、Filter过滤器
1.什么是Filter
Filter被称作过滤器,其基本功能就是对Servlet 容器调用Servlet的过程进行拦截,从而在Serviet进行响应处理前后实现些特殊功能。 这就好比现实中的污水净化设备,它可以看作一个过滤器,专门用于过滤污水杂质。
当浏览器访问服务器中的目标资源时,会被Filter 拦截,在Filter中进行预处理操作,然后再将请求转发给目标资源。当服务器接收到这个请求后会对其进行响应,在服务器处理响应的过程中,也需要先将响应结果发送给过滤器,在过滤器中对响应结果进行处理后,才会发送给客户端。
其实,Filter 过滤器就是一个实现 了javax.servlet.Filter 接口的类。
二、Filter映射
1.拦截不同方式的访问请求
在web.xml文件中,-个filter - mapping>元素用于配置-个Filter 所负责拦截的资源。元素中有一个特殊的子元素 ,该元素用于指定过滤器所拦截的资源被Servlet容器调用的方式, 元素的值共有4个,具体如下。
REQUEST
当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问的,那么该过滤器将不会被调用。
INCL UDE
如果目标资源是通过RequestDispatcher的include()方法访问的,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
FORWARD
如果目标资源是通过RequestDispatcher的forward()方法访问的,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
ERROR
如果目标资源是通过声明式异常处理机制调用的,那么该过滤器将被调用。除此之外,过滤器不会被调用。
(1)创建一个叫chapter08项目,创建一个叫 cn.itcast.chapter08.filter包,创建一个名为ForwardServlet的Servlet类,该类用于将请求转发给first.jsp页面
package cn.itcast.chapter08.filter;
import java.io.*;
import javax.servlet.*;
public class ForwardFilter implements Filter {
public void init(FilterConfig fConfig) throws ServletException {
// 过滤器对象在初始化时调用,可以配置一些初始化参数
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 用于拦截用户的请求,如果和当前过滤器的拦截路径匹配,该方法会被调用
PrintWriter out=response.getWriter();
out.write("Hello FilterTest");
}
public void destroy() {
// 过滤器对象在销毁时自动调用 释放资源
}
}
(2)在web.xm文件中,配置ForwardSerlet信息。
<servlet>
<description></description>
<display-name> forwardServlet</display-name>
<servlet-name>forwardServlet</servlet-name>
<servlet-class>cn. itcast. chapter08. filter . forwardServlet</servlet-class>
</servlet>
<servlet-mapping>
(3 )在chapter08项目的WebContent目录中创建一个frst.jsp页面,该页面用于输出内容,first.jsp
<%@ page language= "java" contentType="text/html; charset=utf-8"
pageEncoding= "utf-8"%>
<html>
<head>< /head>
. <body>
first.jsp
</body>
</html>
(4)在cn.itcast.chapter08.filter 包中,创建一 个过滤器ForwardFilter.java, 该过滤器专门用于对first.jsp页面进行拦截
package cn. itcast. chapter08.filter;
import java.io. *;0
public class ForwardFilter implements Filter {
public vold init(FilterConfig fConfig) throws ServletException {
//过滤器对象在初始化时调用,可以配置-些初始化参数
}
public void doF ilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//用于拦截用户的请求,如果和当前过治器的拦戴路径匹配,该方法会被调用
PrintWriter out=response. getwriter();
out . write("Hello FilterTest");
public void destroy() {
//过滤器对象在销毁时自动调用,释放资源
}
(5)在web. xml文件中,配置过滤器的映射信息,拦截rstsps页面。
<filter>
<display-name>forwordFilter</display-name>
<filter- name >forwordFilter</filter-name >
<filter-class>cn. itcast. chapter08. filter. forwordF:
</filter>
<filter- mapping>
<filter- name> forwordFilter</filter- name>
<url-pattern>/forwordfilter</url-pattern>
2. Filter链
( 1 )在chapter08 项目的cn.itcast.chapter08.filter 包中新建两个过滤器MyFilter01 和MyFilter02
package cn. itcast . chapter08. filter;
import java.io.*;0
public class MyFilter02 implements Filter {
public void init(FilterConfig fConfig) throws ServletException {
//过滤器对象在初始化时调用,可以配置-些初始化参数
}
public void doF ilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//用于拦截用户的请求,如果和当前过滤器的拦截路径匹配,该方法会被调用
PrintWriter out=response . getWriter();
out . write( "MyFilter02 Before<br />");
chain. doFilter(request, response);
out. . write("<br />MyFilter02 After<br />");
}
public void destroy