过滤器

来源:互联网 发布:淘宝宝贝模板怎么用 编辑:程序博客网 时间:2024/04/30 04:06
Servlet(Servlet都需要部署描述符中描述)的分类:
标准Servlet(JSP)---MVC
过滤Servlet(过滤器)
监听Servelt(监听器)
监听器--类似一种组件,用的时候往上加就可以,过滤器整个都是自动调用执行的
Servlet应该是后期加入的功能

过滤器的实现:
    1.实现Filter接口 ----有三个方法
    init()----容器启动时自动初始化,相当于Filter类的构造方法,但是它一样可以有自己的构造方法,也会自动调用,且构造方法之后才调用init方法
    doFilter(ServletRequest request,ServletResponse response,FilterChain chain )---在访问相应的url-pattern的时候自动调用执行
    destroy()
        注意其中的是ServletRequest,ServletResponse,不是HttpServletRequest,HttpServletResponse,不仅仅对HTTP协议起效
    2.在web.xml中进行配置
        <filter>            <filter-name></filter-name> //这个Filter的name,就是生成的这个Filter的对象名            <filter-class></filter-class> //这个Filter的”类路径“(包.类)        </filter>        <filter-mapping>            <filter-name></filter-name> //同上面<filter-name>的值             <url-pattern></url-pattern> //对哪个页面进行过滤,如果是对全部页面,就是“/*”        </filter-mapping>


<url-pattern></url-pattern>---表示对哪个页面进行过滤,如果是对全部页面,就是“/*”

doFilter()---就是将本身可以直接访问的页面,在访问前,先访问Filter,经过doFilter()处理,相关操作都是在doFilter()中

如果要将内容传递到目的地,就需要将请求向下转发
FilterChain---完成请求的向下转发.doFilter(request,response)--注意不是Filter的doFilter,是FilterChain的doFilter()
 
 过滤器执行几次的问题:
 其实过滤器一般情况下如果是使用了FilterChain的doFilter()就使用了两次,因为其实调用doFilter()的时候就相当于使用完了这次的Filter
 而当请求向下转发完成之后,它又会回到FilterChain的doFilter()这个地方(返回到先前调用doFilter()停住的地方继续向下执行(相当于doFilter()函数返回了),又一次调用Filter.
 所以说使用了一次的,是说这个Filter的doFilter()只调用了一次,而说调用了两次的是因为FilterChain的doFilter()向下传递请求的时候已经出了当前的Filter,只是后来又回来了
 可以将Filter比作一个过滤用的门,请求来的时候经过一次,响应返回的时候再经过一次

 还有个特殊情况就是Filter中止了请求的进一步深入,即没有再进一步调用FilterChain的doFilter函数了,那么这时doFilter明显只被执行了一次。

过滤器的功能
    1.任何网站都需要对网站是否登陆进行过滤---不过滤的时候是在jsp页面判断session
    eg.    与在jsp页面中判断类似,看session中是否有相应的属性,有就将请求继续传递,否则跳转到登陆页面(用RequestDispatcher,request对象,是ServletRequest对象可以取得RequestDispather,而不需要是HttpServletRequest)
            注意:jsp中的Session属于HttpSession,是HTTP范畴,而Filter中的是不相关具体的协议的
            所以需要把request,强转为HttpRequest类型,才能得到session对象
            HttpServletRequest req = (HttpServletRequest)request;
            HttpSession session = req.getSession();//跳转的时候用req.或者原来的request都能
            取得RequestDispatcher,request/req.getRequestDispatcher().forward(requst/req.response);
    2.网上聊天系统,屏蔽非法文字
        eg.获取相应的内容,查看那是否有相应的内容,有则进行相关处理,没有请求继续传递
    3.对请求的内容进行统一编码
        eg.直接在Filter中的doFilte函数中先request.setCharacterEncoding()然后再传递请求即可,这样以后的处理都不需要再进行这样的操作,可以避免之后很多