一、Filter的基本工作原理
1、Filter程序是一个实现了特殊接口的Java类,与Servlet类似,也是由Servlet容器进行调用和执行的。
2、当在web.xml注册了一个Filter来对某个Servlet程序进行拦截处理时,它可以决定是否将请求继续传递给Servlet程序,以及对请求和响应消息是否进行修改。
3、当Servlet容器开始调用某个Servlet程序时,如果发现已经注册了一个Filter程序来对该Servlet进行拦截,那么容器不再直接调用Servlet的service方法,而是调用Filter的doFilter方法,再由doFilter方法决定是否去激活service方法。
4、但在Filter.doFilter方法中不能直接调用Servlet的service方法,而是调用FilterChain.doFilter方法来激活目标Servlet的service方法,FilterChain对象时通过Filter.doFilter方法的参数传递进来的。
5、只要在Filter.doFilter方法中调用FilterChain.doFilter方法的语句前后增加某些程序代码,这样就可以在Servlet进行响应前后实现某些特殊功能。
6、如果在Filter.doFilter方法中没有调用FilterChain.doFilter方法,则目标Servlet的service方法不会被执行,这样通过Filter就可以阻止某些非法的访问请求。
二、Filter接口
一个Filter程序就是一个Java类,这个类必须实现Filter接口。javax.servlet.Filter接口中定义了三个方法:init、doFilter、destory。
1、init方法
(1)、在Web应用程序启动时,Web服务器(Web容器)将根据其web.xml文件的配置信息来创建每个注册的Filter的实例对象,并将其保存在内存中。
(2)、Web容器创建Filter的实例对象后,将立即调用该Filter对象的init方法。init方法在Filter生命周期中仅被执行一次,Web容器在调用init方法时,会传递一个包含Filter的配置和运行环境信息的FilterConfig对象。
(3)开发人员可以在init方法中完成与构造方法类似的初始化功能,要注意的是:如果初始化代码要使用到FilterConfig对象,这些代码只能在init方法中编写,而不能在构造方法中编写(尚未调用init方法,即并没有创建FilterConfig对象,要使用它则必然出错)。
2、doFilter方法
当一个Filter对象能够拦截访问请求时,Servlet容器将调用Filter对象的doFilter方法。
其中,参数request和response为Web容器或Filter链中上一个Filter传递过来的请求和响应对象;参数chain为代表当前Filter链的对象
3、destroy方法
该方法在Web容器卸载Filter对象之前被调用,也仅执行一次。可以完成与init方法相反的功能,释放被该Filter对象打开的资源,例如:关闭数据库连接和IO流。
案例代码:
web.xml
<filter>
<filter-name>PrivFilter</filter-name>
<filter-class>util.PrivFilter</filter-class>
<init-param>
<param-name>cookieName</param-name>
<param-value>ssocookie</param-value>
</init-param>
<init-param>
<param-name>SSOServiceURL</param-name>
<param-value>http://localhost:8080/CAS/checkCookie.do</param-value>
</init-param>
<init-param>
<param-name>SSOServiceURL</param-name>
<param-value>http://localhost:8080/CAS/login.html</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>PrivFilter</filter-name>
<url-pattern>*.html</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>PrivFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
PrivFilter.java
private FilterConfig filterConfig = null;
static private String cookieName;
static private String SSOServiceURL;//验证url
static private String SSOLoginPage;//登陆url
public void init(FilterConfig filterConfig) {
this.filterConfig = filterConfig;
if (filterConfig != null) {
System.out.println("SSOFilter:Initializing filter");
}
cookieName = filterConfig.getInitParameter("cookieName");
SSOServiceURL = filterConfig.getInitParameter("SSOServiceURL");
SSOLoginPage = filterConfig.getInitParameter("SSOLoginPage");
}