Servlet监听器和过滤器的快速使用和配置(基于注解配置)

2021-04-27 09:59:52 浏览数 (1)

HttpServlet拦截器的快速使用和配置

过滤器

过滤器是一种设计模式,主要用来封装Servlet中一些通用的代码。在web.xml中配置哪些URL对应哪些过滤器。

过滤器的优点:

  1. 过滤器是可插拔的。
  2. 一个过滤器不依赖于另一个资源。
  3. 维护少,比较容易维护。

Servlet过滤器方法

过滤器只是一个实现javax.servlet.Filter接口的Java类。javax.servlet.Filter接口定义了三种方法 -

编号

方法

描述

1

public void doFilter (ServletRequest, ServletResponse, FilterChain)

由于是在链末端的客户端请求,所以每当通过链路传递请求/响应对时,容器就会调用此方法。

2

public void init(FilterConfig filterConfig)

该方法由Web容器调用,向过滤器指示它正在投入使用。

3

public void destroy()

该方法由Web容器调用以向过滤器指示它正在停用服务。

监听器

监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。

监听器组件

监听器涉及三个组件:事件源,事件对象,事件监听器

当事件源发生某个动作的时候,它会调用事件监听器的方法,并在调用事件监听器方法的时候把事件对象传递进去。

我们在监听器中就可以通过事件对象获取得到事件源,从而对事件源进行操作!

servlet监听器

当某个事件发生时候,监听器里的方法会被调用。例如Tomcat容器启动时、销毁时,session创建时、销毁时。

servlet监听器的作用:

  1. Listener 的作用是用于监听 web应用的创建和销毁,以及在其上attribute发生的变化。 
  2. web应用即ServletContext对象(jsp的隐式对象application) 
  3. 除了对web应用的监听外,还能监听session和request的生命周期,以及他们的attribute发生的变化。
  4. Java事件监听器属性的新增、删除和修改划分成三种,分别针对于ServletContext、HttpSession、ServletRequest对象。

具体配置

以下是配置文件的所有截图,

过滤器和监听器是面向切面的编程思想的,

因此,可以直接在项目中快速地添加过滤器和监听器。

EncodingFilter.java

代码语言:javascript复制
package com.gxwz.filter;

import java.io.IOException;
 
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebFilter
public class EncodingFilter implements Filter {
 
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		System.out.println(this.toString() " 已初始化.....");
	}
	
    @Override
    public void doFilter(ServletRequest arg1, ServletResponse arg2, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) arg1;
        HttpServletResponse response = (HttpServletResponse) arg2;
        request.setCharacterEncoding("UTF-8");
        chain.doFilter(request, response);
    }
    
	@Override
	public void destroy() {
		System.out.println(this.toString() " 已销毁.....");
	}
 
}

FirstFilter

代码语言:javascript复制
package com.gxwz.filter;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebFilter (filterName="FirstFilter",value={"/*"})
public class FirstFilter implements Filter {

	@Override
	public void init(FilterConfig arg0) throws ServletException {
		System.out.println(this.toString() " 已初始化.....");
	}
	
	@Override
	public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
			throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) req;
		HttpServletResponse response = (HttpServletResponse) res;

		String ip = request.getRemoteAddr();
		String url = request.getRequestURL().toString();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date d = new Date();
		String date = sdf.format(d);

		System.out.printf("%s %s 访问了 %s%n", date, ip, url);
		chain.doFilter(request, response);
	}
	
	@Override
	public void destroy() {
		System.out.println(this.toString() " 已销毁.....");
	}

}

ContextAttributeListener

代码语言:javascript复制
package com.gxwz.listener;

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.annotation.WebListener;

@WebListener
public class ContextAttributeListener implements ServletContextAttributeListener {
 
    @Override
    public void attributeAdded(ServletContextAttributeEvent scae) {
        System.out.println("context 增加属性 ");
        System.out.println("context 属性是"   scae.getName());
        System.out.println("context 的值是"   scae.getValue());
    }
    @Override
    public void attributeRemoved(ServletContextAttributeEvent scae) {
        System.out.println("context 移除属性 ");
    }
    @Override
    public void attributeReplaced(ServletContextAttributeEvent scae) {
        System.out.println("context 替换属性");
    }
}

ContextListener.java

代码语言:javascript复制
package com.gxwz.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

@WebListener
public class ContextListener implements ServletContextListener {
//public class ContextListener extends ContextLoaderListener {
	
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("web 应用销毁  ");
    }
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("web 应用初始化 ");
 
    }
}

RequestAttributeListener.java

代码语言:javascript复制
package com.gxwz.listener;

import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.annotation.WebListener;

@WebListener
public class RequestAttributeListener implements ServletRequestAttributeListener{

    @Override
    public void attributeAdded(ServletRequestAttributeEvent srae) {
        System.out.println("request 增加属性 ");
        System.out.println("属性是"   srae.getName());
        //System.out.println("值是"   srae.getValue());
    }
    @Override
    public void attributeRemoved(ServletRequestAttributeEvent srae) {
        System.out.println("request 移除属性 ");
    }
    @Override
    public void attributeReplaced(ServletRequestAttributeEvent srae) {
        System.out.println("request 替换属性 ");
    }
}

RequestListener.java

代码语言:javascript复制
package com.gxwz.listener;

import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
 
@WebListener
public class RequestListener implements ServletRequestListener {
 
    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        System.out.println("销毁了一个Request ");
    }
    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        System.out.println("创建了一个Request ");
    }

}

SessionAttributeListener.java

代码语言:javascript复制
package com.gxwz.listener;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;

@WebListener
public class SessionAttributeListener implements HttpSessionAttributeListener {
 
    @Override
    public void attributeAdded(HttpSessionBindingEvent event) {
        System.out.println("session 增加属性 ");
        System.out.println("属性是"   event.getName());
        System.out.println("值是"   event.getValue());
    }
    @Override
    public void attributeRemoved(HttpSessionBindingEvent event) {
        System.out.println("session 移除属性 ");
    }
    @Override
    public void attributeReplaced(HttpSessionBindingEvent event) {
        System.out.println("session 替换属性 ");
    }
}

SessionListener.java

代码语言:javascript复制
package com.gxwz.listener;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

@WebListener
public class SessionListener implements HttpSessionListener {

	@Override
	public void sessionCreated(HttpSessionEvent se) {
		System.out.println("监听到 session 创建, sessionid 是: "   se.getSession().getId());
	}
	@Override
	public void sessionDestroyed(HttpSessionEvent se) {
		System.out.println("监听到 session 销毁, sessionid 是: "   se.getSession().getId());
	}

}

/**
 * 如果是第一次访问,都会触发session创建,后续访问不会触发session的创建
 * 关闭浏览器,再访问,也会触发session的创建。 但是有的浏览器,即便是关闭了,
 * 下一次打开,也会发送以前sessionid到服务器,这样服务器就不会创建新的session。 
 * session的销毁不易观察到,一般说来服务器会设置session存活时间为30分钟。
 * 所以需要等待才能观察到销毁
 * 注: 在重启tomcat测试之前, 要删除D:tomcatworkCatalinalocalhost_SESSIONS.ser 这个文件。 
 * 这个文件是tomcat存放以前的session的,为了观察到创建session的活动,
 * 需要tomcat重启之前把以前的session都清除掉,才能观察到新创建session的活动
 * @author com
 *
 */

0 人点赞