过滤器
再JSP的web应用程序中,过滤器是一种在服务端运行的web组件程序,它可以截取客户端给服务器发的请求,也可以截取服务器给客户端的响应。
当web容器获得一个对资源的请求时,web容器判断是否存在过滤器和这个资源关联,如果有存在关联就把请求交给过滤器去除刘,在过滤器中可以对请求的内容作出改变,然后再将请求转交给被请求的资源。当被请求的资源作出响应时,我把容器同样会将响应先转发给过滤器,在过滤器中可以对响应作出处理然后再将响应发送给客户端。再这整个过程中客户端和目标资源是不知道过滤器的存在的。
需要注意的是再过滤器中不一定必须将请求发送给请求资源,也可以直接给客户端作出xiangying。
开发一个过滤器必须实现javax.servlet.Filter接口:
public class FirstFilter implements Filter{
public void init(FilterConfig arg0) throws ServletException{
}
public void destroy(){
}
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException,ServletException{
}
}
- 由web容器来调用init方法完成过滤器的初始化工作。
- 由web容器来调用destroy方法来释放资源。
- doFilter方法类似于Servlet中的service 方法,当客户端请求于此过滤器关联的目标对象时,就会调用过滤器的doFilter方法。在这个方法中利用FilterChain接口中的doFilter方法将请求交给下个过滤器来处理,如果该过滤器是过滤器链中的最后一个过滤器,则将请求交给被请求资源。也可以直接给客户端返回响应信息。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>javaweb_filter</display-name>
<filter>
<filter-name>logFiletr</filter-name>
<filter-class>com.java12.web.filter.LogFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>logFiletr</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
- <filter>节点描述该F莱特人对应的类是哪一个。
- <filter-mapping>中的<filter-name>必须和<filter>节点中的<filter-name>值相同,<url-pattern>指定该过滤器关联的URL样式,比如/*指的是对所有资源过滤,/admin/*指的是对admin目录下的所有资源进行过滤。
怎么来确定一个过滤器在过滤器链中的顺序呢?
这个根据过滤器在web.xml中配置的上下顺序来决定的。
监听器
监听器的作用是监听web应用程序中某一个对象,并根据应用程序的需求做出相应的处理,java web 应用程序中,servlet容器提供了多种监听器,常见的有:request对象的监听servletRequestAttributeListenter和ServletRequestListener、HttpSessionAttributeListener和HttpSessionListener、ServletContextAttributeListener和ServletContextListener。
首先来看下ServletContextListener,当一个雷实现了ServletContextListener接口,就可以监听ServletContext的创建与销毁工作。
public class ServletContextListenerImpl implements ServletContextListener{
public void contextDestroyed(ServletContextEvent arg0){ ①
System out println("ServletContext销毁了");
}
public void contextInitialized(ServletContextEvent arg0){ ②
System out println("ServletContext创建了");
}
}
① 当web容器关闭时,ServletContext被销毁会调用监听器的contextDestroyed方法。
② 当web容器启动时,ServletContext被创建会调用监听器的contextInitialized方法。
<listener>
<listener-class>
com.java.listener.ServletContextListenerImpl
</listener-class>
</listener>
HttpSessionListener接口则是监听Session的创建与销毁的。