日期:2014-05-19 浏览次数:20822 次
Servlet Filters(过滤器)
?
Servlet Filter(过滤器)用于从Servlet取得和更新request(请求)、response(响应)的内容和头信息,要注意的是Filter不创建response或者像servlets那样响应request 。认证、日志、数据压缩、加密是使用过滤器一些典型用途。 过滤器包装了一个servlet并作用于动态或静态内容。
过滤器可以与一个servlet或与一组servlets、或指定的URL的静态内容向关联。过滤器由注解@WebFilter所定义:
@WebFilter("/*") public class LoggingFilter implements javax.servlet.Filter { public void doFilter(HttpServletRequest request,HttpServletResponse response) { //. . . } }
? 代码表示,该Loggingfilter是适用于这个web程序所有的servlet和静态网页,这里@WebInitParam同样可用于指定初始化参数。一个过滤器和目标servlet总是在同一调用线程执行,多个过滤器可形成一个过滤器链。在部署描述符中一个过滤器由<filter>和<filtermapping>元素来定义:
<filter> <filter-name>LoggingFilter</filter-name> <filter-class>org.sample.LoggingFilter</filter-class> </filter> . . . <filter-mapping> <filter-name>LoggingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
? 除了使用@WebFilter和web.xml来配置过滤器,也可以用ServletContext.addFilter()方法来编程化定义,在ServletContainerInitializer.onStartup()方法或者ServletContextListener.contextInitialized()方法执行时来起作用,addFilter()方法返回一个ServletRegistration,动态的用来添加匹配URL映射、设置初始化参数和其他配置项:
@HandlesTypes(value = { HttpServlet.class })
public class MyInitializer implements ServletContainerInitializer {
public void onStartup(Set<Class<?>> clazz, ServletContext context) {
FilterRegistration.Dynamic reg = context.addServlet("LoggingFilter","org.example.LoggingFilter");
reg.addMappingForUrlPatterns(null, false, "/");
}
}
实现类需要添加一个HandlesTypes注解,这个注解有一个value值,这个值是一个Class数组,包含了你想要处理的类,容器会扫描出所有匹配这个数组里面的类型的类(包含实现,扩展或者被注解的类),然后将这种类型作为onStartup的第一个参数传入。
?
? Event Listeners(事件监听器)
?
事件监听器提供ServletContext、HttpSession、ServletRequest对象的生命周期回调事件,监听器类实现一个接口,支持这些对象的状态变化的事件通知,通过注解@WebListener、在web.xml中声明,或通过注册一个ServletContext.addListener()方法来申明,监听器是不需要程序员额外明确编程化注册,或在初始化和恢复一个数据库连接去编程化的声明的一个servlet。可能有多个监听器类同时监听每一个事件类型,容器调用监听器时他们可能按指定的顺序监听每一个事件类型,应用程序关闭时以相反的顺序通知监听器。
ServletContextListener监听容器的事件信息:
?
@WebListener public class MyContextListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { ServletContext context = sce.getServletContext(); //. . . } @Override public void contextDestroyed(ServletContextEvent sce) { //. . . } }
ServletContextAttributeListener监听上下文中属性的变化:
?
public class MyServletContextAttributeListener implements ServletContextAttributeListener { @Override public void attributeAdded(ServletContextAttributeEvent event) { //. . . event.getName(); //. . . event.getValue(); } @Override public void attributeRemoved(ServletContextAttributeEvent event) { //. . . } @Override public void attributeReplaced(ServletContextAttributeEvent event) { //. . . } }
HttpSessionListener监听Session创建或销毁事件:
?
@WebListener public class MySessionListener implements HttpSessionListener { @Override public void sessionCreated(HttpSessionEvent hse) {HttpSession session = hse.getSession(); //. . . } @Override public void sessionDestroyed(HttpSessionEvent hse) { //. . . } }
HttpSessionActivationListener用于监听Session钝化或激活事件:
?
public class MyHttpSessionActivationListener implements HttpSessionActivationListener { @Override public void sessionWillPassivate(HttpSessionEvent hse) { // ... hse.getSession(); } @Override public void sessionDidActivate(HttpSe