过滤器(Filter)
过滤器是JavaWeb三大组件之一(servlet,filter,listener),它与Servlet很相似!不过servlet是用来处理请求,而过滤器是用来过滤请求的。拥有对目标资源的请求和响应进行截取的功能。
功能:处理程序的公共部分,例如:全站编码
过滤器实现方式
其实过滤器与Servlet很相似,具体如下:
- 实现Filter接口,重写里面抽象方法
- 配置web.xml配置文件
步骤一
创建类,实现Filter接口,重新里面的三个方法
public class AFilter implements Filter {
public void destroy() {
System.out.println("销毁过滤器");
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("处理过滤器...");
chain.doFilter(request, response);
}
public void init(FilterConfig fConfig) throws ServletException {
System.out.println("初始化过滤器");
}
}
步骤二
配置web.xml,类似servlet
<filter>
<filter-name>AFilter</filter-name>
<filter-class>com.hzit.filter.AFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AFilter</filter-name>
<!-- 需要过滤的路径 该路径表示拦截所有请求 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
生命周期
从上面代码可以看出,继承Filter接口之后实现三个方法,和servlet生命周期类似:
- 实例化对象
- 初始化,调用init()
- 处理方式,调用doFilter()
- 销毁,调用destroy()
注意:doFilter(ServletRequest,ServletResponse)方法,如果不调用FilterChain的doFilter()方法,那么目标资源将无法执行;
同时配置多个过滤器
可以为一个请求,配置多个过滤器,其中顺序按照web.xml配置的顺序进行加载
案例
- 统一处理全站乱码;
- 验证页面是否登录;
- 如果登录了正常访问,
- 如果没有登录跳转到登录界面。
1.判断登录的依据,判断session里面是否包含了用户信息
2.如果包含证明登录成功,否则没有登录,
监听器
用来监听域对象的创建销毁以及域对象属性的操作;
在JavaWeb被监听的事件源为:ServletContext(application)、HttpSession、ServletRequest,即三大域对象。
总共八个监听器,监听域对象相关的操作
监听器的对象和方法的调用都是由服务器自己调用,不能手动参与。
ServletContextListener监听器
用来监听ServletContext域对象的创建和销毁的监听器。
创建:在服务器启动的时候,为每个web应用创建单独的ServletContext 对象
销毁:在服务器关闭的时候,或者项目从web服务器中移除的时候。
**在web.xml中去配置:如下代码即可绑定监听器
<listener>
<listener-class>com...ApplicationAttrListener</listener-class>
</listener>
代码演示:
package com.listener.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class ApplicationAttrListener implements ServletContextListener{
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext对象被销毁了。。");
}
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext对象被创建了。。");
}
}
用途:
加载框架的配置文件。例如:Spring框架提供了一个核心监听器 ContextLoaderListener。<br />定时任务调度,例如过生日给你发祝贺邮件<br />
HttpSessionListener监听器
监听HttpSession对象的创建和销毁。
- 创建:服务器端第一次调用getSession()方法时候。
- 销毁:非正常关闭服务器 (正常关闭服务器session会被序列化)。点击terminate(强制关机)就会销毁,但是看不见销毁信息
Session过期(默认过期时间30分钟)。
手动调用session.invalidate()方法。
**web.xml配置方式同上
代码演示:
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MyHttpSessionListener implements HttpSessionListener{
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("HttpSession对象被创建了。。");
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("HttpSession对象被销毁了。。");
}
}
ServletRequestListener监听器
用户监听ServletRequest 对象的创建和销毁
- 创建: 从客户端向服务器发送一次请求, 服务器就会创建request对象。
销毁: 服务器对这次请求作出了响应之后,request 对象就销毁了。
web.xml配置方式同上
代码如下:
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
public class MyServletRequestListener implements ServletRequestListener{
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("ServletRequest对象被销毁了。。。");
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("ServletRequest对象被创建了。。。");
}
}
案例:统计当前在线人数
思路:
- 当服务器启动的时候需要有一个初始值为0
- 当浏览器访问服务端创建sessionl,获得初始值并+1
- 当session销毁初值就减-1.