1.过滤器
1.1 简介
过滤器是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器
对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改。也可以对响应进行过滤,拦截或修改响应。
S2阶段使用过滤器主要进行页面编码设置和登录状态验证。
1.2 使用
1.2.1 使用监听器步骤
创建过滤器包filter,创建普通java类并实现Filter接口;
重写destroy(销毁)、doFilter(执行/处理)、init(初始化),
1.2.2 作用如下:
init方法,初始化Filter,Filter在服务器启动阶段被实例化,并且调用init方法,init方法只执行一次,因为Filter只被实例化一次。
destory方法,销毁Filter,释放内存,在web服务正常停止时调用此方法。或者项目重新部署,或者服务器重新启动的时候,会销毁所
有的Filter对象,销毁之前会先调用Filter对象的destroy方法,完成销毁前的准备工作,也是只执行一次。
doFilter方法里面编写过滤器要执行的逻辑代码(重点)。
1.3 案例
设置编码&登录验证
// 1.设置编码
HttpServletRequest req = (HttpServletRequest)arg0;
HttpServletResponse resp = (HttpServletResponse)arg1;
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
// 2.登录状态验证
HttpSession session = req.getSession();
PrintWriter out = resp.getWriter();
// 2.1访问登录和注册页面的请求不被过滤
// 获取请求地址
String path = req.getRequestURI();
if(path.indexOf("login.jsp") > -1 || path.indexOf("loginServlet.do") > -1) {
// 放行(警察放行),让请求继续访问。
arg2.doFilter(arg0, arg1);
return;
}
// 2.2过滤其它请求
String uname = (String)session.getAttribute("uname");
if(null == uname) {
out.print("<script>alert('请先登录!');location.href='login.jsp'</script>");
// return;// 返回,后面的代码都不执行。
}
// 放行(警察放行),让请求继续访问。
arg2.doFilter(arg0, arg1);
2. 监听器
2.1 简介
监听器介绍.
一个实现特定接口的普通java程序,而这个java程序专门用于监听另一个java对象的方法调用或属性的改变,当被监听对象发生上述事件
后,监听的某个方法将立即被执行。
监听器分类:按照监听的对象不同可分为HttpReauest域,HttpSession域和
2.2 分类
ServletContext域。如:
ServletContextListener监听器,此监听器主要用来监听ServletContextListener的创建与销毁即服务器的创建与销毁
HttpSessioinListener监听器,此监听器用来监听Session的创建与销毁;
ServletRequestListener监听器,此监听器用来监听每一次请求调用请求创建时的方法,当请求结束时,调用销毁的方法。
2.3 案例
记录登录人数
// 1.获取application作用域(统计在线人数的值保存在该作用域里面)
ServletContext application;
// 2.从 application作用域里面获取在线人数
Integer sessionCount;
@Override
public void sessionCreated(HttpSessionEvent arg0) {
application = arg0.getSession().getServletContext();
sessionCount = (Integer)application.getAttribute("sessionCount");
// 3.对 sessionCount进行非空判断,如果为空,表示当前的用户是第一个用户,则赋值1
if(null == sessionCount) {
sessionCount = 1;
}else {
sessionCount++;//否则就在原先人数基础上加1
}
// 4.把改变过后sessionCount保存到 application作用域里面
application.setAttribute("sessionCount", sessionCount);
}
@Override
public void sessionDestroyed(HttpSessionEvent arg0) {
application = arg0.getSession().getServletContext();
sessionCount = (Integer)application.getAttribute("sessionCount");
// 1.减少1人
sessionCount-=2;
// 2.把改变过后sessionCount保存到 application作用域里面
application.setAttribute("sessionCount", sessionCount);
}