过滤器(Filter)
- 什么是过滤器
过滤器是Javaweb的三大组件之一。他与servlet很相似,不过过滤器是用来拦截请求的,而不是处理请求的。
当用户请求某个servlet时,会先执行部署在这个请求上的Filter,如果Filter“放行”,那么,会继续执行用户请求的servlet,如果Filter不放行,那么就不会执行用户请求的Servlet。
他会在一组资源(servlet jsp CSS HTML .....)的前面执行
他可以让请求得到目标资源,也可以不让请求达到!
*过滤器有拦截请求的能力!
如:没有登录的人拦截 不然其访问对应的资源
过滤器如何编写?
- 写一个类实现javax.servlet.Filter接口
package com.igeek.filter;
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;
/** * @author www.igeehome.com * * TODO 第一个过滤器 * * 2018年8月25日上午11:06:15 */ public class FirstFilter implements Filter {
/** * filter销毁是调用,释放资源 */ public void destroy() { System.out.println("销毁filter:FirstFilter"); }
/** * 过滤处理 * @param request * @param response * @param chain 一般用来调用下一个filter * @throws IOException * @throws ServletException */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("执行了FirstFilter的diFilter方法"); //通过FilterChain调用下一个filter chain.doFilter(request, response); } /** * 初始化feilter * @param config 获得初始化参数 * @throws ServletException */ public void init(FilterConfig config) throws ServletException { System.out.println("初始化filter:FirstFilter"); }
} |
2.在web.xml中就行配置【与servlet非常相似】
<filter> <filter-name>firstFilter</filter-name> <filter-class>com.igeek.filter.FirstFilter</filter-class> </filter> <filter-mapping> <filter-name>firstFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> |
Tips当编写多个filter时,会按照配置顺序执行filter。
- Filter的生命周期
和Serlvet几乎一致。
在服务器启动时创建对象,之创建一次。在服务器关闭时销毁filter对象
初始化方法:
public void init(FilterConfig config)
在filter对象创建之后执行,用于初始化filter对象。
Config参数可以获取初始化参数。
销毁的方法:
public void destroy()
在服务器关闭时,销毁filter对象之前执行,主要用于释放资源。
过滤器处理方法:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
处理要过滤的请求的方法。
参数:
ServletRequest 是HttpServletRequest的父接口。
实际上服务传入的对象就是HttpServletRequest类型的参数。
所以可以直接强制类型转化
HttpServletRequest req = (HttpServletRequest)request;
ServletResponse 是HttpServletResponse父接口。
服务器传入的实际也是HttpServletResponse对象。同样可以强制类型转换。
tips:
在filter中同样可以使request转发,或者response重定向。
FilterChain:主要是调用其方法 doFilter(request,response)
如果存在下一个filter,则直接调用下一个filter,如果不存在,则直接访问资源。