一:基础介绍
1.介绍
基本功能是对Servlet容器调用Servlet的过程进行拦截,从而在Servlet进行响应处理的前后实现一些特殊的功能。
在Servlet api中定义了三个接口供开发人员编写Fileter程序:Filter,FilterChain,FilterConfig
Filter程序是实现了Filter接口的java类,与Servlet类似,由Servlet容器进行调用与执行。
Filter程序需要在web.xml文件中进行注册和设置它所能拦截的资源,可以拦截JSP,Servlet,静态图片文件和html文件。
2.Filter重要总结
是JavaWeb的一个重要组件,可以对发送到Servlet的请求进行拦截,也可以对响应进行拦截。
需要在web.xml中进行配置与映射。
3.创建一个Fileter
创建一个Filter类,实现Filter接口。
在web.xml中配置和映射,其中url-pattern指定Filter可以拦截哪些资源,就是可以通过哪些url访问到Filter
4.Filter接口
public void init(FilterConfig arg0)
FilterConfig 类似与ServletConfig。
可以在web.xml文件中配置当前的Filter初始化参数,配置与Servlet类似。
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
doFilter(request,response):把请求传给Filter链的下一个Filter。如果是最后一个Filter,就把请求给目标servlet或Jsp。
5.Filter拦截顺序
和<filter-mapping>配置顺序有关,靠前的先执行。
二:基础案例helloFilter
1.项目目录
2.index.jsp
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Insert title here</title> 6 </head> 7 <body> 8 <a href="test.jsp">TO Test Page</a> 9 </body> 10 </html>
3.test.jsp
1 <%@ page language="java" contentType="text/html; charset=ISO-8859-1" 2 pageEncoding="ISO-8859-1"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 7 <title>Insert title here</title> 8 </head> 9 <body> 10 <h2>Test Page</h2> 11 </body> 12 </html>
4.HelloFilter.java
1 package web; 2 3 import java.io.IOException; 4 5 import javax.servlet.Filter; 6 import javax.servlet.FilterChain; 7 import javax.servlet.FilterConfig; 8 import javax.servlet.ServletException; 9 import javax.servlet.ServletRequest; 10 import javax.servlet.ServletResponse; 11 12 public class HeloFilter implements Filter { 13 @Override 14 public void destroy() { 15 System.out.println("destory"); 16 } 17 @Override 18 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 19 throws IOException, ServletException { 20 System.out.println("doFilter"); 21 chain.doFilter(request, response); 22 23 } 24 @Override 25 public void init(FilterConfig arg0) throws ServletException { 26 System.out.println("init"); 27 } 28 29 }
5.web.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xmlns="http://xmlns.jcp.org/xml/ns/javaee" 4 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 5 id="WebApp_ID" version="3.1"> 6 <!-- 注册Filter --> 7 <filter> 8 <filter-name>heloFilter</filter-name> 9 <filter-class>web.HeloFilter</filter-class> 10 </filter> 11 <!-- 映射Filter --> 12 <filter-mapping> 13 <filter-name>heloFilter</filter-name> 14 <url-pattern>/test.jsp</url-pattern> 15 </filter-mapping> 16 </web-app>
6.效果
三:dispatcher节点
1.介绍
<dispatcher>指定过滤器拦截的资源被Servlet容器调用的方式,可以是Request,include,forward,error之一。
默认是request。
可以同时设置多个。
2.方式的使用
直接访问,就走request。
当jsp里面使用<jsp:forward>时,forward如果被允许,就会走过滤器
当jsp里面有<jsp:include>时,include被允许,也会走过滤器
当去错误页面,一般有两种方式:
在当前页面写<%@ page errorPage="/test.jsp">这时,这是一个转发,会走forward。
在web.xml中可以定义<erroe-page>标签,这时如果允许error,则走error。
3.使用位置
在web.xml中的<filter-mapping>中定义<dispatcher>
四:过滤器应用
1.禁用浏览器缓存的过滤器
有三个Http响应头字段都可以禁止浏览器缓冲当前页面,他们在Servlet中的示例代码如下:
response.setDateHeader("Expires",-1);
response.setHeader("Cache-Control","no-cache");
response.setHeader("Pragma","no-cache");
2.字符编码的过滤器
如果浏览器上出现乱码,可以在jsp里书写request.setCharactEncoding("UTF-8");
但是页面太多,不方便,所以定义一个字符编码过滤器。
然后在web.xml中配置。
3.