java如何统计session访问次数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java如何统计session访问次数相关的知识,希望对你有一定的参考价值。

1,Session
在JavaWeb中使用HttpSession(以下简称session)对象来表示一个会话。

正在装载数据…… Session的创建(代表会话周期的开始):第一次调用request.getSession()方法时,会创建一个session对象。
Session的销毁(代表会话周期的结束):在某个请求周期内调用了Session.invalidate()方法,此请求周期结束后,session被销毁;或者是session超时后自动销毁。
对于JSP,如果指定了<%@ page session="false"%>,则在JSP中无法直接访问内置的session变量,同时也不会主动创建session,因为此时JSP未自动执行request.getSession()操作获取session。
在session对象刚创建的第一个请求周期内,调用session.isNew()方法将得到true。
可以在web.xml文件中配置session默认的超时时间(分钟):

<session-config>
<session-timeout>10session-timeout>
session-config>
也可以调用session. setMaxInactiveInterval()方法设置session超时时间(分钟)
2,SessionListener
通过SessionListenr可以监听session的创建和销毁,步骤:
1.写一个类MySessionListener,实现javax.servlet.http.HttpSessionListener接口及其sessionCreated()、sessionDestroyed()方法
2.在web.xml中配置SessionListener:

<listener>
<listener-class>MySessionListener类全名listener-class>
listener>
当 session被创建和销毁时,容器会分别调用SessionListener的sessionCreated()方法和 sessionDestroyed()方法,这两个方法中传入了一个参数对象HttpSessionEvent,可以通过此对象的 getSession()方法获取session对象
参考技术A 当SESSION建立时sessionCreated(),在访问总数和当前在线人数上+1

当SESSION销毁时sessionDistroyed(),在线人数-1

核心方法是利用Listener监听的各种接口

package com.eaie.system;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.io.PrintWriter;

import java.net.MalformedURLException;

import java.net.URL;

import java.util.Enumeration;

import java.util.Set;

import javax.servlet.RequestDispatcher;

import javax.servlet.Servlet;

import javax.servlet.ServletContext;

import javax.servlet.ServletContextEvent;

import javax.servlet.ServletException;

import javax.servlet.ServletRequestEvent;

import javax.servlet.ServletRequestListener;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpSessionActivationListener;

import javax.servlet.http.HttpSessionEvent;

import javax.servlet.http.HttpSessionListener;

public class SessionListener implements HttpSessionActivationListener,

HttpSessionListener, ServletContext, ServletRequestListener

ServletContext context;

int onLineUserNum = 0;

int visitNum = 0;

HttpServletRequest request;

public void sessionDidActivate(HttpSessionEvent session)

log("seesionDidActive("+session.getSession().getId()+")");



public void sessionWillPassivate(HttpSessionEvent session)

log("seesionWillPassivate("+session.getSession().getId()+")");



public void sessionCreated(HttpSessionEvent event)

onLineUserNum++;

visitNum ++;

String ip = request.getRemoteAddr();

log("sessionCreated('"+event.getSession().getId()+"'),-->IP:"+ip);

context.setAttribute("onLineUserNum", new Integer(onLineUserNum));

context.setAttribute("visitNum", new Integer(visitNum));



public void sessionDestroyed(HttpSessionEvent event)

if (onLineUserNum>0)

onLineUserNum--;



String ip = request.getRemoteAddr();

log("sessionDestroyed('"+event.getSession().getId()+"'),-->IP:"+ip);

context.setAttribute("onLineUserNum", new Integer(onLineUserNum));



public void contextDestroyed(ServletContextEvent sce)

log("contextDestroyed-->ServletContext is destroyed");

this.context = null;



public void contextInitialized(ServletContextEvent sce)

this.context = sce.getServletContext();

log("contextDestroyed-->ServletContext is initialized");



public int getUserOnline()

return this.onLineUserNum;



public void log(String message)

PrintWriter out = null;

try

out = new PrintWriter(new FileOutputStream("c:\\eaieLogger.txt",true));

