javaweb网站访问量统计,本年、本月、今日网站访问量统计

1、概要

  • 关于java web 网站访问统计功能,翻阅了很多技术文档没有找到合适的功能需求,为了满足开源项目《RuoYi-fast-cms》集大众之所及,于是根据实际业务逻辑,按照自己的思路开发出来了
  • 网站统计是指通过对网站的访问情况、用户行为和其他相关数据进行收集、分析和报告,以便了解网站的运营情况和用户特征。它的作用和优点包括:
    • 了解用户行为:通过网站统计,可以知道用户在网站上的停留时间、浏览页面、点击链接和交互等行为,从而了解用户的兴趣和偏好,有效地进行用户行为分析。
    • 优化网站体验:通过对用户行为和反馈的统计分析,可以发现网站的问题和瓶颈,并根据数据做出优化改进,提升网站的用户体验和用户满意度。
    • 提高转化率:网站统计可以追踪用户的转化路径,包括注册、购买、留言等行为,并通过分析找出影响转化率的因素,从而优化网站的设计、内容和推广策略,提高转化率和销售额。
    • 评估营销效果:通过网站统计,可以了解到各种营销活动的效果,比如广告点击量、转化率、ROI等,从而为营销决策提供数据支持,优化营销策略,提高投资回报率。
    • 监控网站安全:网站统计可以监控恶意攻击、异常访问和网络安全事件等,及时发现并解决安全问题,保护网站和用户数据的安全。
  • 总之,网站统计可以帮助网站主了解用户行为、优化网站体验、提高转化率、评估营销效果和监控网站安全,从而提升网站的运营效果和用户满意度。

2、来源

  • 开源项目 RuoYi-fast-cms是一款 Java CMS 网站管理系统,项目基于 RuoYi-fast 二次开发,网站后台采用 SpringBoot + MyBatis,前端网站模版使用 thymeleaf+bootstrap 开发,多套风格模板,可自由飞翔。
  • 代码源自开源项目: https://github.com/huangxing2010/RuoYi-fast-cms

3、需求分析

  • 刷新或者访问页面获取访客 ip 地址,
  • 初次访问根据站点类型、ip 存储
  • 第二次访问根据 ip 如果存在累加 pv 量加 1否则新增
  • 每天记录一条数据,防止重复添加做了合并数据

4、数据库表

关于CRUD就不做阐述了,感兴趣的小伙伴请移步开源仓库

drop table if exists sys_portal_browse;
create table sys_portal_browse (
  browse_id        bigint(20)      not null auto_increment    comment '浏览id',
  browse_type      char(1)           default '0'         comment '类型(0网站A 1网站B ...)', 
  browse_json      json                                        comment '浏览统计(ip+次数)',
  remark           varchar(512)      default null        comment '备注',
  create_time      datetime                              comment '创建时间',
  primary key (browse_id)
) engine=innodb auto_increment=1 comment = '访问统计表';

5、代码分享

高端食材往往采用最朴素的烹饪方式,程序员的每一道菜都凝聚了辛勤的汗。大佬厌倦了屎山上堆屎,往往满足客户应急需求势在必得,若不够优雅请勿喷,欢迎高手指点!

5.1、控制器方法

//访问统计
 modelMap.put("browseCount", greenBrowseService.setBrowseCount("0"));

5.2、业务层

