JavaWeb——Filter与Listener笔记

 

javaWeb的三大组件:Servlet、Filter和Listener

 

过滤器

介绍

  • 过滤器(Filter)也称为拦截器,它是Servlet技术中非常实用的技术,
  • Web开发人员通过Filter技术,可以在用户访问某个Web资源(JSP、Servlet、HTML、图片、CSS等)之前,对访问的请求和响应进行拦截,从而实现一些特殊功能。
  • 例如:验证用户访问权限、记录用户操作、对请求进行重新编码、压缩响应信息等。

运行原理

  • 当用户的请求到达指定的网页之前,可以借助过滤器来改变这些请求的内容,此过程也称为“预处理”;
  • 当执行结果要响应到用户之前,可经过过滤器修改响应输出的内容,此过程称为“后处理”。
  • 运行过程
    • Web容器判断接收的请求资源是否有与之匹配的过滤器,如果有,容器将请求交给相应过滤器进行处理;
    • 在过滤器预处理过程中,可以改变请求的内容,或者重新设置请求的报头信息,然后将请求发给目标资源;
    • 目标资源对请求进行处理后作出响应;
    • 容器将响应转发回过滤器;
    • 在过滤器后处理过程中,可以根据需求对响应的内容进行修改;
    • Web容器将响应发送回客户端。

过滤器链:在一个Web应用中,也可以部署多个过滤器,这些过滤器组成了一个过滤器链。

 

 

例题1:创建一个过滤器,实现网站访问计数器的功能,并配置网站访问量的初始值设置为6000。

package cn.sdut.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
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;


@WebFilter(
		urlPatterns= {"/index.jsp"},
		initParams = {@WebInitParam(name = "count",value="60000")}
		)
public class CounterFilter implements Filter {

	private int count;
	
    public CounterFilter() {
        // TODO Auto-generated constructor stub
    }


	public void destroy() {
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		count++;//访问数量自增
		//将ServletRequest转换成HttpServletRequest
		HttpServletRequest req = (HttpServletRequest) request;
		//获取ServletContext
		ServletContext context = req.getSession().getServletContext();
		context.setAttribute("count", count);//将来访数量放到ServletContext中
		chain.doFilter(request, response);//向下传递过滤器
	}


	public void init(FilterConfig fConfig) throws ServletException {
		String param = fConfig.getInitParameter("count");//获取初始化参数
		count = Integer.valueOf(param);
	}

}

 

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
  </head>
<title>主界面</title>
</head>
<body>
	<h2>
        欢迎光临,<br/>
        您是本站的第【
        <%=application.getAttribute("count") %>
        】位访客!
    </h2>
</body>
</html>

监听器

什么是监听器?

监听器就是一个实现特定接口的普通的java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器的某个方法将立即被执行。

Web容器运行过程中,有哪些关键点事件?

Web应用被启动、用户会话开始、用户会话结束、用户请求到达等。

监听器监听的事件源有几种?

三种。ServletContext、HttpSession和ServletRequest三种域对象。

针对以上三种对象,又把这多种类型的监听器划分为三种类型:

  • 监听三个域对象创建和销毁的事件监听器
  • 监听域对象中属性的增加和删除的事件监听器
  • 监听绑定到HttpSession域中的某个对象的状态的事件监听器。
Listener接口Event类
ServletContextListServletContextEvent
ServletContextAttributeListenerServletContextAttributeEvent
HttpSessionListenerHttpSessionEvent
HttpSessionActivationListener
HttpSessionAttributeListenerHttpSessionBindingEvent
HttpSessionBindingListener
ServletRequestListenerServletRequestEvent
ServletRequestAttributeListenerServletRequestAttributeEvent

 

 

 

 

 

 

 

 

 

监听器的实现步骤

1、写一个类,实现监听器接口的所有方法

2、使用注解或者web.xml中进行监听器的配置

注解配置 @WebListener

web.xml中配置

<listener>

       <listener-class>全限定类名</listener-class>

</listener>

示例:

package cn.sdut.listener;

import javax.servlet.ServletContext;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;


@WebListener
public class OnlineNumberListenerr implements HttpSessionListener {
	
	int count=0;
    public void sessionCreated(HttpSessionEvent arg0)  { 
    	//session会话创建时,web容器自动调用此方法
    	count++;
    	ServletContext context = arg0.getSession().getServletContext();
    	context.setAttribute("onlineNum", count);
    }

	
    public void sessionDestroyed(HttpSessionEvent arg0)  { 
    	//session会话销毁时,web容器自动调用此方法
    	count--;
    	ServletContext context = arg0.getSession().getServletContext();
    	context.setAttribute("onlineNum", count);
    }
	
}
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>主界面</title>
</head>
<body>
	欢迎你,<%
		String name = (String)session.getAttribute("name");
		out.print(name);
	%>
	<br>
	<p>当前在线人数: ${onlineNum }</p>
	<br>
	<a href="LogoutServlet">退出登录</a>
</body>
</html>

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值