介绍
javax.servlert.Filter是servlert里常用的工具,能够对servlet容器的请求和响应进行修改和检查,是个典型的处理链。可以认为是servlet的一个变种,它与servlet的区别在于:他不能直接为用户生成响应,只提供过滤功能。
执行流程
当一个请求满足了一个filter的过滤条件后,请求会被移交到下一个filter处理。这就涉及到了过滤链FilterChain。服务器会按照web.xlm中定义的filter组装成一条过滤链,依次执行其 doFilter()方法。
过滤器的生命周期
每个过滤器都要实现 javax.servlert.Filter,Filter只有三个方法,对应着Filter的生命周期
public interface Filter {
//初始化过滤器,servlet容器创建过滤器实例将调用该方法,该方法读取web.xml文件里的配置初始化参数。
void init(FilterConfig var1) throws ServletException;
//执行过滤内容
void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;
//销毁实例,servlet容器在销毁过滤器时调用该方法,释放过滤器占用的资源。
void destroy();
}
再来看看FilterChain源码:
public interface FilterChain {
//filter调用此方法执行下一个filter
void doFilter(ServletRequest var1, ServletResponse var2) throws IOException, ServletException;
}
FilterConfig
public interface FilterConfig {
//返回web.xml中定义的该过滤器的名称
String getFilterName();
//返回调用者所处的servlet上下文环境
ServletContext getServletContext();
//返回过滤器初始化参数值的字符串形式
String getInitParameter(String var1);
//以Enumeration形式返回过滤器所有初始化参数值,如果没有初始化参数,返回null.
Enumeration getInitParameterNames();
}
代码示例
web.xlm 配置
<filter>
<filter-name>myFilter</filter-name>
<filter-class>com.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
实现:
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
String name = filterConfig.getFilterName();
System.out.println("my filter name:" + name);
Student student = new Student();
student.setEmail("asdasdas");
context.setAttribute("myself", student);
Student studentFromContext = (Student) context.getAttribute("myself");
System.out.println(studentFromContext.getEmail());
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
String addr = servletRequest.getRemoteAddr();
if (addr.equals("10.1.6.77")) {
servletResponse.setLocale(new Locale("en_w"));
}
if (addr.equals("10.1.6.56")) {
//在响应头设置session状态
servletResponse.getWriter().write("非法请求...");
servletResponse.getWriter().write("<script>$(function (){window.location.href('/user/login.do');});</script>");
}
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}