1、 什么是过滤器?
过滤器是一个服务器端的组件,可以截取用户端的请求与响应信息,并对这些信息过滤。
过滤源—>过滤规则 ->过滤结果
举个例子来看:
我们有时候会在某些网站上去浏览某些内容,比如有的网址要求必须登录才可以去浏览此网站上的视频内容,这就是开发人员在后台写的过滤器的作用。在用户请求某些页面时,启用一个过滤器来对某些信息来进行过滤,以此来确定是否响应某些内容给用户的请求。
2、Filter的实现
Servlet中的API实现了Filter接口,如果某个java类实现了该接口,则该java类称为Filter过滤器。通过Filter技术,开发人员可以在用户访问某些web资源前,对访问的请求进行拦截。
Filter开发分为两个步骤:
<1>编写java类实现Filter接口,重写init(),doFilter(),destroy()方法。
<2>编辑web.xml文件,对Filter进行注册,并设置拦截的资源
myeclipse创建Filter需要注意的:
注意:
在myeclipse中创建WebProject时,记得勾选web.xml,否则会没有。如下:
这也是我的第一个demo,没有勾选,所以没有web.xml
怎么勾选如下图:
<1>创建webproject时记得一路next,不要finish:
代码演示编写java类:
package com.SecondFilter;
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;
/*
第一个Filter实例,该java类实现了Filter接口,因此这个类就变成了一个Filter过滤器。
*/
public class SecondFilterDemo implements Filter {
/*
在实现了Filter接口后,该类需要重写三个方法:
*/
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("destroy....");
//web容器在销毁过滤器实例时会调用该方法,释放资源,大多数情况用不到。
}
/*
doFilter方法:
这个方法是过滤器的核心方法,也就是在这个方法中会实现过滤的操作,当用户访问和过滤器相关的URL时,会先调用doFilter方法,doFilter方法中有一个FilterChain对象,该对象可调用chain.doFilter方法,从而确定是否“放行”(也就是允许用户去访问某些资源),或者是利用请求重定向或请求转发的手段去“拦截”(也就是不允许去访问,跳转到其他页面)
filter的三种典型应用:
1、可以在filter中根据条件决定是否调用chain.doFilter(request, response)方法,
即是否让目标资源执行
2、在让目标资源执行之前,可以对request\response作预处理,再让目标资源执行
3、在目标资源执行之后,可以捕获目标资源的执行结果,从而实现一些特殊的功能
*/
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
// TODO Auto-generated method stub
System.out.println("start....doFilter");
arg2.doFilter(arg0, arg1);//“放行,允许去访问该URL”
System.out.println("end....doFilter");
}
/*
init()方法:
Web容器在创造过滤器时会调用该方法,该方法可以去访问web.xml中的某些初始化参数。
*/
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
System.out.println("init....");
}
}
myeclipse中对web.xml进行配置
<1>直接编写web.xml,打开直接编辑
<2>用myeclipse中的design工具来自动注册:
在Design下我们可以添加name,url:
web.xml中配置过滤器:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>SecondFilter</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!--配置过滤器-->
<filter>
<filter-name>SecondFilterDemo</filter-name><!--过滤器的名字-->
<filter-class>com.SecondFilter.SecondFilterDemo</filter-class><!--Filter所属的类>
</filter>
<!--映射过滤器-->
<filter-mapping>
<filter-name>SecondFilterDemo</filter-name>
<url-pattern>/*</url-pattern><!--Filter关联的url,/*表示项目跟目录下的所有url-->
</filter-mapping>
</web-app>