java实现网站统计功能_网站访问量统计功能的实现

java实现网站统计功能_网站访问量统计功能的实现实现方法 拦截器 session 存储拦截器初始化时 即在 PostConstruc 注解的 initMethod 方法中读取数据库的 isystem 对象 该对象记录了网站访问量的信息 拦截器销毁时 即在 PreDestroy 注解的 destroyMetho 方法中向数据库更新 isystem 对象 拦截器的初始化和销毁都只有在应用启动和关闭的时候才被调用 因此减少了对数据库的访问 SpringMVC 中 每一次

实现方法:拦截器+session存储

拦截器初始化时,即在@PostConstruct注解的initMethod方法中读取数据库的isystem对象,该对象记录了网站访问量的信息。

拦截器销毁时,即在@PreDestroy注解的destroyMethod方法中向数据库更新isystem对象。

拦截器的初始化和销毁都只有在应用启动和关闭的时候才被调用,因此减少了对数据库的访问。

SpringMVC中,每一次请求控制器,都会先执行拦截器的preHandle方法,在该方法内先查看session中的一个标志accessedFlag,如果该标志不存在,说明此次会话没有被统计,因此在isystem对象中增加一次访问量,并向session添加标志accessedFlag,下一次访问时,该session不再添加访问量,即一个session算访问一次。并且在session中存储isystem对象,并于网页显示数据的调用。

为了保证并发的正确性,局部代码块使用同步锁,见下面红色部分。

总结:拦截器有一个静态属性isystem,用户第一次请求时,都会更新这个属性的值。用户的每一次请求都会把该属性放入到用户的session中去。因此,B用户第一次访问后,A用户第二次访问时(和第一次访问共享一个session),A用户的session中的isystem也会被更新。

拦截器类如下:

package com.wuchao.utils.interceptor;

import javax.annotation.PostConstruct;

import javax.annotation.PreDestroy;

import javax.annotation.Resource;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

import org.springframework.web.servlet.ModelAndView;

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import com.wuchao.blog.system.bo.intf.IsystemBo;

import com.wuchao.blog.system.po.Isystem;

import com.wuchao.blog.user.controller.LoginController;

import com.wuchao.utils.config.SpringContextHolder;

public class RequestInterceptor extends HandlerInterceptorAdapter {

private static Logger log = Logger.getLogger(LoginController.class);

@Resource(name=”isystemBo”)

public IsystemBo isystemBo;

@Resource(name=”springContextHolder”)

SpringContextHolder springContextHolder;

public static Isystem isystem;

//请求控制器前,处理请求

@Override

public boolean preHandle(HttpServletRequest request,

HttpServletResponse response, Object handler) throws Exception {

try {

log.info(“RequestInterceptor”);

//网站访问量+1

if(isystem==null) {

log.info(“isystem==null”);

isystem = isystemBo.getIsystemByDefault();

}

if(isystem!=null) {

//每一个session理论上只能记一次访问,因此在session里面存一个访问标记,如果存在标记,则不再计算此次访问

String accessedFlag = “accessedFlag”;

if(request.getSession().getAttribute(“accessedFlag”)==null) {

//同步锁

synchronized(this) {

log.info(“网站访问量+1,存入session”);

isystem.setAmountOfAccess(isystem.getAmountOfAccess()+1);

request.getSession().setAttribute(“Isystem”, isystem);

request.getSession().setAttribute(“accessedFlag”, accessedFlag);

}

}

}

}catch(Exception e) {

e.printStackTrace();

throw e;

}

return true;

}

@Override

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,

ModelAndView modelAndView) throws Exception {

}

@Override

public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)

throws Exception {

}

/*

* 实例化时执行的操作

*/

@PostConstruct

public void initMethod() throws Exception {

log.info(“initMethod 被执行”);

//加载isystem对象

if(isystem==null) {

log.info(“加载isystem”);

isystem = isystemBo.getIsystemByDefault();

}

}

/*

* 销毁前执行的操作

*/

@PreDestroy

public void destroyMethod() throws Exception {

log.info(“destroyMethod 被执行”);

//保存isystem

if(isystem!=null) {

isystemBo.saveIsystem(isystem);

}

}

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/232883.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 动态数组是啥

    动态数组是啥动态数组是什么?什么情况用动态数组?长度可变那么如何定义呢?

    2025年6月1日
    3
  • 配置catalina.out的日志格式[通俗易懂]

    配置catalina.out的日志格式[通俗易懂]启动Tomcat时,catalina.out中输出的日志格式可能不太理想。看看某些版本默认的格式:四月24,20186:49:32下午org.apache.catalina.startup.Catalinastart信息:Serverstartupin9772ms有点别扭,想要调整成下面的格式:24-Apr-201818:52:16.13…

    2022年5月9日
    52
  • python中的encode()和decode()函数

    python中的encode()和decode()函数对于很多人来说,python的中字符转码是一件很头疼的事情,本来期望结果输出的是中文,结果来一段像这样\xe4\xbd\xa0\xe5\xa5\xbd像是乱码的字符串。由于学python没多久,昨天使用python的时候,就遇到这种问题,现在来深入研究下与之相关的encode()和decode()函数,和如何把如乱码般的字符串转成中文。encode()和decode()都是字符串的函数,可直接查看关

    2022年10月7日
    5
  • 深入浅出谈开窗函数(一)

    深入浅出谈开窗函数(一)

    2021年11月29日
    34
  • vue开发移动端app苹果手机的bug脱坑

    vue开发移动端app苹果手机的bug脱坑vue 开发移动端 app 网页打包苹果 app 的坑总结列表设置 overflow auto 后 滚动效果不流畅的问题 可以在列表设置 flex 1 overflow y auto webkit overflow scrolling touch 在 iOS 中出现滚动卡顿问题上诉解决方法还会出现一个问题 就是会导致在列表中如果有弹窗 position fixed 会导致弹窗被覆盖或者覆盖不完全的问题 为此需要将弹窗放在列表外 下面为代码例子

    2025年10月30日
    4
  • sp_executesql接收返回多个参数实例

    sp_executesql接收返回多个参数实例近日做项目中需要在EXEC执行Sql字符串时动态的传入参数并接收返回值,于是研究了一下SqlServer中sp_executesql的使用方法,并做了如下的例子。在使用sp_executesql动态传入与接收返回参数时需注意以下事项,以避免大家走弯路。例子中@SQLString,@ParmDefinition一定要使用NVARCHAR类型,否则会报“过程需要参数××××为ntext/n

    2022年5月11日
    42

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号