Fileter过滤器的使用及小案例

回顾:java

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的脚本web


Filter : 过滤器 : 至关于门卫服务器

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

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


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.注意:这种功能必须提示用户,只能在我的电脑上进行。session


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.动态代理app


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

 

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

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

相关文章
相关标签/搜索