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);
  1. 监听器 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;@Overridepublic void sessionCreated(HttpSessionEvent arg0) {application = arg0.getSession().getServletContext();sessionCount = (Integer)application.getAttribute("sessionCount");// 3.对 sessionCount进行非空判断,如果为空,表示当前的用户是第一个用户,则赋值1if(null == sessionCount) {sessionCount = 1;}else {sessionCount++;//否则就在原先人数基础上加1}// 4.把改变过后sessionCount保存到 application作用域里面application.setAttribute("sessionCount", sessionCount);}@Overridepublic void sessionDestroyed(HttpSessionEvent arg0) {application = arg0.getSession().getServletContext();sessionCount = (Integer)application.getAttribute("sessionCount");// 1.减少1人sessionCount-=2;// 2.把改变过后sessionCount保存到 application作用域里面application.setAttribute("sessionCount", sessionCount);}