Listener监听器和Filter过滤器
一.监听器
1.是javaweb的三大组件之一,分别是Servlet程序,Listener监听器,Filter过滤器
2.Listener是JvaEE的规范,就是接口,监听器的作用就是监听某种变化(一般是对象创建/销毁,属性变化),触发对应方法完成相应的任务
3.ServletContextListener:
/*当一个类实现了ServletContextListener,该类就是一个监听器
* 该类可以监听的事件由该类实现的接口决定,比如下面该类就能监听ServletContext对象的创建和销毁
* 当web应用启动时,就会产生ServletContextEvent事件,会调用监听器的对应事件处理方法contextInitialized
* 同时会传递事件对象,程序员通过ServletContextEvent事件对象来获取需要的信息,然后处理业务
* tomcat怎么知道这个监听器存在? 因为需要在web.xml文件中配置*/
public class HspServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
ServletContext servletContext = servletContextEvent.getServletContext();
System.out.println("该监听器监听到"+servletContext+"被创建");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
ServletContext servletContext = servletContextEvent.getServletContext();
System.out.println("该监听器监听到"+servletContext+"被销毁");
}
}
4.ServletContextAttributeListener
ServletContextAttributeListener用于监听ServletContext的属性变化
public class HspServletContextAttributeListener implements ServletContextAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("HspServletContextAttributeListener监听到添加属性"+servletContextAttributeEvent.getName()+"" +
"="+servletContextAttributeEvent.getValue());
}
@Override
public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("HspServletContextAttributeListener监听到删除属性"+servletContextAttributeEvent.getName()+"" +
"="+servletContextAttributeEvent.getValue());
}
@Override
public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("HspServletContextAttributeListener监听到替换属性"+servletContextAttributeEvent.getName()+"" +
"="+servletContextAttributeEvent.getValue());
}
}
5.HttpSessionListener
HttpSessionListener即生命周期监听,用于监听用户的上线或者离线
public class HspServletSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
HttpSession session = httpSessionEvent.getSession();
session.setMaxInactiveInterval(20);//设置session生命周期
System.out.println("HspServletSessionListener监听到了session的创建id为"+session.getId());
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
HttpSession session = httpSessionEvent.getSession();
System.out.println("HspServletSessionListener监听到了session的销毁:"+session.getId());
}
}
6.HttpSessionAttributeListener 用于监听session属性的变化
7.ServletRequestListener监听器用于监听Request创建或者销毁,即Request生命周期监听,也是监控某个ip访问网站的频率,记录访问日志
8.ServletRequestAttributeListener监听器用于监听request属性变化
二.过滤器
1.过滤器是JavaEE的规范,是接口.作用是拦截请求,过滤响应基本原理如下
请求转发方式不会经过过滤器
当客户端发送一个请求到 Tomcat 服务器时,请求会先经过 Filter 的 doFilter 方法进行预处理。在 doFilter 方法中,可以对请求进行修改,如设置字符编码、验证用户权限等。然后调用 FilterChain 的 doFilter 方法将请求传递给下一个 Filter 或 Servlet 进行处理。当 Servlet 处理完请求并生成响应后,响应会再次经过 Filter 的 doFilter 方法进行后处理,最后返回给客户端。
public class ManageFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//当Tomcat创建Filter实例后,就会调用filter的无参构造器,调用该nint方法进行初始化.
System.out.println( "ManageFilter init方法被调用");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//当每次调用该filter时,就会调用该方法
System.out.println("doFilter被调用");
//继续访问目标资源,在调用过滤器前,servletRequest对象=request已经被创建并且封装
//所以就可以通过servletRequest获取很多信息,比如访问url,session
//获取session
HttpSession session = ((HttpServletRequest) servletRequest).getSession();
if(session.getAttribute("username")!=null){
//下面这个语句相当于放行
filterChain.doFilter(servletRequest,servletResponse);
}else {//没有登陆过,回到登录页面\
servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
}
}
@Override
public void destroy() {
//每次销毁filter时,就会调用该方法
System.out.println("ManageFilter被销毁");
}
}
2.Filter生命周期
当Tomcat创建Filter实例(只会创建一个,并且常驻内存)后,就会调用filter的无参构造器,调用该nint方法进行初始化.同时tomcat创建一个FilterConfig对象同时通过init方法传入
当一个http请求和该filter的url-patter匹配时,就会调用doFilter方法,同时会创建servletRequest,servletResponse,filterChain,通过doFilter传入,后面的请求资源若使用到requst和response,则是同一个会继续传递使用.停止web工程,销毁Filter就是调用destory
3.FilterConfig
FilterConfig是Filter过滤器的配置类,Tomcat每次创建Filter的时候,也会创建一个FilteConfig对象,这里包含了filter配置文件的配置信息
!--配置的参数,由程序员自己设计-->
<init-param>
<param-name>ip</param-name>
<param-value>127.0</param-value>
</init-param>
<init-param>
<param-name>port</param-name>
<param-value>8888</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>HspFilterConfig</filter-name>
<url-pattern>/abc/*</url-pattern>
</filter-mapping>
public class HspFilterConfig implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//通过filterConfig获取相关的参数
//获取filter的名字,ip
String filterName = filterConfig.getFilterName();
String ip = filterConfig.getInitParameter("ip");
ServletContext servletContext = filterConfig.getServletContext();
//可以获取到该Filter所有的配置参数名
Enumeration<String> initParameterNames = filterConfig.getInitParameterNames();
//遍历枚举
while(initParameterNames.hasMoreElements()){
System.out.println("名字是:"+initParameterNames.hasMoreElements());
}
System.out.println("fileName="+filterName);
System.out.println("ip="+ip);
System.out.println("servletContext="+servletContext)
}
}
4.过滤器链
流程图:
注意事项: