过滤器实现网站访问计数

创建一个过滤器,实现网站访问计数器的功能,并在web.xml文件的配置中将网站访问量的初始值设置为5000。

创建名称为CountFilter的类

创建名称为CountFilter的类,该类实现javax.servlet.Filter接口,是一个过滤器对象,通过该过滤器实现统计网站访问人数。代码如下:

package org.life.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.http.HttpServletRequest;

public class CountFilter implements Filter {
	//来访数量
	private int count;
	
	public void init(FilterConfig fConfig) throws ServletException {
		//获取初始化参数
		String param = fConfig.getInitParameter("count");
		//将字符串转换为int
		count = Integer.valueOf(param);
	}
	
	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();
		//将来访数量值放入到ServletContext中
		context.setAttribute("count", count);
		//向下传递过滤器
		chain.doFilter(request, response);
	}
	
	public void destroy() {
	}
}

在CountFilter类中包含了一个成员变量count,用于记录网站访问人数,该变量在过滤器访问的初始化方法init()中被赋值,它的初始化值通过FilterConfig对象读取配置文件中的初始化参数进行获取。
计数器count变量的值在CountFilter类的doFilter()方法中被递增,因为客户端在请求服务器中的Web应用时,过滤器拦截请求通过doFilter()方法进行过滤处理。为了能够访问计数器中的值,实例中将其放置于Servlet上下文中,Servlet上下文对象通过将ServletRequest转换为HttpServletRequest对象后获取。

Tips:过滤器对象中的3个方法中,除了doFilter()方法外,如果在业务逻辑中不涉及初始化方法init()与销毁方法destroy(),可以不编写任何代码对其进行空实现。

配置已创建的CountFilter对象

配置已创建的CountFilter对象,此操作通过配置web.xml文件进行实现。关键代码如下

<!-- 过滤器声明 -->
  <filter>
    <display-name>CountFilter</display-name>
    <filter-name>CountFilter</filter-name>
    <filter-class>org.life.filter.CountFilter</filter-class>
    <!-- 设置初始化参数 -->
    <init-param>
    	<!-- 参数名 -->
    	<param-name>count</param-name>
    	<!-- 参数值 -->
    	<param-value>5000</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>CountFilter</filter-name>
    <url-pattern>/index.jsp</url-pattern>
  </filter-mapping>

在声明过程中,实例通过<init-param>标签配置过滤器的初始化参数,初始化参数的名称为count,参数值为5000。

Tips:如果直接对过滤器对象中的成员变量进行赋值,那么在过滤器被编译后将不可修改,所以,实例中将过滤器对象中的成员变量定义为过滤器的初始化参数,从而提高代码的灵活性

创建程序中的首页index.jsp

创建程序中的首页index.jsp,在该页面中通过JSP内置对象Application获取计数器的值。关键代码如下

<body>
	<h2>欢迎光临,<br/>
	你是本站的第【<%=application.getAttribute("count") %>】位访客!
	</h2>
</body>

在这里插入图片描述
这里有一个问题,就是初始值设置的是5000,第一次访问应该是第5001位访客,但为什么是5002位访客。
这里我自己也debug了一下,发现运行过程中,程序先自己走一遍流程,但是第一遍的时候不输出访客数,第二遍的时候才输出,感觉可能是服务器第一次启动的问题,不过自己对于这方面不是很了解,百度也没百度到结果,所以希望看到的能评论一下这个问题是怎么回事,谢谢。

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值