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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Socat虚拟pty

    命令:socatptypty问题:从pty1到pty2的数据,也会被pty1所接收。

    2022年4月6日
    36
  • git修改提交者用户名和邮箱_163邮箱用户名可以改吗

    git修改提交者用户名和邮箱_163邮箱用户名可以改吗当在GitHub中更改用户名时,git中并没有随之修改,需要自己进行修改,下面给出查看和修改用户名以及邮箱1、查看用户名以及邮箱,使用gitconfig命令gitconfiguser.namegitconfiguser.email2、修改用户名以及邮箱,使用gitconfig命令的–global参数gitconfig–globaluser.name"yourn…

    2025年9月1日
    7
  • keil5如何生成bin文件_keil4生成bin文件

    keil5如何生成bin文件_keil4生成bin文件 在RealviewMDK的集成开发环境中,默认情况下可以生成*.axf格式的调试文件和*.hex格式的可执行文件。虽然这两个格式的文件非常有利于ULINK2仿真器的下载和调试,但是ADS的用户更习惯于使用*.bin格式的文件,甚至有些嵌入式软件开发者已经拥有了*.bin格式文件的调试或烧写工具。为了充分地利用现有的工具,同时发挥RealviewMDK集成开发环境的优势,将*.axf格式文件或*.he…

    2022年10月20日
    3
  • 金融公司2014年度工作总结与2015年度工作计划

    金融公司2014年度工作总结与2015年度工作计划正文:一、 员工个人对全年重点工作、核心绩效指标进行罗列。自6月入职以来参加730、825、917、1015、1126的版本测试,测试的各个功能点,前台涉及的测试功能点包括广发、汇添富的申购、赎回,基金双持,票据购买、冻结收银台、理财管理、后台功能点包括用户开户信息查询等各种报表处理、申购异常处理、赎回异常处理、强制赎回等异常处理、定时任务管理、日常管理包括基础配置管理、基金管理中的…

    2022年7月26日
    8
  • net开源开发web框架_我的6大Web开发开源框架

    net开源开发web框架_我的6大Web开发开源框架net开源开发web框架有许多后端框架是开源的,并且易于使用,但是并非所有框架都提供了出色的功能。后端框架是网站开发的重要组成部分,因为它们就像网站的基本要素。基本上,他们处理网站幕后的一切。后端框架具有广泛的库,API,Web服务器等。他们负责数据库,确保数据库与前端进行正确的通信并生成后端功能。如所承诺的,接下来是我的前6个后端框架的摘要。1.RubyonRa…

    2022年7月15日
    35
  • docker导出镜像命令_docker save将容器保存为镜像

    docker导出镜像命令_docker save将容器保存为镜像导入导出命令介绍涉及的命令有export、import、save、loadsave示例dockersave-onginx.tarnginx:latest或dockersave>nginx.tarnginx:latest其中-o和>表示输出到文件,nginx.tar为目标文件,nginx:latest是源镜像名(name:tag),后面也可以是容器idload示例dockerload-inginx.tar或dockerload<n

    2025年9月22日
    8

发表回复

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

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