zoukankan      html  css  js  c++  java
  • JAVA Web基础4-过滤器与监听器

    一.过滤器
    1.定义:过滤器是指定义在服务器端的一段程序, 可以截获客户端发来的请求, 并根据一定规则进行过滤和拦截。
    2.过滤器的生命周期:
            1.服务器启动:先通过web.xml加载过滤器进行实例化(这个过程是调用过滤器中init()方法, 同样也是只执行一次);
            2.客户端发送请求:执行过滤器中的doFilter()方法, 这个方法会执行N次, 每次有请求发送过来, 都会执行这个方法进行过滤;
            3.销毁过程:同servlet, 关闭或者停止服务器的时候会执行destroy()方法;
    3.过滤器链:
            不同的请求互不影响,过滤器链主要是针对多个过滤器过滤同一个url请求,过滤器的先后顺序是按照在web.xml的配置顺序来的;
            运行顺序: 请求--->过滤器1过滤--->过滤器2过滤--->后台处理层--->过滤器2过滤--->过滤器1过滤--->客户端接收
    4.在web.xml中配置过滤器:

    <filter>
    	<filter-name>Myfilter</filter-name>
    	<filter-class>com.hanqi.filter.Myfilter</filter-class>
    </filter>
    <filter-mapping>
    	<filter-name>Myfilter</filter-name>
    	<url-pattern>/Testfilter</url-pattern><!-- 指哪些请求可以被过滤 -->
    </filter-mapping>
    

     5.过滤器应用示例:检测当前用户是否有效。

    package com.hanqi.filter;
    
    import java.io.IOException;
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.annotation.WebInitParam;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    @WebFilter(value = "/*", initParams = { @WebInitParam(name = "page", value = "Login,Register,index,.js") })
    public class SessionFilter implements Filter {
    	private String[] page;
    	//构造方法
    	public SessionFilter() {
    		
    	}
    	//销毁方法,以便释放资源
    	public void destroy() {
    		
    	}
    
    	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    			throws IOException, ServletException {
    		HttpServletRequest request1 = (HttpServletRequest) request;//HttpServletRequest是ServletRequest的子类,可以强转获得request
    		HttpServletResponse response1 = (HttpServletResponse) response;
    		String url = request1.getRequestURI();//获取请求路径
    		if (checkUrl(url)) {
    			chain.doFilter(request1, response1);//对请求进行放行
    		} else {
    			Object o = request1.getSession().getAttribute("currentUser");
    			if (o == null) {
    				request.setAttribute("errmsg", "用户名已失效!");
    				request.getRequestDispatcher("/WEB-INF/page/login.jsp").forward(request, response);
    			} else {
    				chain.doFilter(request1, response1);
    			}
    		}
    
    	}
    	//过滤器初始化时会调用该方法
    	public void init(FilterConfig fConfig) throws ServletException {
    		String pages = fConfig.getInitParameter("page");//获取初始化参数值
    		this.page = pages.split(",");
    		System.out.println(pages);
    	}
    
    	public boolean checkUrl(String url) {
    		for (String p : page) {
    			if (url.contains(p)) {
    				return true;
    			}
    		}
    		return false;
    	}
    }
    

    6.关于注解:
    在新版本(从Web2.5开始)中可以使用注解代替在web.xml中配置对象。
    格式:@注解("属性值"),其等同于@注解(属性="属性值")例:@WebFilter("/*")或@WebFilter(value="/*")
    带参数的格式:@WebFilter(filterName="Myfilter",value="/*",initParams= {@WebInitParam(name="",value="")})
    注意:value和urlPatterns都可以用来声明过滤的请求, 也同样都可以使用数组的形式定义, 但是这两个属性不能同时使用, 否则会报java.lang.IllegalArgumentException异常而无法启动Tomcat服务器;

    二.监听器
    1.定义:是指运行在服务器端的程序, 主要用于监听request, application, session这三个对象, 比如这三个对象的创建和销毁, 修改属性(setAttribute)等一系列的操作。
    2.方法:监听器中有8个Listener接口和6个Event类,常用的有6个接口,共15个方法,分别对应application,session,request这三个对象中的创建,属性添加、替换、移除与销毁。
    3.在web.xml中配置监听器

     <listener>
          <listener-class>com.hanqi.listener.Mylistener</listener-class>
      </listener>
    

    4.注解:@WebListener
    5.使用监听器统计在线访问人数示例:

    package com.hanqi.listener;
    
    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    import javax.servlet.annotation.WebListener;
    import javax.servlet.http.HttpSessionEvent;
    import javax.servlet.http.HttpSessionListener;
    
    
    @WebListener
    public class Mylistener implements ServletContextListener, HttpSessionListener {
    
      
        public Mylistener() {
           
        }
    
        public void sessionCreated(HttpSessionEvent se)  { 
             Object o = se.getSession().getServletContext().getAttribute("count");//通过HttpSession获取application
             int i = (Integer)o;
             i++;//每当新用户访问该页面数量加1
             se.getSession().getServletContext().setAttribute("count",i);
        }
    
        public void sessionDestroyed(HttpSessionEvent se)  { 
        	Object o = se.getSession().getServletContext().getAttribute("count");
            int i = (Integer)o;
            i--;//用户关闭网页数量减1
            if(i < 0) {
            	i = 0;
            }
            se.getSession().getServletContext().setAttribute("count",i);
        }
    
        public void contextDestroyed(ServletContextEvent sce)  { 
            
        }
    
        public void contextInitialized(ServletContextEvent sce)  { 
             sce.getServletContext().setAttribute("count", 0);//先初始化用户数量为0
        }
    	
    }
    
  • 相关阅读:
    前端职场的那些事情
    PS中的图像知识
    HTML5学堂,感谢您一年的陪伴(上)
    浏览器与HTML5的相辅相成
    当学习前端过程中心态发生了变化
    前端入门相关工具
    初学HTML5、初入前端
    前端开发工程师的发展方向
    关于元素水平垂直居中的那些事?
    便捷的前端开发工具
  • 原文地址:https://www.cnblogs.com/wyc1991/p/9194252.html
Copyright © 2011-2022 走看看