Servlet技术规范中的过滤器Filter

来源:互联网 发布:宜家的床 知乎 编辑:程序博客网 时间:2024/05/21 11:35

1.1过滤器概述

1.1.1什么是过滤器?

Servlet技术规范中, 定义了Servlet、Filter、Listener三门技术, 其中Filter也叫做过滤器,通过过滤器技术,开发人员可以实现用户在访问某个资源之前或之后,对访问的请求和响应进行拦截,从而做一些相关的处理。

  • 总结:
     所谓的过滤器, 就是拦截用户对资源的访问
    一个过滤器可以拦截多个资源, 一个资源也可以配置多个过滤器进行拦截
    其实所谓的拦截, 就是将代表请求的request对象和代表响

  • 应的response对象拦截下来,拦截下来后:
    (1)控制是否允许访问 – 用户登陆之后才能查看自己的页面
    (2)在访问资源之前或之后做一些处理 比如: 全站乱码解决

1.2开发过滤器

1.2.1开发过滤器的步骤

Servlet API中提供了一个Filter接口, 开发web应用时, 如果编写一个类实现了这个接口, 则这个类就是一个过滤器
(1)写一个类实现Filter接口, 并实现其中的方法
(2)在web应用的web.xml中配置过滤器

1.2.2Filter生命周期

当服务器启动时, web应用加载后会立即创建出当前web应用中的所有的Filter对象, 创建出来后, 立即调用init方法进行初始化出操作. 从此以后这个Filter对象一直驻留在内存中为后续所拦截的请求服务, 每次过滤到对资源的访问时, 都会执行doFilter这个方法进行拦截处理, 直到服务器关闭或者web应用移出容器为止, 随着web应用的销毁, 过滤器也跟着销毁, 在销毁之前会调用destroy方法执行善后的处理.

 <!-- 配置过滤器 --> <filter>    <filter-name>EcodongFilter</filter-name>    <filter-class>cn.tedu.filter.EncodingFilter</filter-class>  </filter>  <filter-mapping>    <filter-name>EcodongFilter</filter-name>    <!-- 第一种方式:指定该过滤器所拦截的规则     <url-pattern>/servlet/*</url-pattern>    <url-pattern>*.jsp</url-pattern>    -->    <!-- 第二种方式:指定该过滤器所拦截的规则 -->    <servlet-name>ServletDemo1</servlet-name>    <servlet-name>ServletDemo2</servlet-name>    <!-- 配置所拦截的请求类型,默认REQUEST(普通请求)        REQUEST:普通请求        FORWARD:所拦截的资源是通过请求转发访问的        INCLUDE:所拦截的资源是通过请求包含访问的        ERROR:对异常访问的拦截,如:访问A,A抛出了异常,请求将会访问一个友好错误提示页面B,对B的访问就是ERROR类型     -->    <dispatcher>REQUEST</dispatcher>  </filter-mapping>

1.3Filter中的方法介绍

1.3.1init方法

init(FilterConfig filterConfig)
init方法在Filter实例创建完成后立即执行,进行初始化的操作,其中FilterConfig是代表当前Filter在web.xml中配置信息的对象。

1.3.3destory方法

destroy方法在Filter实例销毁之前调用,进行善后的处理

1.3.2doFilter方法

doFilter(request, response, FilterChian filterChian)
其中参数FilterChian表示多个过滤器组成的过滤器链对象
一个web资源可以被多个过滤器所拦截, 多个过滤器拦截的顺序是按照Filter在web.xml中配置的的顺序执行的.这多个过滤器按照拦截的顺序就组成了一个拦截器链, 用FilterChian表示.

如果一个过滤器处理完所拦截的请求后, 想要执行后面的拦截器, 则可以调用FilterChian上doFilter方法, 表示放行过滤器, 接着执行下一个节点,如果下一个节点仍然是过滤器, 则接着进行过滤, 执行的过程同上,如果没有后续的过滤器, 则执行真正的资源处理这次请求。

2.2.2MD5加密算法介绍

数据摘要算法、数据指纹算法

- 特点:

任意长度的二进制数, 经过MD5加密计算后, 都可以得到一个128位长的二进制密文
相同的原文经过加密后得到的密文永远相同
不同的原文经过加密后得到的密文永远不同
只能从原文加密成密文, 密文永远也解不回原文
MD5加密算法在很多应用场景下都有所应用

2.2.3MD5应用:

  • 可以根据自己的需要创建工具类, 提供md5方法实现MD5加密功能(代码片段如下,可以复制走直接使用)
public static String md5(String plainText) {    byte[] secretBytes = null;    try {        secretBytes = MessageDigest.getInstance("md5").digest(                plainText.getBytes());    } catch (NoSuchAlgorithmException e) {        throw new RuntimeException("没有md5这个算法!");    }    String md5code = new BigInteger(1, secretBytes).toString(16);    for (int i = 0; i < 32 - md5code.length(); i++) {        md5code = "0" + md5code;    }    return md5code;}
  • 使用场景例如:
    1.登陆时, 密码应该先加密再和数据库中的密码做比较
    2.注册时, 密码应该先加密再存入数据库
    3.实现自动登陆时, 在将用户名和密码保存进Cookie之前, 需要将密码加密后再保存进Cookie
原创粉丝点击