Fileter过滤器的使用及小案例

回顾:

EL:表达式语言,替代<%= %>
${表达式}
表达式中的数据除了常量必须来自于域中
取得域中数据 : pageScope/requestScope/sessionScope/applicationScope
param/paramValues/header/headerVlaues/pageContext/cookie/initParam
empty:判空
数值:0
对象:null
字符串:" "
集合: 长度是否为0
在EL表达式中不区分单引号和双引号,只要有引号,就算字符串
JSTL:JSP标准标签库:开发的一些有java语言实现的标签.主要是用一些自定的标签来实现页面中的程序的流程控制(分支.循环)

如何使用JSTL:
导包 : jstl.jar standard.jar
在页面引入:<%@ taglib uri=" " prefix=" " %>
常用标签
< c:if test="结果为布尔值的表达式" >没有ELSE.
<c:forEach>
var:遍历的当前对象(保存在page域的)
items:被遍历的集合(EL表达式)
------------------------------------------------
var:循环控制变量
begin:起始值
end:结束值(闭区间)
step:步长
--------------------------------------------------
varStatus:封装了当前循环的状态的对象
index:索引,从0开始
count:计数.从1开始
first:当前是否是第一次
last:当前是否是最后一次
在JSP开发中使用JSTL和EL来替代之前所学的所有JSP的脚本


Filter : 过滤器 : 相当于门卫

功能:决定请求是否通过过滤器到达原本要访问的目标
权限控制
预处理和后处理
如何开发一个过滤器:(增强型的servlet)
创建一个类,实现javax.servlet.Filter
在web.xml中配置注册

过滤器的生命周期:(单例)
创建:服务器启动
销毁:服务器关闭(正常关闭才会调用destroy方法)


3.案例一:自动登录:
3.1.需求分析:在访问网站的首页时,可以实现自动登录(不用输入用户名和密码,直接进入“已登录”状态)。在访问一个网站时,右上角“登录、注册”超链接,如果点登录,转跳到登录页面。登录成功后回到首页,右上角显示“用户姓名”等信息,代表当前用户是“已登录”状态。
3.2.技术分析:
3.2.1.如何区分当前的状态是已登录还是未登录?把用户信息保存到Session域,域中有用户信息说明已登录,没有则说明未登录。
3.2.2.(在之前的某次登录中勾选了“自动登录”,之后再次访问首页时)在请求到达IndexServlet之前,就已经进入“已登录”状态,登录的工作只能在请求到达Servlet之前进行,所以只能是过滤器的预处理。也就是说要在过滤器的预处理中进行调用业务逻辑登录验证的工作。也就是说,需要把用户名和密码在某个地方保存一段时间(一周),断电不消失,所以只能使用Cookie。
3.2.3.
3.3.步骤分析:
3.3.1.正确的登录过程
3.3.2.业务逻辑在进行登录的验证的时候,不能再返回布尔值。所以改为返回用户对象(User),如果用户名密码正确,则说明登录成功,则返回用户对象(用于保存到Session的),如果登录失败,则返回null。
3.3.3.如果登录成功,且勾选了自动登录,则把用户名和密码保存到Cookie中。并设置有效期为一周。
3.3.4.Servlet中如果登录成功,则把用户对象保存到Session中,名为current_user。返回首页
3.3.5.JSP的页面中,右上角去Session中取得用户对象,如果得到说明当前是已登录状态,则显示用户的姓名。否则显示“登录、注册”超链接
3.3.6.创建一个过滤器(专门进行自动登录),从Cookie中取出用户名和密码,调用业务逻辑进行登录验证,如果登录成功,则把用户对象保存到Session,名为current_user。然后放行。如果登录失败,直接放行。
3.4.注意:这种功能必须提示用户,只能在个人电脑上进行。


4.案例二:统一解决中文乱码问题
4.1.需求分析:以前在写代码时,每个Servlet都要处理中文问题(请求的、响应的),现在可以使用过滤器,对所有Servlet都进行统一的预处理来解决中文乱码问题。
4.2.技术分析:
4.2.1.用过滤器过滤所有请求,对请求和响应的字符集进行设置。
4.2.2.所以要解决GET方式的乱码问题,只能想办法增强request对象的getParameter方法,让方法中对原值进行重新编码
4.2.3.然后再把增强后的request对象放行过去。这样,Servlet接收到的就是增强后的Request对象,这时在Servlet中
4.2.4.调用getParameter方法时,调用的就是增强后的方法,在方法内进行了重新编码 ,就能得到正确结果了。
4.2.5.如何增强一类的方法:
4.2.5.1.继承:必须知道实现类才能继承,只知道接口是无法继承的
4.2.5.2.装饰者模式
4.2.5.2.1.实现和被增强类一样的接口
4.2.5.2.2.持有被增强类的对象(为了能够调用原始方法)
4.2.5.3.动态代理


4.3.步骤分析:
4.3.1.创建一个过滤器,在过滤器放行前,设置请求和响应的字符集。

总结:
Filter : 过滤器
如何开发一个过滤器:
创建一个类实现javax.servlet.Filter接口
在web.xml中配置注册Filter(方式和servlet类似,注意:url-pattern匹配上的所有请求都要经过此过滤器)

过滤器的生命周期:
创建:项目启动
销毁:项目关闭(只有正常关闭才会调用destroy方法)
运行期间:Filter是单例的
运行顺序:
按照web.xml配置文件的顺序依次运行Filter的预处理
请求到达目标处理完成后,在逆序依次运行Filter的后处理.
功能:可以对请求和响应进行预处理,后处理,放行操作(不放行).
作用:
权限控制
预处理(字符集,自动登录)和后处理(页面静态化,响应内的压缩).

原文地址:https://www.cnblogs.com/jia-/p/7381268.html