Java中的过滤器和监听器

过滤器


一个过滤器能够附加到一个或者多个Servlet上,一个Servlet能够附加一个或者多个Filter。一个过滤器必须实现javax.servlet.Filter接口并实现其中的三个方法。html

  • init()方法:java

    这个方法在实例化过滤器时被调用,主要用于使过滤器为处理作准备。容器为这个方法传递一个FilterConfig对象,其中包含配置信息。web

  • doFilter():bash

    这个方法用于处理请求和相应。它接受3个输入参数:ServletRequestServletReponseFilterChain对象。FilterChain对于正确的过滤操做相当重要。doFilter()方法必须调用FilterChaindoFilter()方法,除非该方法用来拦截之后的下游处理session

  • destroy():app

    该方法由容器在销毁过滤器实例以前调用。jsp

    package com.tz.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;
    public class EncodingFilter implements Filter{
    	String encoding = null;
    	FilterConfig config = null;
    	@Override
    	public void destroy() {
    		// TODO Auto-generated method stub
    		this.config=null;
    		this.encoding=null;
    	}
    	@Override
    	public void doFilter(ServletRequest request, ServletResponse response,
    			FilterChain chain) throws IOException, ServletException {
    		// TODO Auto-generated method stub
    		if(encoding!=null){
    			//对请求进行编码设置
    			request.setCharacterEncoding(encoding);
    		}
    		chain.doFilter(request, response);
    	}
    	@Override
    	public void init(FilterConfig config) throws ServletException {
    		// TODO Auto-generated method stub
    		this.config = config;
    		this.encoding = config.getInitParameter("encoding");
    	}
    	
    }
    复制代码

    web.xml配置:ide

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    		 xmlns="http://java.sun.com/xml/ns/javaee" 
    		 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    		 					 id="WebApp_ID" version="3.0">
      <display-name>test</display-name>
      <filter>
      	<filter-name>encodingFilter</filter-name>
      	<filter-class>com.tz.filter.EncodingFilter</filter-class>
      	<init-param>
      		<param-name>encoding</param-name>
      		<param-value>utf-8</param-value>
      	</init-param>
      </filter>
      <filter-mapping>
      	<filter-name>encodingFilter</filter-name>
      	<url-pattern>/*</url-pattern>
      </filter-mapping>
      
      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
    </web-app>
    复制代码

    Jsp文件:post

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <!DOCTYPE HTML>
    <html>
      <head>
        <title>编码过滤器测试</title>
    	<meta http-equiv="content-type" content="text/html;charset=utf-8">
      </head>
      
      <body>
        <form action="process.jsp" name="form1" method="post">
        	姓名:<input type="text" name="userName" />
        	<input type="submit" value="提交" name="submit">
        </form>
      </body>
    </html>
    复制代码

    process.jsp:测试

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <!DOCTYPE HTML>
    <html>
      <head>
        <title>编码过滤器测试</title>
    	<meta http-equiv="content-type" content="text/html;charset=utf-8">
      </head>
      
      <body>
        <p><%=request.getParameter("userName") %>,你好!</p>
        <%=request.getCharacterEncoding() %>
      </body>
    </html>
    复制代码

监听器


在定义监听器类时,只须要实现相应的监听器接口便可。如实现了 ServletContextListenerServletContextAttributeListener的类就能够监听到ServletContext对象的生命周期变化状况和ServletContext对象中属性的变化状况。实现了HttpSessionListenerHttpServletAttributeListener接口的类就能够监听到HttpSession对象的生命周期变化和HttpSession对象中的属性变化。

package com.tz.listener;

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class ContextListenerTest implements ServletContextListener,ServletContextAttributeListener{

	//当应用被移除到容器时触发
	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
		System.out.println("监听到应用被移除。。。。。。");
	}

	//当应用在容器中启动时触发
	@Override
	public void contextInitialized(ServletContextEvent arg0) {
		System.out.println("监听到应用被启动。。。。。。");
	}

	//ServletContext中新增属性时执行此方法
	@Override
	public void attributeAdded(ServletContextAttributeEvent event) {
		System.out.println("监听到新增了一个叫"+event.getName()+"的属性!");
	}

	@Override
	public void attributeRemoved(ServletContextAttributeEvent arg0) {
		System.out.println("removed......");
	}

	@Override
	public void attributeReplaced(ServletContextAttributeEvent arg0) {
		System.out.println("replaced......");
	}

}
复制代码
package com.tz.listener;

import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class SessionListenerTest implements HttpSessionListener,HttpSessionAttributeListener{
	
	//在线人数统计
	int count = 0;
	
	//当产生一个新的HttpSession对象时(新用户上线)执行此方法
	@Override
	public void sessionCreated(HttpSessionEvent event) {
		event.getSession().getServletContext().setAttribute("count",++count);
		System.out.println("监听到新用户"+event.getSession().getId()+"上线了!");
	}
	
	//当一个HttpSession销毁(用户下线)时执行此方法
	@Override
	public void sessionDestroyed(HttpSessionEvent event) {
		event.getSession().getServletContext().setAttribute("count",--count);
		System.out.println("监听到新用户"+event.getSession().getId()+"下线了!");
	}
	
	@Override
	public void attributeAdded(HttpSessionBindingEvent event) {
		System.out.println("监听到"+ event.getName()+"属性新增了,属性值是"+event.getValue());
	}

	@Override
	public void attributeRemoved(HttpSessionBindingEvent event) {
		// TODO Auto-generated method stub
		System.out.println("监听到"+ event.getName()+"属性被删除了");
		
	}

	@Override
	public void attributeReplaced(HttpSessionBindingEvent event) {
		// TODO Auto-generated method stub
		System.out.println("监听到"+ event.getName()+"属性被修改了");
		
	}
	

}
复制代码

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
		 xmlns="http://java.sun.com/xml/ns/javaee" 
		 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
		 					 id="WebApp_ID" version="3.0">
  <display-name>test</display-name>
  
  <listener>
  	<listener-class>com.tz.listener.ContextListenerTest</listener-class>
  </listener>
  
  <listener>
  	<listener-class>com.tz.listener.SessionListenerTest</listener-class>
  </listener>
  
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>
复制代码

jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<html>
  <head>
    <title>编码过滤器测试</title>
	<meta http-equiv="content-type" content="text/html;charset=utf-8">
  </head>
  
  <body>
    
    <h2>Listener应用实例测试</h2>
    <%
    	application.setAttribute("admin", "liubin");
    	application.setAttribute("admin", "xiaohuang");
    	application.removeAttribute("admin");
    	session.setAttribute("now", new Date());
    	session.setAttribute("now", "2016-05-09");
    	session.removeAttribute("now");
     %>
            目前在线人数:<%=application.getAttribute("count") %>人!
     <a href="logout.jsp" style="list-style: none">注销</a>
  </body>
</html>
复制代码

logout.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<html>
  <head>
    <title>Listener应用实例</title>
	<meta http-equiv="content-type" content="utf-8">
  </head>
  
  <body>
  	<h2>Listener应用实例</h2>
    <%
    	//销毁session对象
    	session.invalidate();
     %>
     	恭喜你注销成功!目前在线人数:<%=application.getAttribute("count") %>
  </body>
</html>
复制代码
相关文章
相关标签/搜索