JavaEE-Servlet-Filter和Listener

2017-08-26  本文已影响45人  lioilwin

一.过滤器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

上一篇下一篇

猜你喜欢

热点阅读