JavaWeb——过滤器
一、Filter接口
所有的过滤器都必须实现filter接口。
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
}
@Override
public void destroy() {
}
}
init方法->Filter的创建和销毁由WEB服务器负责。 web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作,filter对象只会创建一次,init方法也只会执行一次。通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。
destroy方法->Web容器调用destroy方法销毁Filter。destroy方法在Filter的生命周期中仅执行一次。在destroy方法中,可以释放过滤器使用的资源。
doFilter方法执行过滤功能,将请求进行处理或者将请求转发到下一个组件或者直接返回响应。它将控制转到过滤器链的下一个过滤器或者实际的资源,每一次请求被拦截时执行,执行多次。
二、FilterConfig接口
用户在配置filter时,可以使用为filter配置一些初始化参数,当web容器实例化Filter对象,调用其init方法时,会把封装了filter初始化参数的filterConfig对象传递进来。因此开发人员在编写filter时,通过filterConfig对象的方法,就可获得:
String getFilterName():得到filter的名称。
String getInitParameter(String name): 返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.
Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。
public ServletContext getServletContext():返回Servlet上下文对象的引用。
String getFilterName();->获得过滤器名
ServletContext getServletContext();->获得servletContext对象
String getInitParameter(String var1);->获得初始化参数
Enumeration<String> getInitParameterNames();->获得初始化参数名的枚举
@WebFilter(urlPatterns = "/index.jsp",initParams = {
@WebInitParam(name = "username",value = "admin"),
@WebInitParam(name = "password",value = "123456")
})
public class MyFilter implements Filter {
private FilterConfig filterConfig=null;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig=filterConfig;
System.out.println("init.....");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("执行过滤方法");
Enumeration<String> enumeration=filterConfig.getInitParameterNames();
while(enumeration.hasMoreElements()){
String name=enumeration.nextElement();
String value=filterConfig.getInitParameter(name);
System.out.println(name+"->"+value);
}
System.out.println(servletRequest.getServletContext()==filterConfig.getServletContext());
System.out.println(filterConfig.getFilterName());->未指定过滤器名称将以完全限定名作为名称
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
System.out.println("destroy.....");<