1.实现Filter接口
2.在web.xml文件中注册 映射该filter
实现类
package top.demo.filter;
import java.io.IOException;
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 TestFilter implements Filter{
private FilterConfig filterConfig;
private ServletContext servletContext;
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
/*
* chain.doFilter(request, response);
* 该方法表示过滤结束请求可以往下传递 (也就是放行了这个请求)
* 因为过滤器可以有多个 且过滤的顺序按照mapping的描述顺序进行
* 所以当前过滤器放行后会交由其他过滤器,如果没有过滤器就交由web容器显示了
* 如果在交由web容器前 有某一个过滤器没有放行,也就是没有执行该方法,那么这个请求将被拦截
* 无法传递到web容器
*
*又让我想到了消息钩子
*过滤链上的过滤器执行的顺序可以看做一个过滤器("递归")调用另一个过滤器 所以函数返回的顺序和递归的情况类似
*
*
* */
System.out.println("do filter");
chain.doFilter(request, response);
System.out.println(getFilterConfig().getInitParameter("testparam"));
System.out.println(getFilterConfig().getFilterName());
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig=filterConfig;
this.servletContext=filterConfig.getServletContext();
}
@Override
public void destroy() {
Filter.super.destroy();
}
public FilterConfig getFilterConfig() {
return filterConfig;
}
public ServletContext getServletContext() {
return servletContext;
}
}
web.xml的配置
<filter>
<filter-name>testfilter</filter-name>
<filter-class>top.demo.filter.TestFilter</filter-class>
<init-param>
<param-name>testparam</param-name>
<param-value>paramvalue</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>testfilter</filter-name>
<!-- 指定该过滤器对哪些url生效 -->
<url-pattern>/dex.jsp</url-pattern>
<!-- 指定该过滤器对哪些方式生效 对转发的时候生效还是 请求的时候生效,一共四种方式-->
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
<!-- 指定该过滤器对哪些servlet生效
由于我还没写servlet就不加了
<servlet-name></servlet-name>
-->
</filter-mapping>