欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JavaEE-Servlet-Filter和Listener

程序员文章站 2022-06-23 18:39:35
...

一.过滤器Filter

对指定的web资源进行拦截,实现一些特殊功能,如实现URL权限访问、过滤敏感词等等

1).注册过滤器

方式一
    在WEB-INF/web.xml注册
    <filter>
        <filter-name>filter</filter-name>
        <filter-class>com.xxx.xxFilter</filter-class>
        <init-param>
            <param-name>name1</param-name>
            <param-value>value1</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>filter</filter-name>       
        <url-pattern>/*</url-pattern> 指定要拦截的url
        <servlet-name>xxxServlet</servlet-name> 指定要拦截的Servlet
        <dispatcher>REQUEST</dispatcher> 指定要拦截资源的访问方式是REQUEST/FORWARD/INCLUDE/ERROR,默认REQUEST
    </filter-mapping>

方式二
    在com.xxx.xxFilter类添加注解
    @WebFilter(filterName="filter",urlPatterns={"/*"},servletNames={"Demo1Servlet"})

2).实现接口

创建: web应用加载时,创建所有过滤器对象,调用init()初始化,一直驻留内存;
销毁: web应用移除时,销毁所有过滤器对象,销毁前调用destroy()善后 
public class xxFilter implements Filter {
    public void destroy() {     
    }

    // 每次拦截资源后调用
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        FilterChain过滤器链对象,一个资源可能被多个过滤器所拦截,拦截顺序是web.xml中filter-mapping配置顺序
        FilterChain.doFilter()一旦被调用,就执行过滤器链的下一个节点,若当前是最后过滤器,则执行目标资源
    }

    public void init(FilterConfig filterConfig) throws ServletException {
        filterConfig.getInitParameter(String name) 获取web.xml过滤器配置信息
        filterConfig.getServletContext() 获取ServletContext对象
    }
}

二.监听器Listener

Servlet监听器: 监听ServletContext、Session和Request域的变化。

1.监听三大作用域的创建和销毁

1)注册监听器
    方式一
    在WEB-INF/web.xml注册
    <listener>
        <listener-class>com.xxx.xxx</listener-class>
    </listener>
    
    方式二
    在com.xxx.xxx类添加注解@WebListener

2)实现监听器接口
    public class xxx implements ServletContextListener {            
        // ServletContext创建: web应用被加载时创建
        public void contextDestroyed(ServletContextEvent sce) {         
        }
        
        // ServletContext销毁: web应用被移除时销毁
        public void contextInitialized(ServletContextEvent sce) {           
        }           
    }
    应用场景: 保存全局对象,如:创建数据库连接池; 加载框架配置文件;实现任务调度定时器

    public class xxx implements HttpSessionListener {
        // Session创建:首次调用request.getSession()时创建
        public void sessionCreated(HttpSessionEvent se) {
        }
        
        // Session销毁:超30分钟没用时销毁 /调用invalidate()销毁 
        // 服务器非正常关闭时销毁(正常关闭则被钝化,再次开启则被活化)
        public void sessionDestroyed(HttpSessionEvent se) {
        }
    }
    
    public class xxx implements ServletRequestListener {
        // Request创建:浏览器请求开始时创建     
        public void requestDestroyed(ServletRequestEvent sre) {         
        }
        
        // Request销毁:浏览器请求结束时销毁
        public void requestInitialized(ServletRequestEvent sre) {       
        }
    }

2.监听三大作用域属性的增删改

public class xxx implements ServletContextAttributeListener {
    public void attributeAdded(ServletContextAttributeEvent scab) {
        System.out.println("属性加入"+scab.getName()+":"+scab.getValue());
    }

    public void attributeRemoved(ServletContextAttributeEvent scab) {
        System.out.println("属性移除"+scab.getName()+":"+scab.getValue());
    }

    public void attributeReplaced(ServletContextAttributeEvent scab) {
        System.out.println("属性替换"+scab.getName()+":"+scab.getValue()+
        ":"+scab.getServletContext().getAttribute(scab.getName()));
    }
}

public class xxx implements HttpSessionAttributeListener {
    public void attributeAdded(HttpSessionBindingEvent se) {
    }

    public void attributeRemoved(HttpSessionBindingEvent se) {
    }

    public void attributeReplaced(HttpSessionBindingEvent se) {
    }
}

public class xxx implements ServletRequestAttributeListener {
    public void attributeAdded(ServletRequestAttributeEvent srae) {
    }
    public void attributeRemoved(ServletRequestAttributeEvent srae) {
    }
    public void attributeReplaced(ServletRequestAttributeEvent srae) {
    }
}

3.监听JavaBean对象在Session域中的变化

public class JavaBean类 implements HttpSessionBindingListener ,HttpSessionActivationListener{
    ...
    // javabean对象被绑到session
    public void valueBound(HttpSessionBindingEvent event) {         
    }
    
    // javabean对象被移出session
    public void valueUnbound(HttpSessionBindingEvent event) {           
    }
    
    // javabean对象随session活化
    public void sessionDidActivate(HttpSessionEvent se) {
    }

    // javabean对象随session钝化
    public void sessionWillPassivate(HttpSessionEvent se) {
    }
}

简书: http://www.jianshu.com/p/46e5b3bf42d7
CSDN博客: http://blog.csdn.net/qq_32115439/article/details/54791009
GitHub博客:http://lioil.win/2017/01/30/Servlet-Listener.html
Coding博客:http://c.lioil.win/2017/01/30/Servlet-Listener.html