序言:从今天开始慢慢复习Java基础
一:过滤器的简介
1.1 过滤器是什么
1:过滤器是javaweb中的三大组件之一,也就是说需要在web.xml中配置,也可以使用注解。
2:过滤器它能够对Servlet容器传给web组件中的ServletRequest和ServletResponse对象进行检查或者修改。比如过滤器能够在Web组件被调用之前检查ServletRequest对象,修改请求头或者请求的正文;过滤器能够在被Web组件调用之后检查ServletResponse对象,修改响应头或者响应的内容。
3:过滤器就像我们现实中的在窗户装一个过滤网,这样可以避免有蚊子进来,那么如果让蚊子进来呢?将那个过滤网的洞口变大一点,那么蚊子就可以进来了。
4:过滤器它会在一组资源(jsp、servlet、.css、.html等等)的前面执行, 它可以让请求得到目标资源,也可以不让请求达到。
1.2 使用过滤器的好处
A:通过一个现实的例子:在没有使用过滤器之前,我举例生活中的一个例子,比如 某某公司,分配了好多个部门,每个部门门口前面都有一个保安来检查你是不是该公司的人,如果是,那么你就可以进去。 如果我们使用这种方式的话,那么一个公司就得多请几个保安,这样导致总是重复一些劳动,降低了保安的检查工作的效率。
那么如果我们使用过滤器的话,就好比你在公司的大门面前,安排一个保安来检查是否是该公司的人,如果是,就放他进该公司,这样会大大提高保安的工作效率,而且还能减少重复劳动力,只需要请一个保安。
B:当多个web组件中编写同样操作的代码,那么我们可以将各个组件的相同操作可以放在同个过滤器中来完成,从而提高开发的效率。
二: Filter的API
void init(FilterConfig) * 创建之后,马上执行;Filter会在服务器启动时就创建!void destory() * 销毁之前执行!在服务器关闭时销毁void doFilter(ServletRequest,ServletResponse,FilterChain) * 每次过滤时都会执行二个对象:FilterConfig(这个对象就类似当初学ServletConfig的时候)getInitparamer*获取初始化参数getFilterName*获取配置名称getServletContext*获取配置的值FilterChain(这个东西比较重要)*doFilter作用:这个东西其实就决定了整个Filter,该方法决定了是否放行下一个过滤器执行(如果没有过滤器的话,那么执行目标资源)。
三:过滤器快速入门
3.1步骤
3.1.1 实现Filter接口
因为Filter不是ServletRequest或者ServletResponse中的对象,所以我们只需要直接用java的方式实现Filter接口
3.1.2 部署web.xml
这个东西的部署跟Servlet的部署是一样的,只是把将Servle的名字改为Filter
类名 类名 包名.类名 包名.类名 类名 类名 /类名 拦截的资源 REQUEST 默认的!还有三个 值FORWARD,INCLUDE,ERROR
3.1.3 快速入门案例代码
15 2 AServlet 类名 3cn.itcast.web.AServlet.AServlet 包名.类名 46 AServlet 类名 7/AServlet 拦截的资源 8REQUEST 默认的!还有三个 值FORWARD,INCLUDE,ERROR9
效果图:
四:Filter执行顺序
前面我们说过,FilterChain中有个方法(doFilter)及其重要,它能够决定整个doFilter,因为它能够决定你是否能够执行下一个过滤器(如果没有过滤器的话,那么直接执行目标资源)。
那么问题来了,当有多个过滤器的话,那么Filter的执行顺序是怎么样的?
4.1 多个过滤器执行顺序
当一个目标有多个过滤器执行顺序的时候,那么他的执行顺序是根据xml的中的位置,来执行过滤器的,
那么如果当中有涉及到放行呢? 那么流程可以这样记 当你去姥姥家取水果的时候,会先经过匪徒A再经过匪徒B,如果当你去的时候,他们会放你过去 那么会经过AB,回来的就从先经过B再经过A。
public class MyFilter1 extends HttpFilter { public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("filter1 start..."); chain.doFilter(request, response);//放行,执行MyFilter2的doFilter()方法 System.out.println("filter1 end..."); }}public class MyFilter2 extends HttpFilter { public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("filter2 start..."); chain.doFilter(request, response);//放行,执行目标资源 System.out.println("filter2 end..."); }} This is my JSP page.index.jsp
<%System.out.println("index.jsp"); %> 当用户访问index.jsp的时候,输出的结果:filter1 start...filter2 start...index.jspfilter2 end...filter1 end...
五:Filter 拦截方式
附上 dispatcher 的可选值及说明
可选值 | 说明 |
REQUEST | 当客户端直接请求时,通过过滤器进行处理 |
INCLUDE | 当客户端通过 RequestDispatcher 对象的 include() 方法请求时,通过过滤器处理 |
FORWARD | 当客户端通过 RequestDispatcher 对象的 forward() 方法请求时,通过过滤器进行处理 |
ERROR | 当声明式异常产生时,通过过滤器进行处理 |
六:过滤器的应用场景
过滤器的应用场景:
* 执行目标资源之前做预处理工作,例如设置编码,这种试通常都会放行,只是在目标资源执行之前做一些准备工作;
* 通过条件判断是否放行,例如校验当前用户是否已经登录,或者用户IP是否已经被禁用;
* 在目标资源执行后,做一些后续的特殊处理工作,例如把目标资源输出的数据进行处理;