过滤器监听器

本文详细介绍了Servlet中的过滤器(Filter)和监听器(Listener)的使用方法及原理。过滤器用于对用户请求和服务器响应进行预处理和后处理,而监听器则用于监控web应用程序中的特定事件,如ServletContext、HttpSession和ServletRequest的创建和销毁。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

过滤器监听器

一.过滤器

   Filter 即为过滤,用于在 Servlet 之外对 Request 或者 Response 进行修改。它主要用于对用户请求进行预处理,也可以对 HttpServletResponse 进行后处理。

   使用 Filter 的完整流程:Filter 对用户请求进行预处理,接着将请求交给 Servlet 进行处理并生成响应,最后 Filter 再 对服务器响应进行后处理。在一个 web 应用中, 可以开发编写多个 Filter,这些 Filter 组合 起来称之为一个 Filter 链。

若是一个过滤器链:先配置先执行(请求时的执行顺序);响应时: 以相反的 顺序执行。

  在 HttpServletRequest 到达 Servlet 之前,拦截客户的 HttpServletRequest 。 根据需要检查 HttpServletRequest,也可以修改 HttpServletRequest 头和数据。

  在 HttpServletResponse 到达客户端之前,拦截 HttpServletResponse。根据 需要检查 HttpServletResponse,也可以修改 HttpServletResponse 头和数据。

1.实现流程:

  1、创建普通java类

  2、实现javax.servlet.Filter的接口,并实现对应的方法

  3、配置web.xml

  doFilter()

    处理请求

    chain.doFilter()才能放行资源;

    写在前面的是处理请求数据,写在后面是处理响应数据

public class Filter01 implements Filter {
	/**
	 * 初始化...
	 */
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		System.out.println("init01 ....");		
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		System.out.println("Filter01...");
		
		// 处理请求的数据
		
		// 放行
		chain.doFilter(request, response);
		
		// 处理处理响应的数据
		System.out.println("Filter01  end...");		
	}

	@Override
	public void destroy() {
		System.out.println("destory01.....");		
	}
}
2.url-pattern 的配置:

  ①配置具体路径/index.html/TestServlet.do

  ②带有通配符的配置*.do /* /user/* *.html *.jsp

<filter>
    <filter-name>Filter01</filter-name><!--用于为过滤器指定一个名字,该元素的内容不能为空-->
    <filter-class>com.xxx.filter.Filter01</filter-class><!--用于指定过滤器的完整的限定类名-->
</filter>
<filter-mapping><!--用于设置一个filter所负责拦截的资源-->
    <filter-name>Filter01</filter-name>
    <url-pattern>/*</url-pattern><!--设置filter所拦截的请求路径(过滤器关联的URL样式)-->
</filter-mapping>

二.监听器

1.介绍:

  web 监听器是一种 Servlet 中的特殊的类,它们能帮助开发者监听 web 中 的特定事件, 比如ServletContext, HttpSession,ServletRequest 的创建和销毁;变 量的创建、销毁和修改等。 可以在某些动作前后增加处理,实现监控。例如可 以用来统计在线人数等。

2.实现:

  1)、创建普通Java类,实现指定监听接口,实现对应的方法

  2)、在web.xml配置该监听器

step1、创建一个类,并实现 HttpSessionListener 接口,用来检测 Session 的创建和 销毁。 在类中定义一个成员变量用来存储当前的 session 个数。

/**
 * 在线人数统计
 * 	有session被创建,人数加1
 * 	有session被销毁,人数减1
 */

//实现HttpSessionListener接口
public class OnlineListener implements HttpSessionListener {
	//定义一个成员变量用来存储当前的 session 个数
    private Integer onlineNumber = 0; // 默认在线人数

    public OnlineListener() {
    }

	/**
	 * session对象创建时触发
	 *有session被创建,人数加1
	 */
    public void sessionCreated(HttpSessionEvent se)  { 
    	onlineNumber++;
    	// 将人数存到application作用域中,因为application域范围是整个web项目(统计访问人数等)
    	se.getSession().getServletContext().setAttribute("onlineNumber", onlineNumber);
    }

	/**
	 * session对象销毁时触发
	 *有session被销毁,人数减1
	 */
    public void sessionDestroyed(HttpSessionEvent se)  { 
    	onlineNumber--;
    	// 将人数存到application作用域中
    	se.getSession().getServletContext().setAttribute("onlineNumber", onlineNumber);
    }	
}

step2、在 web.xml 中配置该监听器,让监听器生效

<listener>
    <listener-class>com.shsxt.listener.OnlineListener</listener-class>
</listener>

step3、做一个测试的 Servlet 用来登录,和显示当前在线人数

public class OnlineServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//  创建session域对象,使监听器触发
		HttpSession session = request.getSession();
		// 得到存在application域对象中的在线人数
		Integer onlineNumer = (Integer) getServletContext().getAttribute("onlineNumber");
		// 得到输出流,写出到浏览器,并设置登出链接
		response.setContentType("text/html;charset=UTF-8");
		response.getWriter().write("<h3>在线人数:"+onlineNumer+"</h3><h4><a href='logoutServlet'>退出</a></h4>");
		response.getWriter().close();
		
		// ip--------request.getRemoteAddr()
		System.out.println("在线人数:"+onlineNumer+",当前IP:" + request.getRemoteAddr());		
	}
}

step4、做一个测试的 Servlet 用来登出

public class LogoutServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 用户退出,销毁session,使监听器触发
		request.getSession().invalidate();
		// 得到输出流,写出到浏览器,并设置登录链接
		response.setContentType("text/html;charset=UTF-8");
		response.getWriter().write("<h4><a href='online'>登录</a></h4>");
		response.getWriter().close();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值