javaweb过滤器
我们首先再来复习一下javaweb三大组件
1.Servlet
2.Listener
3.Filter
这三大组件都是需要在web.xml中进行声明进行配置的
那么,什么是过滤器
过滤器会在一组资源,比如jsp,servlet,css文件,html文件的前面执行
可以让请求达到目标资源,也可以不让请求达到目标资源
所以
1.过滤器有拦截请求的能力
2.其实servlet也可以拦截来自某些ip的访问,但是过滤器可以
统一对一组资源进行操作拦截,而servlet只是针对自己本身的
我们来创建一个Filter试一下
public class AFilter 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() {
}
}
又是似曾相识的4个方法
1.init
2.doFilter
3.destroy
所以很明显
1.init 创建之后马上执行,用来初始化
2.doFilter 每次过滤的时候都会执行
3.destroy 销毁之前执行,用来做对非内存资源进行释放
OK,那么Filter是什么创建,什么时候销毁的呢
Filter是在服务器启动时就会创建,在服务器关闭的时候销毁
Filter是单例的
刚才说了,三大组件都要在web.xml里面进行配置
那么我们现在来配置一下
<filter>
<filter-name>aFilter</filter-name>
<filter-class>filter.AFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>aFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
filter-name和filter-class我就不说了,
为什么要来一个/*呢
这里的意思就是拦截所有的文件
如果是/web/*
那么就是拦截所有web路径下的文件
如果是/AServlet
那么就是只拦截AServlet
我们来尝试一下拦截
先来一个AServlet
public class AServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("AServlet---doPost");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("AServlet---doGet");
}
}
然后再来一个Filter
public class AFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("filter-init");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("filter-doFilter");
}
@Override
public void destroy() {
System.out.println("filter-destroy");
}
}
然后配置一下filter
<filter>
<filter-name>aFilter</filter-name>
<filter-class>filter.AFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>aFilter</filter-name>
<url-pattern>/servlet/AServlet</url-pattern>
</filter-mapping>
我们配置url为/servlet/AServlet
那么意思就是只拦截AServlet
然后我们试一下访问AServlet
看一下会发生什么
我们发现只输出了
filter-init
filter-doFilter
并没有输出AServlet,那么就说明已经成功拦截了
我们看一下doFilter方法的参数,一个request,一个response,还有一个filterChain
这个filterChain可以调用doFilter方法,可以放行
也就是释放拦截
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("filter-doFilter");
filterChain.doFilter(servletRequest, servletResponse);
}