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


相关推荐

  • 2018/12/2 今日思想关于复杂度

    2018/12/2 今日思想关于复杂度

    2021年6月17日
    96
  • Vue、Element-ui项目中如何使用Iconfont(阿里图标库)[通俗易懂]

    Vue、Element-ui项目中如何使用Iconfont(阿里图标库)[通俗易懂]我们使用element-ui、vue开发网站的时候,往往图标是起着很重要的作用。2018-11-9更新1.傻瓜式引用:由于这种方法及其简单省去了很多繁琐的步骤,a.引入项目生成的,图标地址。b.使用推荐使用这种,详情请看文档!!文档够详细的了。http://www.iconfont.cn/help/detail?spm=a313x.7781069.1998910419.d8cf4…

    2022年4月20日
    91
  • word页数域代码

    word页数域代码针对MicrosoftWord使用alt+F9显示域代码,使用ctrl+F9插入域代码,注意:必须用ctrl+F9插入域代码,自己打括号无效第{page}页/总{numpages}页//本文档所有页数第{page}页/总{sectionpages}页//当前节所有页数…

    2022年6月9日
    109
  • matlab二分法例题(用二分法求零点例题)

    matlab二分法小题方程y=sinx在区间[-1,2]有唯一实根,若用二分法求根,并要求误差不得超过10^6,需要多少次二分?tol=0.000001;%容差a=-1;%输入两个端点值b=2;ya=feval(@f,a);%把a赋给yayb=feval(@f,b);max=round((log(b-a)-log(tol))/log(2))%最大迭代次数ifyayb>0fprintf(“二分法不适用”)elsefork=1:max%循环c=(a+b)/2yc=feval(

    2022年4月11日
    70
  • JS它DOM

    JS它DOM

    2022年1月6日
    48
  • python怎么调用api_python win32api中文手册

    python怎么调用api_python win32api中文手册#1、获得应用窗口句柄hwnd=win32gui.FindWindow(0,“窗口名字”)#2、通过应用窗口句柄获得窗口DChwndDC=win32gui.GetWindowDC(hwnd)#3、通过hwndDC获得mfcDC(注意主窗口用的是win32gui库,操作位图截图是用win32ui库)mfcDC=win32ui.GreateDCFromHandle(hwnd)#4、创建兼容…

    2022年10月11日
    2

发表回复

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

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