假如有这么一个需求,要记录所有用户访问某一页面的次数。

  最先想到的可能是在该Controller定义一个静态成员,然后在相应Action里自增。但这样有一个问题,就是Tomcat或者其他服务器重启的话,这个值是没办法保存的。

  当然在数据库中直接保存也是可以的,但因此便要去单独建张表,日后用户访问相应页面都要去访问数据库维护该表有点不值得。

  利用自定义ServletContextListener可以很方便做到这一点。思路如下:

1 、在 Web 应用启动时从文件中读取计数器的数值,并把表示计数器的 Counter 对象存放到 Web应用范围内。存放计数器的文件的路径为helloapp/count/count.txt 。

2 、在Web 应用终止时把Web 应用范围内的计数器的数值保存到count.txt 文件中。

  

public class MyServletContextListener implements ServletContextListener{  

  public void contextInitialized(ServletContextEvent sce){  

    System.out.println("helloapp application is Initialized.");  

    // 获取 ServletContext 对象  

    ServletContext context=sce.getServletContext();  

    try{  

       // 从文件中读取计数器的数值  

       BufferedReader reader=new BufferedReader(  

           new InputStreamReader(context.  

           getResourceAsStream("/count/count.txt")));  

       int count=Integer.parseInt(reader.readLine());  

       reader.close();  // 把计数器对象保存到 Web 应用范围  

       context.setAttribute("count",count);  

       } catch(IOException e) {  

          e.printStackTrace();  

       }  

   }  

   public void contextDestroyed(ServletContextEvent sce){  

       System.out.println("helloapp application is Destroyed.");  

       // 获取 ServletContext 对象  

       ServletContext context=sce.getServletContext();  

       // 从 Web 应用范围获得计数器 

       int count=(int)context.getAttribute("count");  

       if(count!=){  

       try{  

          // 把计数器的数值写到 count.txt 文件中  

          String filepath=context.getRealPath("/count");  

          filepath=filepath+"/count.txt";  

          PrintWriter pw=new PrintWriter(filepath);  

          pw.println(count);  

          pw.close();  

         } catch(IOException e) {  

             e.printStackTrace();  

         }  

     }  

   }  

}   

同时在web.xml文件中要配置

<listener>
<listener-class> ServletContextTest.MyServletContextListener<listener-class />
</listener>

通过ServletContext对象便能获取到保存的count值。

Java 利用监听器来实现记录用户访问网站次数的更多相关文章

  1. 利用Spring AOP切面对用户访问进行监控

    开发系统时往往需要考虑记录用户访问系统查询了那些数据.进行了什么操作,尤其是访问重要的数据和执行重要的操作的时候将数记录下来尤显的有意义.有了这些用户行为数据,事后可以以用户为条件对用户在系统的访问和 ...

  2. SpringMVC拦截器实现:当用户访问网站资源时,监听session是否过期

    SpringMVC拦截器实现:当用户访问网站资源时,监听session是否过期 一.拦截器配置 <mvc:interceptors> <mvc:interceptor> < ...

  3. 从用户访问网站流程开始,细说web网络基础

    1.用户访问网站流程框架 2.dns解析原理 3.tcp/ip三次握手过程原理,11种连接状态 4.tcp/ip四次挥手过程原理,11种连接状态 5.http协议原理(www服务的请求过程)请求细节, ...

  4. js记录用户访问页面和停留时间

    1.setInterval setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式. setInterval(code,millisec[,"lang" ...

  5. Java利用jcifs集成AD域用户认证

    近期一段时间发现AD这东西老火了,尤其是涉及到安全这一方面的,所以AD域用户认证成了如今网络安全方面的产品必备!这里就简单的分享一下,Java通过jcifs集成AD域用户实现认证,以实现网络安全! 我 ...

  6. js记录用户在网站的浏览记录和停留时间

    by weber开发者 from http://weber.pub/ 本文地址: http://weber.pub/js记录用户行为浏览记录和停留时间/163.html 问题 公司想统计一个用户从进入 ...

  7. 禁止 一些地区的ip用户访问 网站

    01 framework.php 中 获取请求的ip地址.保存为常量 define('IP', request::get_clientip()); 02 setting表中.属于system模块,保存 ...

  8. 用jsp的application写一个记录用户登陆网站的数量

    </head><body><%int i = 0;Object number = application.getAttribute("num");if ...

  9. Nginx记录用户请求Header到access log

    为了统计和其它用途,经常有人需要自定义Nginx日志,把http请求中的某个字段记录到日志中,刚好在看lua+nginx的文章,第一想到的是用lua赋值来做,但是想想有点小恶心,于是Google了一番 ...

随机推荐

  1. sql 追踪 神器

    http://www.thinkphp.cn/download/690.html 一个中国人开发的php工具箱此工具能几秒钟追踪出sql 数据库操作, 能分析出 Thinkphp3.2 的任意sql ...

  2. opencv 摄像头人脸检测

    PYTHON ubuntu16.04 默认安装的Python版本2.7.12,当用pip install opencv-python 安装了opencv for python 3.3.0.10后,运行 ...

  3. java---同步与并发概念

    Java中并发的形式无非是多线程和多进程两种形式.这两种形式都是可以利用多核来发挥计算能力的. 先说并发: 多进程意味着同时运行多个JVM,这个代价通常比多线程高,每个JVM都有自己的堆栈.都要分别加 ...

  4. sgu 326(经典网络流构图)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=13349 题目大意:有N个球队在同一个赛区,已知他们胜利的场数,还剩 ...

  5. 数据库为什么要用B+树结构--MySQL索引结构的实现(转)

    B+树在数据库中的应用 { 为什么使用B+树?言简意赅,就是因为: 1.文件很大,不可能全部存储在内存中,故要存储到磁盘上 2.索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数(为什么使用B-/ ...

  6. 点击input选中文本

    选文本: $(".unline-ipt").click(function () { $(this).focus().select(); this.selectionStart = ...

  7. 【BZOJ3416】Poi2013 Take-out 栈

    [BZOJ3416]Poi2013 Take-out Description 小F喜欢玩一个消除游戏——take-out 保证k+1|n,保证输入数据有解这是一个单人游戏 游戏者的目标是消除初始时给定 ...

  8. vue 二级列表折叠面板

    请求出来的数据是二级列表,需要点击一级列表展开相应的二级列表 data(){ return { info: [ {name:'一级菜单1',lists:[{price:1},{price:2}]}, ...

  9. 领悟 JavaScript 中的面向对象

    JavaScript是基于对象的语言,我们可以使用面向对象的思想去开发js代码. JavaScript是基于对象的语言. 可以使用面向对象的思想,但是不少人对这一点理解得并不全面. 在 JavaScr ...

  10. SaltStack之Salt-ssh

    上一篇:SaltStack远程执行-返回MySQL 通常salt需要在客户端安装salt-minion使用salt-ssh可以在客户断主机免安装minion 在master主机安装salt-ssh y ...