1. 有时我们需要在程序中每一个页面做相同的操作,比如说登录验证,请求参数的编码问题等,这时我们就需要写一个过滤器做这些重复的动作。过滤器就相当于你想去某个地方时,肯定会从我(过滤器)这经过,并且得检查你身上有没有不该有点的东西,并且由我来决定你是否可以过去(可以过去就是过滤器中的代码,即chain.doFilter(request,response))。总之,像个门前的保安啊。
2. 过滤器应用分两步:
a) 书写过滤器
b) 在web.xml中配置过滤器
3. 书写过滤器手写必须实现javax.servlet.Filter接口,初始化和销毁对象的方法可以是空的方法体,而doFilter方法就是过滤要执行的内容。
4. 一个HelloWord实例
publicclass HelloFilter implements Filter{ // 【启动执行,在创建实例后】 执行一次 @Override publicvoid init(FilterConfig filterConfig) throws ServletException {} // 每次访问时候执行,执行n次 @Override publicvoid doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("3. 过滤器业务处理操作(通用操作处理开始)"); // 放行 (去到servlet)即可以去执行被请求的资源了 chain.doFilter(request, response); System.out.println("5. 执行结束"); } @Override publicvoid destroy() {} } |
5. 过滤器执行的流程
服务器启动:
1.调用过滤器构造方法, 创建过滤器实例
2.调用init方法, 执行初始化方法
用户访问:
3. 执行过滤器过滤方法:doFilter(request,response,chain);
4. 处理过滤器业务
5. 处理完后,放行(chain.doFilter)
接下来进入下一个过滤器,如果没有下一个过滤器,就直接执行请求资源(servlet或jsp)
6. servlet处理业务
7.控制权又回到过滤器(最后是由过滤器响应回浏览器的)!
服务器停止:
执行所有过滤器的destroy方法。
6. 配置过滤器
<!-- 第一个过滤器配置 --> <filter> <filter-name>hellofilter</filter-name> <filter-class>cn.itcast.a_hello.HelloFilter</filter-class> </filter> <!-- 拦截哪些请求 (现在指定了拦截所有的请求:html/jsp/servlet)--> <filter-mapping> <filter-name>hellofilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> |
7. 详细讲解过滤器配置过程
对于过滤器的配置,首先应该说明的是过滤器就是一个特殊的servlet,filter的配置比较简单模仿即可。
Filter-maping的配置主要是如何配置过滤到指定的资源
url-pattern的配置
a) url-pattern中“/”代表当前工程路径
b) “/*”说明要过滤当前web工程下的所有(目录)资源(包括css,js,图片等,可能会造成页面显示样式出错)。
c) 指定工程目录,比如说只想过滤一些我想过滤的页面,可以直接写访问页面的路径。例:/manage/home/main.jsp
d) 也可以过滤所有的jsp页面。例:*.jsp
e) 当然当servlet-maping的url-pattern若都有.action或者.do(其他后缀类似)也可以对servlet全部过滤。例:*.actioin或者*.do(这在过滤编码时很常用)
说明:url-pattern并不只是单单指浏览器中的域名地址(location)
而是指浏览器发出的所有请求的url。如下图(这是火狐浏览器的firebug工具,可以尝试):
Servlet-name配置
f) 若果要指定需要过滤的servlet,则可以在fiter-maping中配置servlet-name。此处的servlet-name应该跟servlet中的servlet-name的配置要一致
<filter-mapping> <filter-name>UTF8EncodingFilter</filter-name> <!-- 被过滤的目录或者servlet--> <url-pattern>/manage/*</url-pattern> <servlet-name>LoginServlet</servlet-name> <servlet-name>CourseServlet</servlet-name> <servlet-name>StudentServlet</servlet-name> <servlet-name>SeleCourseServlet</servlet-name> <servlet-name>StuScoreServlet</servlet-name> </filter-mapping> |
图中的url-pattern就是要过滤web工程目录下的manage目录下的所有文件。
Dispatcher配置
g) 当程序执行到指定的请求方式时,会被过滤。
<dispatcher>REQUEST</dispatcher> (默认,写了跟没写一样效果)直接访问时候会被拦截
<dispatcher>FORWARD</dispatcher> 只会拦截转发的请求 即,执行req.getRequestDispatcher(“index.jsp).forward(req,resp)会被拦截
<dispatcher>INCLUDE</dispatcher> 执行request.getRequestDispatcher("/index.jsp").include(request, response); 的时候,会被拦截
<dispatcher>ERROR</dispatcher> 当遇到声明式异常的时候执行过滤拦截,然后再跳转到指定错误页面 附:声明式异常: <error-page> <error-code>404</error-code> <location>/xxjsp</location> </error-page> 或者 <error-page> <exception-type>NullPo...</exception-type> <location>/xx.jsp</location> </error-page> |
原文地址:http://blog.csdn.net/caobaoyindedipan/article/details/45899075