过滤器Filter

一、Filter概述

  • Filter过滤器
        Filter意为滤镜或者过滤器,用于在Servlet之外对request或者response进行修改。
            Filter提出了滤镜链(FilterChain)的概念,一个FilterChain包括多个Filter。
            客户端请求request在抵达Servlet之前会经过FilterChain里的所有Filter,
            服务器响应response在从Servlet抵达客户端浏览器之前
            也会经过FilterChain里的所有Filter。
  • Filter接口
        一个Filter必须实现javax.servlet.Filter接口。
            Filter接口有3个方法:init()、doFilter()和destroy()方法。
        其中init()与destroy()方法只会被调用一次,
            分别在Web程序加载或者卸载的时候调用。
            而doFilter()方法每次有客户端请求都会被调用一次。
            Filter的所有工作也都集中在doFilter()方法中。
        chain.doFilter(request, response)将request递交给FilterChain中的
            下一个Filter,如果所有的Filter都走完了则交给Servlet处理。
  • Filter配置
        Filter需要配置在web.xml中才能生效。
            一个Filter需要配置<filter>与<filter-mapping>标签。
            <filter>
                <filter-name>filterName</filter-name>
                <filter-class><filter.MyFilter</filter-class>
                <init-param>
                    <param-name>paramName</param-name>
                    <param-value><paramValue</param-value>
                </init-param>
            </filter>
            <filter-mapping>
                <filter-name>filterName</filter-name>
                <url-pattern>/jsp/*</url-pattern>
                <url-pattern>*.do</url-pattern>
                <dispatcher>REQUEST</dispatcher>
                <dispatcher>FORWARD</dispatcher>
            </filter-mapping>
        <filter>配置Filter名称,实现类以及初始化参数(如果有的话)。
            可同时配置多个初始化参数。
        <filter-mapping>配置什么规则下使用该Filter。
            <url-pattern>配置URL的规则,可以配置多个,可以使用通配符(*)。
            <dispatcher>配置到达Servlet的方法,
                有4种取值:REQUEST、FORWARD、INCLUDE、ERROR。
                可以同时配置多个<dispatcher>。
                如果没有配置任何<dispatcher>,默认REQUEST。它们的区别是:
                REQUEST:表示仅当直接请求Servlet时才生效。
                FORWARD:表示仅当某Servlet通过FORWARD到该Servlet时才生效。
                INCLUDE:JSP中可以通过<jsp:include/>请求某Servlet。
                    仅这种情况下才有效。
                ERROR:JSP中可以通过<%@ page errorPage="error.jsp" %>
                    指定错误处理页面。仅在这种情况下才有效。
            <url-pattern>和<dispatcher>的关系是“且”的关系。
        <filter>的filterName与<filter-mapping>的filterName必须匹配。

二、Filter经典案例

  • 防盗链Fitler
        防盗链Filter实现这样一种效果,如果其他的网站引用本网站的图片资源,
            将会显示一个错误图片。只有本站内的网页引用时,图片才会正常显示。
            即在图片显示之前对request进行验证,看客户请求是否来自本网站内。
  • 字符编码Filter
        字符编码Filter是最常用的Filter之一,
            常用来解决Tomcat等服务器里request、response乱码的问题。字符编码
            Filter是在request提交到Servlet之前对request进行制定编码方式的编码。
  • 日志记录Filter
        记录日志也是Filter擅长的工作之一,
            在request之前与之后都可以记录日志。
            记录客户的IP地址,访问的URL以及消耗的时间
  • 异常捕捉Filter
        Filter中,如果在chain.doFilter(request,response)上加一个try...catch语句,
            就能捕捉Servlet中抛出的可预料的与不可预料的异常,
            然后根据不同的异常进行不同的异常处理。
  • 权限验证Filter
        Java Web程序一般使用session或者cookie来记录用户是否登录,以及该用户的权限。
            权限验证Filter是在将request提交给Servlet之前,对session或者cookie
            进行校验。如果没有相应的登录信息,或者权限不够,则进行相应的处理。
        如果只检查是否登录,则只检查session或cookie中有没有相应的信息即可。
            如果要检查权限,则需要一个URI与权限角色的检查规则。
  • 内容替换Filter
        内容替换Filter的工作原理是,在Servlet将内容输出到response时,
            response将内容缓存起来,在Filter中进行替换,然后再输出到客户端浏览器。
  • GZIP压缩Filter
        网站常使用GZIP压缩算法对网页内容进行压缩,
        然后传给浏览器,以减少数据传输量、提高响应速度。
        浏览器接收到GZIP压缩数据后会自动解压并正确显示。
        GZIP加速常用来解决网速慢的瓶颈。
  • 图像水印Filter
        Filter也常用做图像处理。工作原理跟GZIP压缩类似,
            先把图像数据缓存起来,然后对图像数据进行水印处理后输出到客户端浏览器。
  • 缓存Filter
        缓存Filter的工作流程为:
        (1)截获浏览器提交的request;
        (2)如果request为POST方式,则不经过缓存;
        (3)如果request为GET方式,且请求的页面有缓存并且缓存没有过期,
            则直接返回缓存结果,这样就避免了读取数据库。
        (4)如果没有缓存或者缓存已过期,则重新请求Servlet,
            将Servlet返回的内容缓存并输出到客户端浏览器。
  • XSLT转换Filter
        XSLT转换是XML文件的功能之一,是利用XSLT样式文件将XML文件转换为其他格式。
  • 文件上传Filter
        有时候默认的request不能满足需求,这时就需要自定义request。
        自定义一个request,
            不仅能够通过request.getParameter(fieldname)获取普通文本域,
            还能通过request.getAttribute(fieldname)直接获取上传的文件。
            原理是先判断原request是否为multipart格式,如果不是,则不作任何处理。
            如果是,则使用apache的uploading工具解析,放到Map中,
            并覆盖getParameter()方法与getAttribute()方法。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值