目录
1.过滤器/拦截器-Filter.
1.1过滤器介绍.
1.2过滤器使用步骤.
1.2.1创建过滤器.
1.2.2映射配置.
1.3案例1-编码设置.
1.4案例2-登陆状态验证.
1.4过滤链-略带.
2.监听器-Listener.
2.1监听器介绍.
2.2案例演示1-统计在线人数.
2.3案例演示2-统计历史在线人数.
1.过滤器/拦截器-Filter.
1.1过滤器介绍.
-
过滤器是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改。也可以对响应进行过滤,拦截或修改响应。
-
S2阶段使用过滤器主要进行页面编码设置和登录状态验证。
1.2过滤器使用步骤.
1.2.1创建过滤器.
-
创建过滤器包filter,创建普通java类并实现Filter接口;
-
重写destroy(销毁)、doFilter(执行/处理)、init(初始化),作用如下:
-
init方法,初始化Filter,Filter在服务器启动阶段被实例化。并且调用init方法,init方法只执行一次,因为Filter只被实例化一次。
-
destory方法,销毁Filter,释放内存,在web服务正常停止时调用此方法。或者项目重新部署,或者服务器重新启动的时候,会销毁所有的Filter对象,销毁之前会先调用Filter对象的destroy方法,完成销毁前的准备工作,也是只执行一次。
-
doFilter方法里面编写过滤器要执行的逻辑代码(重点)。
-
-
如下所示:
1.2.2映射配置.
-
web.xml方式:
-
注解方式:
-
@WebFilter("/*");
-
@WebFilter("/home/*");
-
@WebFilter("*.do");
-
1.3案例1-编码设置.
-
代码如下:
1.4案例2-登陆状态验证.
-
效果:没有登陆则不能访问项目的某些页面,比如:购物车页面、订单页面、所有servlet文件等。
-
哪些页面不需要被登陆就可以访问?登陆前后端jsp页面以及对应的servlet文件;
-
实现代码:
-
注,getWrite()方法如果执行两次及以上程序会报500错,当过滤资源过多的时候,过滤器里面的代码会被执行多次,所以不建议在过滤器里面调用 getWrite()方法获取 PrintWriter对象。因此在过滤器里面跳转到登陆页面通过:response.sendRedirect(request.getContextPath()+"/admin/login.jsp");
-
思考,如果在同一个过滤器里面实现前端的登陆状态验证,该如何处理?
1.4过滤链-略带.
-
在一个Web应用程序中,可以部署多个过滤器进行拦截,这些过滤器组成了一个过滤器链。过滤器链中的每个过滤器负责特定的操作和任务,客户端的请求在这些过滤器之间传递。具体执行流程如下:
2.监听器-Listener.
2.1监听器介绍.
-
一个实现特定接口的普通java程序,而这个java程序专门用于监听另一个java对象的方法调用或属性的改变,当被监听对象发生上述事件后,监听的某个方法将立即被执行。常用于监听Web应用中某些对象的创建、销毁、增加、修改、删除等动作的发生,然后作出相应的响应处理。当监听范围的对象的状态发生变化的时候,服务器自动调用监听器对象中的方法。常用于统计网站在线人数、系统加载时进行信息初始化、统计网站的访问量等等。
-
监听器分类:按照监听的对象不同可分为HttpRequest域,HttpSession域和ServletContext域。如:
-
ServletContextListener监听器,此监听器主要用来监听ServletContextListener的创建与销毁即服务器的创建与销毁;
-
HttpSessioinListener监听器,此监听器用来监听Session的创建与销毁;
-
HttpSessionAttributeListener 是SessionAttribute的监听,当在会话对象中加入属性、移除属性或替换属性时,就会调用HttpSessionAttributeListener监听器。
-
ServletRequestListener监听器,此监听器用来监听每一次请求调用请求创建时的方法,当请求结束时,调用销毁的方法。
-
2.2案例演示1-统计在线人数.
-
思路分析:
-
每当有一个访问连接到服务器时,服务器就会创建一个 session来管理会话;
-
那么就可以通过统计 session的数量来获得当前在线人数。所以这里用到的监听器是 HttpSessionListener;
-
-
创建 Java类 OnLineCountListener 实现 HttpSessionListner接口,并添加监听器注解:@WebListener。代码如下:
-
jsp页面:<h1>在线人数:${sessionCount} </h1>
-
注,
-
因为同一类型浏览器不管打开多少个会话,都是共享一个sessoin(无痕模式和非无痕模式不共享)。所以要打开不同类型浏览器访问项目(google/IE/Edge)进行测试。
-
关闭浏览器人数不会减少,必须以注销 session的方式退出才能实现人数减少。
-
-
注销功能:
退出按钮:
<a href="loginOut.jsp">
<h2>退出</h2>
</a>
loginOut.jsp:
<%session.invalidate();%>
<h3>您已退出本系统</h3>
2.3案例演示2-统计历史在线人数.
-
该功能的实现思路:在用户退出的时候不减少人数。其实就是注释掉统计在线人数案例里面销毁方法-sessionDestroyed的代码。