out.println(new java.util.Date().toLocaleString()+"::From SessionListener:"+message);

out.println("Totle visit number:"+this.visitNum+" and current online num: "+onLineUserNum);

out.println("=================================");

out.close();

catch(Exception e)

e.printStackTrace();

out.close();





public void requestInitialized(ServletRequestEvent event)

request = (HttpServletRequest)event.getServletRequest();



//省略其他方法



这个程序需要在web.xml中配置:

<listener>

<listener-class>com.eaie.system.SessionListener</listener-class>

</listener>本回答被提问者和网友采纳
参考技术B 上面哥们的代码没看全,不过有个问题,你代码里写: visitNum ++
你这个visitNum如何在jsp页面也就是我们访问的页面中显示出来

统计session次数,必须要在sevlet里创建session 即request.getSession()
这个是必须的

另外一个哥们也说了一种方式,我们可以将visitNum存入servletContext中
,然后再jsp页面就可以从application域中取出这个数据
当然细节方面的话,必须先取,即servletContext.getAttribute("visitNum")
如果取出的是null,就证明该页面是第一次访问,那么就让次数=1
如果不是null,就+1

思路就是这样的
参考技术C JavaWeb中的Session、SessionListener、在线人数统计
测试环境:Tomcat 5.0.28
JavaWeb中的Session
• 在JavaWeb中使用HttpSession(以下简称session)对象来表示一个会话。
• Session的创建(代表会话周期的开始):第一次调用request.getSession()方法时,会创建一个session对象。
• Session的销毁(代表会话周期的结束):在某个请求周期内调用了Session.invalidate()方法,此请求周期结束后,session被销毁;或者是session超时后自动销毁。
• 对于JSP,如果指定了<%@ page session="false"%>,则在JSP中无法直接访问内置的session变量,同时也不会主动创建session,因为此时JSP未自动执行request.getSession()操作获取session。
• 在session对象刚创建的第一个请求周期内,调用session.isNew()方法将得到true。
• 可以在web.xml文件中配置session默认的超时时间(分钟):
<session-config>
<session-timeout>10</session-timeout>
</session-config>
也可以调用session. setMaxInactiveInterval()方法设置session超时时间(分钟)
SessionListener
• 通过SessionListenr可以监听session的创建和销毁,步骤:
1.写一个类MySessionListener,实现javax.servlet.http.HttpSessionListener接口及其sessionCreated()、sessionDestroyed()方法
2.在web.xml中配置SessionListener:
<listener>
<listener-class>MySessionListener类全名</listener-class>
</listener>
• 当session 被创建和销毁时,容器会分别调用SessionListener的sessionCreated()方法和sessionDestroyed()方法,这 两个方法中传入了一个参数对象HttpSessionEvent,可以通过此对象的getSession()方法获取session对象。
应用:在线人数统计
import java.util.HashSet;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class MySessionListener implements HttpSessionListener

public void sessionCreated(HttpSessionEvent event)
HttpSession session = event.getSession();
ServletContext application = session.getServletContext();

// 在application范围由一个HashSet集保存所有的session
HashSet sessions = (HashSet) application.getAttribute("sessions");
if (sessions == null)
sessions = new HashSet();
application.setAttribute("sessions", sessions);


// 新创建的session均添加到HashSet集中
sessions.add(session);
// 可以在别处从application范围中取出sessions集合
// 然后使用sessions.size()获取当前活动的session数,即为“在线人数”


public void sessionDestroyed(HttpSessionEvent event)
HttpSession session = event.getSession();
ServletContext application = session.getServletContext();
HashSet sessions = (HashSet) application.getAttribute("sessions");

// 销毁的session均从HashSet集中移除
sessions.remove(session);

参考技术D 简单写,使用session的isNew()方法判断当前连接是否是新的session,如果是的话,就增加1并通过application中保存。
ps:先要从application中读取记录,然后判断,最后保存。

java:(九大内置对象,计算服务器访问次数,filter过滤器)

