本文主要是介绍(4)Filter 和 Listen,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Filter
1.简介:
1.过滤器主要是对用户的请求的web资源(包括网页,图片.Servlet….)做一个过滤.已经对服务器的响应拦截过滤后再发给客户端.
2.当 Web 容器启动 Web 应用程序时,它会为您在部署描述符中声明的每一个过滤器创建一个实例.也就是说: 当web应用跑起来的时候过滤器已经实例化.
3.该过滤器执行的顺序是按它们在部署描述符中声明的顺序。(节点的配置顺序)
2.Filter使用步骤:
- 1.新建一个过滤器类实现 javax.servlet.Filter接口.
- 2.在web.xml 中手动配置该filter,类似配置Servlet.
过滤器常用的url路径: /* *.jsp
根据规范建议的各种类型的过滤器:
身份验证过滤器(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 内容。
常用功能:
- 设置编码
- md5加密
多重过滤器的配置顺序:
过滤器的应用顺序(先进先配置的过滤器)更改映射顺序就可以了.(先配置节点的映射先过滤)
3.具体codeDemo:
- web.xml中配置filter:
<!-- 配置过滤器: 配置多个filter时先配置先dofilter,顺序是根据filter-mapping的配置顺序 --><filter><filter-name>FilterAll</filter-name><filter-class>cn.com.yves.filter.FilterAll</filter-class><init-param><!-- 配置该filter的初始化参数 --><param-name>filterParameter</param-name><param-value>this filter's value</param-value></init-param></filter><filter-mapping><filter-name>FilterAll</filter-name><url-pattern>/*</url-pattern><dispatcher>REQUEST</dispatcher><!-- 配置哪些请求要进过滤器;不配置dispatcher标签默认是request请求进过滤. --><dispatcher>FORWARD</dispatcher><!-- 这个例子里面配了两个dispatcher,也就是这两种请求会进过滤器:浏览器的的请求和通过request的forward转发的请求会进过滤器 --></filter-mapping><filter><filter-name>FilterAll2</filter-name><filter-class>cn.com.yves.filter.FilterAll2</filter-class><init-param><!-- 配置该filter的初始化参数 --><param-name>requestEncoding</param-name><param-value>UTF-8</param-value></init-param><init-param><!-- 配置该filter的初始化参数 --><param-name>responseEncoding</param-name><param-value>text/html;charset=UTF-8</param-value></init-param></filter><filter-mapping><filter-name>FilterAll2</filter-name><url-pattern>/*</url-pattern></filter-mapping>
- 对javax.servlet.Filter接口的实现
(1)实现javax.servlet.Filter接口的第一个filter类
package cn.com.yves.filter;import java.io.IOException;
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.http.HttpServletRequest;//servlet filter listener加载顺序与它们在 web.xml 文件中的先后顺序无关。
//最终加载顺序为: listener -> filter -> servlet
//但是某类配置节而言,与它们出现的顺序有关,比如: filter 与filter-mapping 配置节出现的顺序来依次调用 doFilter()方法的,其他类似.
/*** 当web容器启动的时候,就会自动调用init(FilterConfig arg0)来对filter进行初始化* * 当关闭web容器,关机,或者reload整个应用时 ,都会调用destroy()来关闭filter。* * 也就是说,当web容器启动时,filter就被加载到内存,并在destroy()调用之前都常驻内存。* * 总之:servlet filter listener 都是单例的,就是说在运行时只存在一个实例。* * @author Yves He* */
public class FilterAll implements Filter {// 网站浏览次数,所有的请求都算一次浏览 包括ajax局部刷新 和 错误我访问路径.private int countView;public void init(FilterConfig filterConfig) throws ServletException {/** 过滤器初始化时,* 容器自动调用该方法*/System.out.println("过滤器初始化!");String pValue = filterConfig.getInitParameter("filterParameter"); // 获取初始化参数,获取在web.xml中该filter配置的初始化参数countView = 0;}/*** 对满足该filter条件的请求,每访问一次都会先进入该方法后在进Servlet*/public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException { /* 在这里做过滤器要做的业务 */// 注意: 如果能确保项目是基于http协议的可以将ServletRequest 强转成// HttpServletRequest类访问实例的方法;ServletResponse类推((HttpServletRequest) request).getRequestURI();System.out.println("过滤器在doFilter");System.out.println("访问次数:" + ++countView);String ipAddress = request.getRemoteAddr(); // 获取客户端ip地址System.out.println("IP " + ipAddress + ", Time "+ new Date().toString()); // 输出ip地址及当前时间// 传递请求到过滤器链,继续下一个过滤器,如果后面没有过滤器了就会 去请求web资源chain.doFilter(request, response);}public void destroy() { /* 在Filter实例在服务器上被移除前调用。 */System.out.println("过滤器 销毁了!");}
}
(2)实现javax.servlet.Filter接口的第二个filter类
package cn.com.yves.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;/*** 第二个do Filter* * @author Yves He* */
public class FilterAll2 implements Filter {/** 获取配置在改filter中的初始化参数 :分析:由于该接口总共就三个方法* ,this.方法名是不能获取初始化参数的;* 初始化参数在FilterConfig对象中*/private FilterConfig filterConfig;// 用来获取配置信息public void destroy() {}public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {String requestEncoding = this.filterConfig.getInitParameter("requestEncoding");// 获取配置在改filter中的init-name为requestEncoding的参数String responseEncoding = this.filterConfig.getInitParameter("responseEncoding");// 获取配置在改filter中的init-param的参数request.setCharacterEncoding(requestEncoding);response.setContentType(responseEncoding);chain.doFilter(request, response); // 传递请求到过滤器链,继续下一个过滤器}public void init(FilterConfig filterConfig) throws ServletException {this.filterConfig = filterConfig;}
}
Listen
1.简介
应用场景:
对效率要求不高的情况下(因为使用监听器,在web.xml中配置监听类的路径,实质也就是为了给虚拟机做反射用,这样效率很慢)
分类:
三大类:application(代码里是servletContext);session;request
注意: pageContext的生命周期太短了,所有没有监听器。
使用规则:
- 写一个类实现某个监听类,覆盖其中方法.(那些方法在满足调用条件的时候,会被java虚拟机通过回调的方式回调这些方法)
- 在web.xml中配置该监听类. (大部分要在web.xml中配置改监听类,但是也有少部分只有第一步,不需要配置了)
2.Listen具体代码
(1)application监听:
- ApplicationListen
/** * Filename: ApplicationListener.java * Copyright: Copyright (c)2016 * Company: Yves * @version: 1.0 * Create at: 2016-11-20 下午4:16:39 * Description: ** Author Yves He */
package cn.com.yves.listen.application;import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;/*** 调用机制:* * Web容器加载项目时执行contextInitialized方法,应用程序被容器销毁是执行contextDestroyed方法。* 暂时可以理解为启动和关闭容器.* * @author Yves He* */
public class ApplicationListener implements ServletContextListener {public void contextDestroyed(ServletContextEvent arg0) {// 销毁时}public void contextInitialized(ServletContextEvent arg0) {// 加载项目时//ServletContext context = arg0.getServletContext();//context.getInitParameter("param-name");//根据web.xml中<context-param>配置的参数获取值}}
- ApplicationtAttributeListener
/** * Filename: ApplicationtAttributeListener.java * Copyright: Copyright (c)2016 * Company: Yves * @version: 1.0 * Create at: 2016-11-20 下午4:19:05 * Description: ** Author Yves He */
package cn.com.yves.listen.application;import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;/*** 调用机制:* * application.setAttribute(“userName”,”tom”); 第一次setAttribute* * application.setAttribute(“userName”,”tom”); 已经存在时setAttribute* * application.removeAttribute(“userName”);从application中移除时(也就是从servletContext中)* * @author Yves He* */
public class ApplicationtAttributeListener implementsServletContextAttributeListener {public void attributeAdded(ServletContextAttributeEvent arg0) {}public void attributeRemoved(ServletContextAttributeEvent arg0) {}public void attributeReplaced(ServletContextAttributeEvent arg0) {}}
(2)session监听
所有接口:
- ServletRequestAttributeListener
- ServletRequestListener
具体类似Application的操作.
(3)request监听
所有接口:
- HttpSessionActivationListener
- HttpSessionAttributeListener
- HttpSessionBindingListener
- HttpSessionListener
具体类似Application的操作.
这篇关于(4)Filter 和 Listen的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!