码迷,mamicode.com
首页 > 编程语言 > 详细

JavaWeb之Java过滤器

时间:2015-05-22 09:43:49      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:java   过滤器   


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>

 

JavaWeb之Java过滤器

标签:java   过滤器   

原文地址:http://blog.csdn.net/caobaoyindedipan/article/details/45899075

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!