1.九大内置对象:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page isErrorPage="true" %><!-- 默认是隐藏的false -->
<%@ page session="true" %><!-- session默认是显示的true -->

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

<title>My JSP ‘index.jsp‘ starting page</title>
</head>

<body>

    <%
        application.setAttribute("name", "zhangsan");
    %>

    <%=session.getAttribute("name")%>
    <pre>
    
        jsp的四大作用域:servlet和servlet之间的参数传递
            setAttribute()// 存储变量
            getAttribute()// 获取变量
            removeAttribute()// 移除变量
          application:(应用)(一般情况下,存储的是字典表中的信息)
              就作用于整个项目,存储一些和项目相关的信息(比如省市区这些信息)(字典表)
              当服务器(tomcat)启动的时候application就已经被创建并初始化,而且所有的用户都共享同一个application
              直到服务器(tomcat)关闭时候,才会被销毁
              作用域:整个项目
              生命周期:当服务器(tomcat)启动的时候,就会被创建,当服务器关闭的时候就会被销毁
              
          request:(一次请求)(一般情况下,存储一些需要请求转发的信息)
              作用域:一次请求
              生命周期:一次请求以及所有通过请求转发(request.getRequestDispatcher().forward(request, response))的页面,直到页面跳转和重定向
              
          session:(一次会话)(一般情况下,存储和用户相关的信息)
              作用域:请求和响应
              生命周期:当发送一次请求,session就会被创建,当关闭浏览器或者关闭服务器的时候session就会被销毁
              
          pageContext:(页面的上下文)(就是当前页面)(一般情况下,存储临时变量)(不使用)
              作用域:当前页面
              生命周期:从页面访问开始到当页面跳转结束
              pageContext召唤另外八个神兽
              
           从小到大排序:
              pageContext--->request--->session--->application
              
              
          九大内置对象(内键对象):
              直接可以使用,无需创建的对象就称之为内置对象
              *request
                  请求信息
              *response
                  响应信息response.getWriter().print();
              *session
                  一次会话(一般存储用户相关的信息)
              (*)application
                  作用于整个项目
              pageContext
                  页面上下文(和页面有关的数据(临时数据))
              config(绝对不能动(当前jsp的配置信息(servlet的配置信息)))
                  配置信息
              out
                  打印的信息
              page
                  当前页面的信息
              exception:默认是隐藏的,如果需要显示< % @ page isErrorPage="true" % >
                  异常信息
              
              
              4(作用域)+2(输出)+3(打酱油)
              pageContext--request--session--application
             
         response--out
         page--config--exception
</pre> <% request.setAttribute("name", "zhangsan"); session.setAttribute("name", "lisi"); application.setAttribute("name", "wangwu"); pageContext.setAttribute("name", "zhaoliu"); // 如果使用el表达式取值的情况下,pageContext--${pageScore.property } %> ${pageScope.name } </body> </html>

 

2.计算服务器访问次数:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

<title>My JSP ‘app.jsp‘ starting page</title>


</head>

<body>

    <%
        Integer count = (Integer) application.getAttribute("count");
        if (count == null) {
            count = 1;
        } else {
            count++;
        }
        application.setAttribute("count", count);
    %>

    我一共被访问<%=application.getAttribute("count")%></body>
</html>

 

3.filter:

 

  index主页:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

<title>My JSP ‘index.jsp‘ starting page</title>
</head>
<body>
    <pre>
      
          filter:
              过滤器:通过访问路径进行拦截
              作用:防止恶意访问,未登录的情况下访问用户信息,用户订单。。
              
              生命周期:
                  当服务器(tomcat)启动的时候,就被初始化,当服务器关闭的时候会被销毁,有且只被创建一个对象(单例模式)
              
              建立Class(FilterClass)--->实现Filter接口(javax.servlet.Filter)---->重写init方法,destroy方法,doFilter方法---->在doFilter方法中chain.doFilter(request, response):当第一次被过滤后放行,在chain.doFilter()方法之后的代码会进行二次过滤
              特点:如果有多个filter同时过滤的话,正着进倒着出
              加载顺序:在web.xml中配置先后顺序进行加载
              如果一个项目有多个配置:
                  filter配置顺序:
                      首先一定要配置filter,其次配置listener(监听:监听一定要配在filter之后,servlet之前),最后配置servlet
      
      
      </pre>
