序言:从今天开始慢慢复习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
<servlet> <filter> <servlet-name>类名</servlet-name> <filter-name>类名</filter-name> <servlet-class>包名.类名</servlet-class> <filter-class>包名.类名</filter-class> </servlet> </filter> <servlet-mapping> <filter-mapping> <servlet-name>类名</servlet-name> <filter-name>类名</filter-name> <url-pattern>/类名</url-pattern> <url-pattern>拦截的资源</url-pattern> </servlet-mapping> <dispatcher>REQUEST</dispatcher>默认的!还有三个 值FORWARD,INCLUDE,ERROR </filter-mapping>
3.1.3 快速入门案例代码
1 <servlet> <filter> 2 <servlet-name>AServlet</servlet-name> <filter-name>类名</filter-name> 3 <servlet-class>cn.itcast.web.AServlet.AServlet</servlet-class> <filter-class>包名.类名</filter-class> 4 </servlet> </filter> 5 <servlet-mapping> <filter-mapping> 6 <servlet-name>AServlet</servlet-name> <filter-name>类名</filter-name> 7 <url-pattern>/AServlet</url-pattern> <url-pattern>拦截的资源</url-pattern> 8 </servlet-mapping> <dispatcher>REQUEST</dispatcher>默认的!还有三个 值FORWARD,INCLUDE,ERROR 9 </filter-mapping>
效果图:
四: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..."); } } <body> This is my JSP page. <h1>index.jsp</h1> <%System.out.println("index.jsp"); %> </body> 当用户访问index.jsp的时候,输出的结果: filter1 start... filter2 start... index.jsp filter2 end... filter1 end...
五:Filter 拦截方式
附上 dispatcher 的可选值及说明
可选值
|
说明
|
REQUEST
|
当客户端直接请求时,通过过滤器进行处理
|
INCLUDE
|
当客户端通过 RequestDispatcher 对象的 include() 方法请求时,通过过滤器处理
|
FORWARD
|
当客户端通过 RequestDispatcher 对象的 forward() 方法请求时,通过过滤器进行处理
|
ERROR
|
当声明式异常产生时,通过过滤器进行处理
|
六:过滤器的应用场景
过滤器的应用场景:
* 执行目标资源之前做预处理工作,例如设置编码,这种试通常都会放行,只是在目标资源执行之前做一些准备工作;
* 通过条件判断是否放行,例如校验当前用户是否已经登录,或者用户IP是否已经被禁用;
* 在目标资源执行后,做一些后续的特殊处理工作,例如把目标资源输出的数据进行处理;