美文网首页
JavaEE-Servlet-Filter和Listener

JavaEE-Servlet-Filter和Listener

作者: lioilwin | 来源:发表于2017-08-26 21:25 被阅读45次

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

    相关文章

      网友评论

          本文标题:JavaEE-Servlet-Filter和Listener

          本文链接:https://www.haomeiwen.com/subject/jkpvdxtx.html