</body>
</html>

 

  web.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <display-name>20170728_filter</display-name>

    <filter>
        <filter-name>shiwei</filter-name>
        <filter-class>cn.zzsxt.lee.web.filter.ShiweiFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>shiwei</filter-name>
        <!-- <url-pattern>/visitKing.huanggong</url-pattern>/*, *.xxx, /xxx, /xxx/*
        <url-pattern>/visitKing.weifusifang</url-pattern>
        <url-pattern>/visitKing.yuhuayuan</url-pattern>
        <url-pattern>/visitKing.tiantan</url-pattern> -->
        <servlet-name>king</servlet-name>
    </filter-mapping>
---------------------------------------------------------------------------------------------------------
    <filter>
        <filter-name>wuqi</filter-name>
        <filter-class>cn.zzsxt.lee.web.filter.WuqiFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>wuqi</filter-name>
        <url-pattern>/*</url-pattern>   <!-- /*, *.xxx, /xxx, /xxx/* -->
    </filter-mapping>
----------------------------------------------------------------------------------------------------------
    <filter>
        <filter-name>anqi</filter-name>
        <filter-class>cn.zzsxt.lee.web.filter.AnqiFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>anqi</filter-name>
        <url-pattern>*.huanggong</url-pattern>   <!-- /*, *.xxx, /xxx, /xxx/* -->访问方式
    </filter-mapping>






    <servlet>
        <servlet-name>king</servlet-name>
        <servlet-class>cn.zzsxt.lee.web.servlet.KingServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>king</servlet-name>
        <url-pattern>/visitKing.huanggong</url-pattern>
        <url-pattern>/visitKing.weifusifang</url-pattern>
        <url-pattern>/visitKing.yuhuayuan</url-pattern>
        <url-pattern>/visitKing.tiantan</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>queen</servlet-name>
        <servlet-class>cn.zzsxt.lee.web.servlet.QueenServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>queen</servlet-name>
        <url-pattern>/visitQueen.huanggong</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>nine</servlet-name>
        <servlet-class>cn.zzsxt.lee.web.servlet.NineServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>nine</servlet-name>
        <url-pattern>/visitNine.huanggong</url-pattern>
    </servlet-mapping>



    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

  Filter Class:

package cn.zzsxt.lee.web.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

// filter特点:过滤的时候是正着进去,倒着出来
// filter特点:根据web.xml配置的先后顺序进行加载
// filter特点:在web.xml中,首先要对filter进行配置,然后再对Listener(监听:监听一定要配置在filter之后和servlet之前)进行配置,最后对servlet进行配置
public class WuqiFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        System.out.println("只要你一进来,我就要检查你身上是否携带武器");
        chain.doFilter(request, response);// 如果没有这个方法,需要访问的路径就永远无法访问
        // 在chain.doFilter()以后的代码,是为了进行二次过滤
        System.out.println("你现在要出去啦,别带着宫女跑了");
    }

    @Override
    public void init(FilterConfig config) throws ServletException {
        System.out.println("你进来了,我就要上班了");
    }

    @Override
    public void destroy() {
        System.out.println("我也很累,我需要换岗");
    }

}

  Servlet:

package cn.zzsxt.lee.web.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class KingServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println("测试");
    }

}

 



以上是关于java如何统计session访问次数的主要内容,如果未能解决你的问题,请参考以下文章

Java web--Filter过滤器分IP统计访问次数

javaweb中实现在线人数统计

java如何统计网站访问量?

关于网站页面访问量统计的问题

Java:session中的invalidate()的作用是什么呢?求解

Java web 实现 之 Filter分析ip统计网站的访问次数