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