关于Filter和Listener

Filter

Filter(过滤器)就像是哨卡,用户请求需要经过Filter,并且可以有多个过滤器

关于Filter和Listener

编写一个简单的Filter

public class FirstFilter implements Filter {
 
    @Override
    public void destroy() {
    	/**销毁时调用*/
    }
 
    @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 init(FilterConfig arg0) throws ServletException {
 
    }
 
}
<!--web.xml文件中进行filter的配置-->
<filter>
    <filter-name>FirstFilter</filter-name>
    <filter-class>filter.FirstFilter</filter-class>
</filter>
 
<filter-mapping>
    <filter-name>FirstFilter</filter-name>
    <!--表示所有的访问都会过滤-->
    <url-pattern>/*</url-pattern>
    <!--表示只过滤jsp-->
    <!--<url-pattern>*.jsp</url-pattern>-->
</filter-mapping>

启动tomca过程中出现

严重: Context [] startup failed due to previous errors

常常用于提示Filter启动失败了

Listener

Listener 的作用是用于监听 web应用的创建和销毁,以及在其上attribute发生的变化。

1.监听Context

web应用即ServletContext对象(jsp的隐式对象application)

除了对web应用的监听外,还能监听session和request的生命周期,以及他们的attribute发生的变化。

public class ContextListener implements ServletContextListener {
    
    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        System.out.println("web 应用销毁  ");
    }
    
    /*在启动tomcat以及当前web应用重载的时候可以观察到
    web应用的自动重载需要蟹盖server.xml中<context>配置的属性reloadable="true",
    tomcat在运行状态下会监视class文件的改动,若改动服务器会自动重新加载Web应用。*/
    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        System.out.println("web 应用初始化 ");
    }
}
public class ContextAttributeListener implements ServletContextAttributeListener {
 
    @Override
    public void attributeAdded(ServletContextAttributeEvent e) {
        System.out.println("增加属性 ");
        System.out.println("属性是" + e.getName());
        System.out.println("值是" + e.getValue());
 
    }
 
    @Override
    public void attributeRemoved(ServletContextAttributeEvent e) {
        // TODO Auto-generated method stub
        System.out.println("移除属性 ");
    }
 
    @Override
    public void attributeReplaced(ServletContextAttributeEvent e) {
        // TODO Auto-generated method stub
        System.out.println("替换属性");
    }
 
}
<!--web.xml-->
<listener>
    <listener-class>listener.ContextListener</listener-class>
</listener>
<listener>
    <listener-class>listener.ContextAttributeListener</listener-class>
</listener>

2.监听Session

实现接口 HttpSessionListener

sessionCreated()表示session创建的时候执行

sessionDestroyed()表示session销毁的时候执行

实现接口 HttpSessionListener

sessionCreated()表示session创建的时候执行

sessionDestroyed()表示session销毁的时候执行

3.监听Request

实现接口 ServletRequestListener和ServletRequestAttributeListener

equestInitialized()当新创建了一个Request的时候触发,只要访问了服务端的资源,就会创建一个Request,无论是jsp,servlet还是html

requestDestroyed()当本次请求结束的时候触发

attributeAdded当有新增属性时触发

attributeReplaced当有替换属性时触发

attributeRemoved当有移除属性时触发

上一篇:Java Web基础


下一篇:Filter和Listener-学习笔记02【Filter细节】