/**
     * 统计访问量
     * @param browseType
     * @return
     */
    @Transactional
    @Override
    public Map<String, Object> setBrowseCount(String browseType) {
   
   
        String ip = ShiroUtils.getIp();
        PortalBrowse portalBrowse = new PortalBrowse();
        Map<String, Object> params = portalBrowse.getParams();
        params.put("browseType", browseType);
        //当前日期开始时间
        LocalDate today = LocalDate.now();
        String todayDate = today.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        String beginTime = todayDate + " 00:00:00";
        String endTime = todayDate + " 23:59:59";
        params.put("beginTime", beginTime);
        params.put("endTime", endTime);
        List<PortalBrowse> portalBrowses = portalBrowseMapper.selectPortalBrowseByParam(params);

        //每天统计只有一条数据,访问量大的时候可能会有多条数据出现,所以做了合并
        if (portalBrowses.size() > 0) {
   
   
            //防止当天统计条数多于1
            if (portalBrowses.size() > 1) {
   
   
                //便利出 id集合
                List<String> ids = new ArrayList<>();
                List<String> ips = new ArrayList<>();
                //遍历合并 ip+number集合
                List<Map<String, Object>> arrayBrowse = new ArrayList<>();
                portalBrowses.forEach(item -> {
   
   
                    ids.add(item.getBrowseId().toString());
                    String browseJson = item.getBrowseJson();  //字符串转json
                    JSONArray jsonArr = JSON.parseArray(browseJson);
                    //遍历 ip+ number集合
                    for (int i = 0; i < jsonArr.size(); i++) {
   
   
                        Map<String, Object> map1 = new HashMap<>();
                        JSONObject obj = jsonArr.getJSONObject(i);
                        map1.put("ip", (String) obj.
### JavaWeb实现网站访问量统计方法 在JavaWeb项目中,可以通过`Servlet`或过滤器(Filter)来实现网站访问量统计。以下是具体的实现方式: #### 使用 ServletContext 实现全局计数 通过 `ServletContext` 的属性可以保存整个应用范围内的共享数据。每次请求到达时,在 `doGet` 或 `doPost` 方法中更新计数值。 ```java import javax.servlet.*; import java.io.IOException; public class VisitCounterServlet implements Filter { private int count = 0; @Override public void init(FilterConfig filterConfig) throws ServletException {} @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 获取当前上下文中的计数器 Integer currentCount = (Integer) request.getServletContext().getAttribute("counter"); if (currentCount == null) { currentCount = 0; } // 更新计数器 request.getServletContext().setAttribute("counter", ++currentCount); // 将请求传递给下一个链节点 chain.doFilter(request, response); } @Override public void destroy() {} } ``` 上述代码定义了一个过滤器[^1],它会在每一次请求到来时增加计数器的值,并将其存储到 `ServletContext` 中。 #### 显示访问次数 为了显示访问次数,可以在 JSP 页面或其他视图组件中读取该属性并展示出来。 ```jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>访问统计</title> </head> <body> <h1>本网站已被访问 ${applicationScope.counter} 次。</h1> </body> </html> ``` 此页面会动态加载 `ServletContext` 属性中的计数器值,并向用户展示总访问次数。 #### 配置过滤器 为了让过滤器生效,需在 `web.xml` 文件中配置如下内容: ```xml <filter> <filter-name>VisitCounterFilter</filter-name> <filter-class>com.example.filter.VisitCounterServlet</filter-class> </filter> <filter-mapping> <filter-name>VisitCounterFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 以上 XML 片段指定了过滤器拦截所有的 URL 请求路径 `/ *` ,从而确保每条请求都会触发访问量计算逻辑。 #### 结合数据库持久化 如果希望长期记录访问量而不仅仅是运行期间有效,则可扩展方案至数据库层面。例如创建一张表用于存储累计点击数,并定期写入新纪录或者更新现有纪录。 ```sql CREATE TABLE site_visits ( id INT AUTO_INCREMENT PRIMARY KEY, visit_count BIGINT NOT NULL DEFAULT 0, last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); ``` 随后修改 DAO 接口及其对应的实现类完成对这条信息的操作[^3]: ```java // 数据访问层接口 public interface SiteVisitsDao { long getSiteVisitCount(); void updateSiteVisitCount(long newCount); } // 数据访问实现类 @Repository public class SiteVisitsDaoImpl implements SiteVisitsDao { @Autowired private NamedParameterJdbcTemplate jdbcTemplate; @Override public long getSiteVisitCount() { String sql = "SELECT visit_count FROM site_visits LIMIT 1"; return jdbcTemplate.queryForObject(sql, Collections.emptyMap(), Long.class); } @Override public void updateSiteVisitCount(long newCount) { String sql = "UPDATE site_visits SET visit_count=:newCount WHERE id=1"; Map<String, Object> params = new HashMap<>(); params.put("newCount", newCount); jdbcTemplate.update(sql, params); } } ``` 最后调整业务服务层调用这些方法即可达成目标[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值