JSP 过滤器和监听器

过滤器Filter

JSP中的过滤器是一个实现了javax.servlet.Filter接口的java类。用于拦截请求和响应,相对的可以对请求或者响应的内容作出修改。多个过滤器一起可组合成一个过滤链。

在这里插入图片描述

过滤器常见用途

身份验证过滤器(Authentication Filters)。
数据压缩过滤器(Data compression Filters)。
加密过滤器(Encryption Filters)。
触发资源访问事件过滤器。
图像转换过滤器(Image Conversion Filters)。
日志记录和审核过滤器(Logging and Auditing Filters)。
MIME-TYPE 链过滤器(MIME-TYPE Chain Filters)。
标记化过滤器(Tokenizing Filters)。
XSL/T 过滤器(XSL/T Filters),转换 XML 内容。

实现一个过滤器

public class MyFilter implements Filter {

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		System.out.println("filter...destory");
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		System.out.println("拦截请求");
		//放行请求和响应
		chain.doFilter(request, response);
		System.out.println("拦截响应");
		
	}

	@Override
	public void init(FilterConfig config) throws ServletException {
		System.out.println("filter...init");
	}

}

配置web.xml

方法与配置servlet类似:

<filter>
  	<filter-name>MyServlet</filter-name>
  	<filter-class>filter.MyFilter</filter-class>
  </filter>
  
  <filter-mapping>
  	<filter-name>MyServlet</filter-name>
  	<url-pattern>/*</url-pattern>
  	<dispatcher>FORWARD</dispatcher>  
  </filter-mapping>

映射中值为要拦截的请求路径,*通配符表示对所有路径的请求进行拦截。
<dispatcher>指定过滤器所拦截的资源被 Servlet 容器调用的方式,有四种值,默认为REQUEST:

  • REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用
  • FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
  • INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
  • ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。

过滤链

多个过滤器组成过滤链,web容器应用过滤器的先后顺序与在web.xml中<filter-maping> 的顺序有关

监听器

jsp中监听器用来监听 request 、session 、 application 三个对象
与过滤器一样,不同的监听器需要实现不同的接口
按功能分两种:

  • 监听对象的创建和销毁
    request :ServletRequestListener
    session:HttpSessionListener
    application:ServletContextListener
public class ContextSessionRequestListener implements ServletRequestListener,HttpSessionListener,ServletContextListener {

	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		System.out.println("监听ServletContext    销毁对象"+sce);
	}

	@Override
	public void contextInitialized(ServletContextEvent sce) {
		System.out.println("监听ServletContext   创建对象"+sce);
	}

	@Override
	public void sessionCreated(HttpSessionEvent se) {
		System.out.println("监听HttpSession   创建对象"+se);
	}

	@Override
	public void sessionDestroyed(HttpSessionEvent se) {
		System.out.println("监听HttpSession   销毁对象"+se);
	}

	@Override
	public void requestDestroyed(ServletRequestEvent sre) {
		System.out.println("监听ServletRequest    销毁对象"+sre);
	}

	@Override
	public void requestInitialized(ServletRequestEvent sre) {
		System.out.println("监听ServletRequest   创建对象"+sre);
	}

}
  • 监听对象中属性的变更
    request :ServletRequestAttributeListener
    session :HttpSessionAttributeListener
    application:ServletContextAttributeListener
    可通过getName和getAttribute方法获得属性名和属性值。
    每种对象对应三种方法,分别监听属性增加时,修改属性值时,移除属性时。
/**
 * 监听属性的变化
 * @author 1
 *
 */
public class AttributeListener implements ServletRequestAttributeListener,HttpSessionAttributeListener,ServletContextAttributeListener{

	@Override
	public void attributeAdded(ServletContextAttributeEvent event) {
		
	}

	@Override
	public void attributeRemoved(ServletContextAttributeEvent event) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void attributeReplaced(ServletContextAttributeEvent event) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void attributeAdded(HttpSessionBindingEvent event) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void attributeRemoved(HttpSessionBindingEvent event) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void attributeReplaced(HttpSessionBindingEvent event) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void attributeAdded(ServletRequestAttributeEvent srae) {
		// TODO Auto-generated method stub
		//获得增加的属性名和属性值
		String name = srae.getName();
		Object attribute = srae.getServletRequest().getAttribute(name);
		System.out.println("新增属性:name-"+name+" value-"+attribute);
	}

	@Override
	public void attributeRemoved(ServletRequestAttributeEvent srae) {
		// TODO Auto-generated method stub
		String name = srae.getName();
		System.out.println("移除属性"+name);
	}

	@Override
	public void attributeReplaced(ServletRequestAttributeEvent srae) {
		// TODO Auto-generated method stub
		//获得修改的属性名和属性值
		String name = srae.getName();
		Object attribute = srae.getServletRequest().getAttribute(name);
		System.out.println("修改后:name-"+name+" value-"+attribute);
	}

}
发布了20 篇原创文章 · 获赞 0 · 访问量 482

猜你喜欢

转载自blog.csdn.net/qq_43635212/article/details/104415937