servle的监听器和过滤器

版权声明:该版权归博主个人所有,在非商用的前提下可自由使用,转载请注明出处. https://blog.csdn.net/qq_24696571/article/details/89928627

过滤器

  • 对服务器的资源进行管理和过滤 , 例如在servlet中需要设置响应和请求的编码格式 , 如果每个servlet都要写一遍就会产生大量的代码冗余 . 这样的时候我们可以考虑使用过滤器 ,又例如敏感词汇过滤等 .
  • 过滤器进行过滤时 , 浏览器请求服务器时会被过滤 . 服务器收到请求响应浏览器时也会进行过滤 .
  • 过滤器使用的场景例如: 统一编码格式, 权限管理 , 资源管理(统一水印和和谐词汇等) , session管理(session失效时会创建新的sessionID,但无数据的情况 , 我们可以用过滤器判断session是否失效)

过滤器的使用

  • 实现Filter接口 , 并覆写接口的方法:
    • init: 服务器启动初始化
    • doFilter:过滤逻辑书写的方法 ;
    • destory:服务器关闭销毁
package com.credi;

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 MyFilter implements Filter{

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		System.out.println("过滤器初始化");
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		
	}

	@Override
	public void destroy() {
		System.out.println("过滤器销毁");
	}

}

  • web.xml配置过滤器
<filter>
 	<filter-name>filter</filter-name>
 	<filter-class>com.credi.MyFilter</filter-class>
 </filter>
 <filter-mapping>
 	<filter-name>filter</filter-name>
 	<url-pattern>/*</url-pattern><!--/*:拦截所有 ; *.do:拦截url以'.do'结尾的所有servlet ; /xxx : 针对某个具体的servlet-->
 </filter-mapping>
  • 编码格式和session管理的示例
package com.credi;

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.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class MyFilter implements Filter{

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		System.out.println("过滤器初始化");
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		//设置编码格式
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		
		//session管理
			//将ServletRequest对象转为HttpServletRequest , 然后获取session对象
			HttpSession session = ((HttpServletRequest)request).getSession();
			//判断session是否为空
			if(session.getAttribute("user")==null){
				//如果为空就重定向登陆页
				((HttpServletResponse)response).sendRedirect("/Project/Login.jsp");
			}else{
				//session没有过期就放行
				chain.doFilter(request, response);
			}
		
	}

	@Override
	public void destroy() {
		System.out.println("过滤器销毁");
	}

}

监听器

  • 监听器用于监听作用域对象属性的创建,改变和销毁
  • 监听对象:request , session , application

监听器的使用

  • 实现的接口和覆盖的方法
    在这里插入图片描述
  • web.xml配置
<!-- 监听器 -->
 <listener>
 	<listener-class>com.credi.MyListener</listener-class>
 </listener>
  • 监听器监听三大作用域对象的操作示例:
package com.credi;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.Locale;
import java.util.Map;

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;


public class MyListener implements ServletRequestListener,ServletRequestAttributeListener,HttpSessionListener,HttpSessionAttributeListener,ServletContextListener,ServletContextAttributeListener{

	// 1 . request作用域对象数据的监听
	//销毁
	@Override
	public void requestDestroyed(ServletRequestEvent sre) {
		System.out.println("request作用域对象销毁");
	}
	//创建
	@Override
	public void requestInitialized(ServletRequestEvent sre) {
		System.out.println("request作用域对象创建");
	}
	//添加
	@Override
	public void attributeAdded(ServletRequestAttributeEvent srae) {
		// .getName():添加数据的键 , .getValue():添加数据的值
		System.out.println(srae.getName()+srae.getValue());
	}
	//删除
	@Override
	public void attributeRemoved(ServletRequestAttributeEvent srae) {
		// .getName():删除数据的键 , .getValue():删除数据的值
		System.out.println(srae.getName()+srae.getValue());
	}
	//改变
	@Override
	public void attributeReplaced(ServletRequestAttributeEvent srae) {
		// .getName():改变的数据的键 , .getValue():改变的数据的值
	}
	
/*===================================================================================*/
	
	// 2. session作用域对象的监听
	//创建
	@Override
	public void sessionCreated(HttpSessionEvent se) {
		// TODO Auto-generated method stub
		
	}
	// 销毁
	@Override
	public void sessionDestroyed(HttpSessionEvent se) {
		// TODO Auto-generated method stub
		
	}
	// 添加
	@Override
	public void attributeAdded(HttpSessionBindingEvent se) {
		// TODO Auto-generated method stub
		
	}
	// 删除
	@Override
	public void attributeRemoved(HttpSessionBindingEvent se) {
		// TODO Auto-generated method stub
		
	}
	// 修改
	@Override
	public void attributeReplaced(HttpSessionBindingEvent se) {
		// TODO Auto-generated method stub
		
	}
	
/*===================================================================================*/
	
	// 3 . application(ServletContext)对象的监听
	// 创建
	@Override
	public void contextInitialized(ServletContextEvent sce) {
		// TODO Auto-generated method stub
		
	}
	// 销毁
	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		// TODO Auto-generated method stub
		
	}
	// 添加
	@Override
	public void attributeAdded(ServletContextAttributeEvent scae) {
		// TODO Auto-generated method stub
		
	}
	// 删除
	@Override
	public void attributeRemoved(ServletContextAttributeEvent scae) {
		// TODO Auto-generated method stub
		
	}
	// 修改
	@Override
	public void attributeReplaced(ServletContextAttributeEvent scae) {
		// TODO Auto-generated method stub
		
	}
	
}

  • 使用监听器统计在线人数:
package com.credi;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class Number implements ServletContextListener,HttpSessionListener{

	//服务器启动时在application作用域创建数据
	@Override
	public void contextInitialized(ServletContextEvent sce) {
		ServletContext servletContext = sce.getServletContext();
		servletContext.setAttribute("count", 0);
		System.out.println("服务器启动:"+servletContext.getAttribute("count"));
	}

	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		// TODO Auto-generated method stub
		
	}

	// 用户登陆,application的数据增加
	@Override
	public void sessionCreated(HttpSessionEvent se) {
		ServletContext servletContext = se.getSession().getServletContext();
	    int count = (int)servletContext.getAttribute("count");
	    servletContext.setAttribute("count", ++count);
	    System.out.println("有用户登陆:"+servletContext.getAttribute("count"));
	}

	// 用户销毁,application的数据自减
	@Override
	public void sessionDestroyed(HttpSessionEvent se) {
		ServletContext servletContext = se.getSession().getServletContext();
	    int count = (int)servletContext.getAttribute("count");
	    servletContext.setAttribute("count", --count);
		
	}

}

猜你喜欢

转载自blog.csdn.net/qq_24696571/article/details/89928627