Java组件-Filter

一:简介
     过滤器是在Servlet2.3规范中定义的,它能够对客户端请求进行预处理,也可以对response进行后处理,然后再将请求转发给其他web组件,是个典型的处理链。
过滤器的过滤过程:

Filter有以下几个种类:
     1).用户授权的Filter:Filter负责检查用户请求,根据请求过滤用户非法请求。
     2).负责解码的Filter:包括对非标准编码的请求解码。
     3).日志Filter:详细记录某些特殊的用户请求。
实现:
1)  写一个类实现  Filter  接口  ,  doFilter  方法中写功能代码
    public class Filter1 implements Filter {
           public void doFilter(ServletRequest request, ServletResponse response,
           FilterChain chain) throws IOException, ServletException {
           System.out.println("before");
           chain.doFilter(request, response);
           System.out.println("after");
    }
    2)  web.xml 中配置  Filter 拦截的资源路径
    <filter>
       <filter-name>filter1</filter-name>
       <filter-class>cn.itcast.filter.Filter1</filter-class>
    </filter>
    <filter-mapping>
       <filter-name>filter1</filter-name>
       <url-pattern>/*</url-pattern>
    </filter-mapping>
  
Filter与Servlet:
     Filter就像一个加强版的Servlet,它具有servlet的所有功能,还多了个放行功能。
      Servlet在第一次使用时被加载,Filter在应用启动时被加载。
生命周期:
     Web容器启动时会读取web.xml文件,将所有的Filter初始化,此时filter的init方法会执行。
     当拦截到客户端请求时会执行doFilter方法。
     Filter对象创建后会驻留内存,当web应用移除或服务器停止时将被销毁。
获得初始化参数
  web.xml  文件中为  Filter  配置初始化参数
    <init-param>
       <param-name>name</param-name>
       <param-value>xxxx</param-value>
    </init-param>
       init  方法中读取配置文件
    public void init(FilterConfig filterConfig) throws ServletException {
       String name = filterConfig.getInitParameter("name");
       
    }
拦截html页面
     1)文件缓存
          由于html页面的url是没有在web.xml文件中配置的,所以服务器会调用tomcat的DefaultServlet,在DefaultServlet中会检查文件的修改时间,如果没有修改则发送304头,这样会导致过滤器也被缓存。
          解决办法:
               在放行前书写以下代码:
                    HttpServletResponse resp = (HttpServletResponse)response;
                    resp.setHeader("expires","-1");
                    resp.setHeader("praqma","no-cache");
                    resp.setHeader("cache-control","no-chache");
     2).Html页面乱码
          在filter和html页面中指定的编码为utf-8,这样会导致html乱码,原因是html页面数据是通过DefaultServlet发送,而DefaultServlet默认是使用的gbk编码。
          解决办法:
               修改tomcat下的web.xml文件,找到DefaultServlet的配置,加入初始化参数:
                    <init-param>
                         <param-name>fileEncoding</param-name>
                         <param-value>utf-8</param-value>
                    </init-param>
Filter配置:
        1).通过web.xml配置
               <filter>
                    <fileter-name>autoLogin</filter-name>
                    <filter-class>com.malongbo.filter.AutoLogin</filter-class>
               </filter>
               <filter-mapping>
                    <filter-name>autoLogin</filter-name>
                    <url-pattern>/*</filter-class>
               </filter-mapping>
          说明:
               filter-name:过滤器的名字
               filter-class:过滤器的类文件
               init-param:过滤器的初始化参数
                    param-name:参数名
                    param-value:参数值
               dispatcher:拦截方式
                    有四种方式:(缺省为REQUEST)
                         REQUEST:拦截直接的请求方式
                         INCLUDE:拦截页面包含的访问方式
                         FORWARD:拦截请求转发的访问方式
                         ERROR:拦截出错页面的访问方式
           2).通过Annotation进行配置(在Servlet3.0规范中)
              @WebServlet 主要属性列表
属性名类型描述
nameString指定 Servlet 的 name 属性,等价于 <servlet-name>。如果没有显式指定,则该 Servlet 的取值即为类的全限定名。
valueString[]该属性等价于 urlPatterns 属性。两个属性不能同时使用。
urlPatternsString[]指定一组 Servlet 的 URL 匹配模式。等价于 <url-pattern> 标签。
loadOnStartupint指定 Servlet 的加载顺序,等价于 <load-on-startup> 标签。
initParamsWebInitParam[]指定一组 Servlet 初始化参数,等价于 <init-param> 标签。
asyncSupportedboolean声明 Servlet 是否支持异步操作模式,等价于 <async-supported> 标签。
descriptionString该 Servlet 的描述信息,等价于 <description> 标签。
displayNameString该 Servlet 的显示名,通常配合工具使用,等价于 <display-name> 标签。

下面是一个简单的示例:

@WebServlet(urlPatterns = {"/simple"}, asyncSupported = true, 
loadOnStartup = -1, name = "SimpleServlet", displayName = "ss", 
initParams = {@WebInitParam(name = "username", value = "tom")} 
) 
public class SimpleServlet extends HttpServlet{ … } 
                    

过滤器Filter主要功能是:1、完成安全检查;2、重新格式化请求首部或体;3、建立请求审计或记录日志---请求过滤器Filter

1、压缩响应流;2、追加或者修改响应流;3、创建一个定制响应---响应过滤器Filter

转载于:https://my.oschina.net/mlongbo/blog/77182

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值