Filter生命周期
filter和Servlet相似。
1.filter是在应用启动时被创建和初始化。
2.filter是单例多线程的。
3.filter在应用被停止时销毁。
4.doFilter():无论是哪一个线程访问,只要是由该filter进行过滤,那么会执行该filter的dofilter方法,
并且是每过滤一次就会执行一次dofilter方法。
5.由于filter是单列多线程的,保证器线程安全问题,一般是不为filter添加可修改的成员变量。
创建filter的步骤
1.创建自己的filter实现Filter接口(java.servletx.*)
package com.javaweb.filters;
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;
public class SomeFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
System.out.println("执行SomeFilter");
//放行操作,过滤请求后,把请求发送到服务器
chain.doFilter(request, response);
}
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("filter销毁");
}
@Override
public void init(FilterConfig filterConfig ) throws ServletException {
// TODO Auto-generated method stub
System.out.println("filter初始化");
}
}
2.注册filter,和servlet相似的注册方式
<filter>
<filter-name>SomeFilter</filter-name>
<filter-class>com.javaweb.filters.SomeFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SomeFilter</filter-name>
<!--过滤所有请求-->
<url-pattern>/*</url-pattern>
</filter-mapping>
FilterConfig
FilterConfig:过滤器配置信息的对象。和servletConfig对象一样,可以获取配置信息的内容
package com.javaweb.filters;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class SomeFilter implements Filter {
private FilterConfig filterConfig;
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
String filterName = filterConfig.getFilterName();
System.out.println("filterName="+filterName);
Enumeration<String> names = filterConfig.getInitParameterNames();
while(names.hasMoreElements()){
String name = names.nextElement();
String value = filterConfig.getInitParameter(name);
System.out.println(name+"="+value);
}
ServletContext servletContext = filterConfig.getServletContext();
System.out.println("ServletContext="+servletContext);
chain.doFilter(request, response);
}
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("filter销毁");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
this.filterConfig = filterConfig;
}
}
<filter>
<filter-name>SomeFilter</filter-name>
<filter-class>com.javaweb.filters.SomeFilter</filter-class>
<init-param>
<param-name>name</param-name>
<param-value>流行</param-value>
</init-param>
<init-param>
<param-name>age</param-name>
<param-value>14</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SomeFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
url-parrtern
第一种配置:<url-pattern>/*</url-pattern>
对所有的请求进行拦截。
<filter>
<filter-name>SomeFilter</filter-name>
<filter-class>com.javaweb.filters.SomeFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SomeFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
第二种配置:<servlet-name>SomeServlet</servlet-name>
对指定的访问servlet的请求进行拦截
<filter>
<filter-name>SomeFilter</filter-name>
<filter-class>com.javaweb.filters.SomeFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SomeFilter</filter-name>
<servlet-name>SomeServlet</servlet-name>
</filter-mapping>
dispathcher
dispatcher的取值:
1.REQUEST 默认值:对于任何的普通请求都进行拦截,但是请求转发中的forward和include除外。
2.INCLUDE:当访问某个servlet时,只会对其中进行了请求转发的include方式(getRequestDispatcher().incldue())进行拦截。其他任何的请求不会进行拦截,包括这个servlet请求。
3.FOEWARD:当访问某个servlet时,只会对其中进行了请求转发的forward方式(getRequestDispatcher().forward())进行拦截。其他任何的请求不会进行拦截,包括这个servlet请求。
4.ERROR:当跳转到一个错误处理页面时,对这个请求进行拦截。
<filter>
<filter-name>SomeFilter</filter-name>
<filter-class>com.javaweb.filters.SomeFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SomeFilter</filter-name>
<servlet-name>SomeServlet</servlet-name>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<error-page>
<error-code>404</error-code>
<location>/error.jsp</location>
</error-page>