[j2ee]网站被访问次数的实现(一个ip一天只计算一次,且服务器重启后访问记录仍然存在)
2013-01-14 14:53
1101 查看
要求实现的功能:
我采用的框架是springMVC+ibatis+spring(采用注解方式实现).想实现的功能是网站访问次数(一个ip一天只算访问一次,服务器重启后访问次数依然存在)。
我的思路如下:
创建一个requestListener,当有请求访问项目的时候获得对应的ip,从数据库中查找当天相同的ip是否访问过, 没访问过就将该访问记录添加到数据库中。我的数据库设计如下:
create table visit(
id int primary key auto_increment,
ip varchar(20), ## 访问来源ip
time date, ##访问时间
url varchar(100) ## 访问的路径
);
遇到的困难:
现在我遇到的困难就是,由于web.xml中配置三个元素的执行顺序是listener->filter->servlet..因为采用的是注解模式,数据的连接打开是在servlet中完成的.我想在listener中访问数据库如何实现...
我记得spring对hibernate支持有个openSessionInView的filter..可以再filter中打开数据库连接。不知道spring有没有对ibatis有类似的支持呢?
难道让我自己手动写一个jdbc来实现这个功能?
解决方法:
查了下资料,发现自己对web.xml中元素的执行顺序还是理解不深刻.
资料地址如下:http://www.cnblogs.com/hzj-/articles/1689836.html
大致内容是:
1. 启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点: <listener></listener>
和 <context-param></context-param>
2.紧接着,容器创建一个ServletContext(上下文),这个WEB项目所有部分都将共享这个上下文.
3.容器将<context-param></context-param>转化为键值对,并交给ServletContext.
4.容器创建<listener></listener>中的类实例,即创建监听.
5.在监听中会有contextInitialized(ServletContextEvent args)初始化方法,在这个方法中获得ServletContext
= ServletContextEvent.getServletContext();
接着就可以再requestListener中获取ServletContext中的applicationContext对象,并获取数据库连接bean..就可以访问数据库了。。
//servletContext中初始化的applicationContext的名字为"org.springframework.web.context.WebApplicationContext.ROOT"
//也可以通过WebApplicationContextUtils来获取到
//applicationContext = (ApplicationContext) servletContext
// .getAttribute("org.springframework.web.context.WebApplicationContext.ROOT");
核心代码如下:
项目的下载地址如下: http://pan.baidu.com/share/link?shareid=226374&uk=3475027816
我采用的框架是springMVC+ibatis+spring(采用注解方式实现).想实现的功能是网站访问次数(一个ip一天只算访问一次,服务器重启后访问次数依然存在)。
我的思路如下:
创建一个requestListener,当有请求访问项目的时候获得对应的ip,从数据库中查找当天相同的ip是否访问过, 没访问过就将该访问记录添加到数据库中。我的数据库设计如下:
create table visit(
id int primary key auto_increment,
ip varchar(20), ## 访问来源ip
time date, ##访问时间
url varchar(100) ## 访问的路径
);
遇到的困难:
现在我遇到的困难就是,由于web.xml中配置三个元素的执行顺序是listener->filter->servlet..因为采用的是注解模式,数据的连接打开是在servlet中完成的.我想在listener中访问数据库如何实现...
我记得spring对hibernate支持有个openSessionInView的filter..可以再filter中打开数据库连接。不知道spring有没有对ibatis有类似的支持呢?
难道让我自己手动写一个jdbc来实现这个功能?
解决方法:
查了下资料,发现自己对web.xml中元素的执行顺序还是理解不深刻.
资料地址如下:http://www.cnblogs.com/hzj-/articles/1689836.html
大致内容是:
1. 启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点: <listener></listener>
和 <context-param></context-param>
2.紧接着,容器创建一个ServletContext(上下文),这个WEB项目所有部分都将共享这个上下文.
3.容器将<context-param></context-param>转化为键值对,并交给ServletContext.
4.容器创建<listener></listener>中的类实例,即创建监听.
5.在监听中会有contextInitialized(ServletContextEvent args)初始化方法,在这个方法中获得ServletContext
= ServletContextEvent.getServletContext();
接着就可以再requestListener中获取ServletContext中的applicationContext对象,并获取数据库连接bean..就可以访问数据库了。。
//servletContext中初始化的applicationContext的名字为"org.springframework.web.context.WebApplicationContext.ROOT"
//也可以通过WebApplicationContextUtils来获取到
//applicationContext = (ApplicationContext) servletContext
// .getAttribute("org.springframework.web.context.WebApplicationContext.ROOT");
核心代码如下:
package com.wendellup.listener; import java.util.Date; import javax.servlet.ServletContext; import javax.servlet.ServletRequestEvent; import javax.servlet.ServletRequestListener; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.context.ApplicationContext; import com.wendellup.dao.IVisitDao; import com.wendellup.entity.Visit; public class VisitTimesListener implements ServletRequestListener { private Log log = LogFactory.getLog(getClass()); private ApplicationContext applicationContext = null; @Override public void requestDestroyed(ServletRequestEvent arg0) { } @Override public void requestInitialized(ServletRequestEvent arg0) { HttpServletRequest request = (HttpServletRequest) arg0 .getServletRequest(); HttpSession session = request.getSession(); ServletContext servletContext = session.getServletContext(); Visit visit = null; IVisitDao visitDaoImpl = null; applicationContext = (ApplicationContext) servletContext .getAttribute("org.springframework.web.context.WebApplicationContext.ROOT"); try { if (session.isNew()) { log.debug("-------applicationContext--------"); log.debug("begin- " + applicationContext + " -end"); log.debug("-----begin-----"); log.debug(applicationContext.getBean("visitDaoImpl")); visitDaoImpl = (IVisitDao) applicationContext .getBean("visitDaoImpl"); // 先判断当前ip当天是否已经访问过,如果没有则保存当前访问记录 visit = new Visit(); visit.setIp(request.getRemoteAddr()); visit.setTime(new Date()); // visit.setUrl(request.getRequestURL().toString()); if (visitDaoImpl.findVisitTimes(visit) == 0) { visit.setUrl(request.getRequestURL().toString()); visitDaoImpl.saveVisitRecord(visit); } } // 显示今天的访问次数 visit = null; Integer visitTimes = visitDaoImpl.findVisitTimes(visit); session.setAttribute("visitTimes", visitTimes); } catch (Exception e) { e.printStackTrace(); } } }
项目的下载地址如下: http://pan.baidu.com/share/link?shareid=226374&uk=3475027816
相关文章推荐
- 【附】使用监听器ServletContextListener实现网站登录人数统计,可以实现重启服务器后记录仍然存在
- 海量日志数据__怎么在海量数据中找出重复次数最多的一个;提取出某日访问网站次数最多的那个IP;提取出某日访问网站次数最多的前n个IP
- 一台linux服务器,通过apache实现,一个域名访问jsp的网站,一个域名访问php的网站
- android手机访问网站时 出现您未被授权查看该页 您试图访问的 Web 服务器上有一个不被允许访问该网站的 IP 地
- 一个ip服务器下安装多个网站多个不用域名进行访问处理法方法和配置
- Hyper-V结合远程路由访问实现一个公网IP内部多个虚拟服务器的发布
- Hyper-V结合远程路由访问实现一个公网IP内部多个虚拟服务器的发布
- 一个服务器怎么实现多网站访问总结
- Java web 实现 之 Filter分析ip统计网站的访问次数
- nginx 配置虚拟主机,实现在一个服务器可以访问多个网站的方法
- 您未被受权查看该页,您试图访问的Web服务器上有一个不被允许访问的网站IP地址列表
- asp实现限制一个ip只能访问一次的方法
- Java 利用监听器来实现记录用户访问网站次数
- Hyper-V结合远程路由访问实现一个公网IP内部多个虚拟服务器的发布
- 有一个文件ip.txt,每行一条ip记录,共若干行,下面哪个命令可以实现“统计出现次数最多的前3个ip及其次数”?
- java Web项目中,利用其过滤功能,实现访问者每次访问服务器时,记录访问者的IP,访问时间,Url等信息,并保存到文件的操作
- Asp.net cookie实现记录网站访问次数
- Java web 实现 之 Filter分析ip统计网站的访问次数
- 一个能对访问者进行编号、记录访问次数、IP、时间的统计制作实例
- 2个小时拿下Perl语言:自动监控服务器内网站访问ip次数并预警(附源码)