GVKun编程网logo

具有HttpSessionListener的会话计数器和会话计数变量访问(session会话技术)

21

对于具有HttpSessionListener的会话计数器和会话计数变量访问感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍session会话技术,并为您提供关于HttpSessionListe

对于具有HttpSessionListener的会话计数器和会话计数变量访问感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍session会话技术,并为您提供关于HttpSessionListener和HttpSessionAttributeListener区别、servletContextListener、httpSessionListener和servletRequestListener使用整理、asp.net – 如何使用PowerShell了解IIS中托管的特定网站的活动会话计数、cookie和session的会话和会话状态讲解的有用信息。

本文目录一览:

具有HttpSessionListener的会话计数器和会话计数变量访问(session会话技术)

具有HttpSessionListener的会话计数器和会话计数变量访问(session会话技术)

我在Sun的“ Core Servlets and JavaServer Pages vol 2”中看到了带有会话计数器的示例。
计数器仅仅是建立在HttpSessionListener和递增/递减会话数与sessionCreated/ sessionDestroyed

public class SessionCounter implements HttpSessionListener {   private int currentSessionCount = 0;   public void sessionCreated(HttpSessionEvent event) {       currentSessionCount++;   }   ...   public int getTotalSessionCount() {       return(totalSessionCount);   }   ... // counter decrement, self registering in context attribute etc.

侦听器在上下文中注册自身,因此servlets可以访问它并获取计数器值。
没有同步块。
安全,currentSessionCount不是volatile吗?

可以currentSessionCount缓存在CPU寄存器中,并且对于使用servlets

答案1

小编典典

Servlet 3.0的规范规定(第11.5节):

侦听器实例和线程

[…]

不需要容器将结果通知同步到属性侦听器类。维护状态的侦听器类负责数据的完整性,并应明确处理这种情况。

所以不,代码不安全。使用AtomicCounter或同步对计数器的访问即可对其进行修复。

使它易失并不能使其更安全,因为++不是原子操作。因此,由于易失性,每个其他线程都将看到新值,但是由于竞争条件读取,您可能仍会错过增量,然后并行增加计数器。

<Listener>HttpSessionListener和HttpSessionAttributeListener区别

HttpSessionListener和HttpSessionAttributeListener区别

一、HttpSessionListener

       HttpSessionListener是对Session的一个监听,主要监听关于Session的两个事件,即初始化和销毁。HttpSessionListener有两个方法:


VoidsessionCreated(HttpSessionEvent se):当session创建时会收到通知。


VoidsessionDestroyed(HttpSessionEvent se):当session销毁时也会收到通知。

在调用session.invalidate()方法时,就会调用VoidsessionDestroyed()销毁方法。
       故根据HttpSessionListener的特性,如果想在用户登录或者退出时做些什么,就可以设置session监听,例如:防止用户重复登录,统计用户在线数量,统计用户登录频率等等。

二、HttpSessionAttributeListener

       HttpSessionAttributeListener是SessionAttribute的监听,当在会话对象中加入属性、移除属性或替换属性时,就会调用HttpSessionAttributeListener监听器。

       它有三个方法:


 public voidattributeAdded(HttpSessionBindingEvent se):在session中添加对象时触发此操作

 public voidattributeRemoved(HttpSessionBindingEvent se):修改、删除session中添加对象时触发此操作

 public voidattributeReplaced(HttpSessionBindingEvent se):在Session属性被重新设置时

 

三、来个例子

1、web.xml配置

 

2、监听实现类

 

<Listener>servletContextListener、httpSessionListener和servletRequestListener使用整理

servletContextListener、httpSessionListener和servletRequestListener使用整理

在java web应用中,listener监听器似乎是不可缺少的。经常常使用来监听servletContext、httpSession、servletRequest等域对象的创建、销毁以及属性的变化等等,能够在这些事件动作前后进行一定的逻辑处理。


比較经常使用的应用场景是利用监听器来初始化一些数据、统计在线人数、统计web应用浏览量等等。


这里所说的监听器实际上是servlet规范中定义的一种特殊类,须要实现特定的接口。 
而我临时先说当中三个用来监听域对象的,各自是servletContextListener、httpSessionListener、servletRequestListener。 
这三个接口写法上实际是几乎相同的。都有两个分别代表了该域对象创建时调用和销毁时调用的方法。据我的理解,这三个对象最大的差别应该就是作用域不一样。


servletContext在整个应用启动到结束中生效。启动系统时创建这个对象,整个过程中这个对象是唯一的。 
httpSession则是在一个session会话中生效,在一个session被创建直到失效的过程中都起作用,只是一个启动的应用中httpSession对象能够有多个,比方同一台电脑两个浏览器訪问。就会创建两个httpSession对象。 
而servletRequest是在一个request请求被创建和销毁的过程中生效,每发起一次请求就会创建一个新的servletRequest对象,比方刷新浏览器页面、点击应用的内链等等。 
这三个监听器的写法基本例如以下伪代码所看到的: 
首先创建一个监听器类实现对应的接口及方法:

package packageName;
public class ListenerName implements *Listener {

    @Override
    public void 对象创建时被调用的方法(对应的事件 arg0) {

    }

    @Override
    public void 对象销毁时被调用的方法(对应的事件 arg0) {

    }
}

 

然后在web.xml中注冊:

<listener>
    <listener-class>packageName.ListenerName</listener-class>
  </listener>

 

到这里,基本上这个监听器在启动web服务器以后就能够正常跑了,仅仅是有时候我们还会在注冊监听器的时候配置一些其它的。 
比方配置servletContextListener的时候,可能会加上context-param參数:

<context-param>
     <param-name>paramName</param-name>
     <param-value>paramValue</param-value>
</context-param>

 

配置httpSessionListener的时候,可能会加上session超时:

<session-config>
     <session-timeout>1</session-timeout>
</session-config>

 

我感觉经过这样一整理后,就会发现起始监听器写起来还是非常easy的。于是便模拟简单的实现了在线用户统计和应用訪问量,基本代码例如以下: 
首先是实现了servletContext

package webTest;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Date;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class ListenerTest1 implements ServletContextListener {

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {

        System.out.println("contextDestroyed" + "," + new Date());
        Object count = arg0.getServletContext().getAttribute("count");
        File file = new File("count.txt");
        try {
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, "utf-8");
            BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
            bufferedWriter.write(count.toString());
            bufferedWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        System.out.println("contextInitialized" + "," + new Date());
        File file = new File("count.txt");
        if (file.exists()) {
            try {
                FileInputStream fileInputStream = new FileInputStream(file);
                InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "utf-8");
                BufferedReader bReader = new BufferedReader(inputStreamReader);
                String count = bReader.readLine();
                System.out.println("历史訪问次数:" + count);
                arg0.getServletContext().setAttribute("count", count);
                bReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

 

这里我把訪问次数存在一个txt文件里。以便于持久化保存。当项目启动的时候。也就是创建servletContext对象的时候调用载入方法。从txt文件里读取历史訪问量,然后使用setAttribute方法把这个数据存入到内存中。 
之后当应用被关闭,servletContext对象被销毁的时候把内存中新的訪问量数据覆盖写入到txt文件。以便于下次启动应用后继续读取之前的訪问量。 
然后使用servletRequestListener来实现web浏览量的变化,当然了。这里仅仅是简单的实现,假设是要实现那种同一个用户刷新页面不添加浏览量的功能,还须要做很多其它的处理。

package webTest;
import java.util.Date;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;

public class ListenerTest3 implements ServletRequestListener {

    @Override
    public void requestDestroyed(ServletRequestEvent arg0) {
        System.out.println("requestDestroyed" + "," + new Date());
        System.out.println("当前訪问次数:" + arg0.getServletContext().getAttribute("count"));
    }

    @Override
    public void requestInitialized(ServletRequestEvent arg0) {
        System.out.println("requestInitialized" + "," + new Date());
        Object count = arg0.getServletContext().getAttribute("count");
        Integer cInteger = 0;
        if (count != null) {
            cInteger = Integer.valueOf(count.toString());
        }
        System.out.println("历史訪问次数::" + count);
        cInteger++;
        arg0.getServletContext().setAttribute("count", cInteger);
    }

}

 

这里相同是两个方法,在servletRequest对象被建立的时候调用初始化方法。从内存中读取servletContext对象的count属性,而后输出历史訪问量。


同一时候在此基础上加一又一次设置servletContext对象的count属性的内容。当servletRequest对象被销毁的时候调用销毁时的方法打印出当前浏览量。这样就简单的实现了web浏览的量的累加计数。 
然后就是利用httpSessionListener来实如今线人数的统计:

package webTest;
import java.util.Date;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class ListenerTest2 implements HttpSessionListener {

    @Override
    public void sessionCreated(HttpSessionEvent arg0) {
        System.out.println("sessionCreated" + "," + new Date());
        Object lineCount = arg0.getSession().getServletContext().getAttribute("lineCount");
        Integer count = 0;
        if (lineCount == null) {
            lineCount = "0";
        }
        count = Integer.valueOf(lineCount.toString());
        count++;
        System.out.println("新上线一人,历史在线人数:" + lineCount + "个,当前在线人数有: " + count + " 个");
        arg0.getSession().getServletContext().setAttribute("lineCount", count);
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent arg0) {
        System.out.println("sessionDestroyed" + "," + new Date());
        Object lineCount = arg0.getSession().getServletContext().getAttribute("lineCount");
        Integer count = Integer.valueOf(lineCount.toString());
        count--;
        System.out.println("一人下线,历史在线人数:" + lineCount + "个。当前在线人数: " + count + " 个");
        arg0.getSession().getServletContext().setAttribute("lineCount", count);
    }

}

 

这里的代码都非常easy。太多必要解释,须要说明的是。这里把lineCount存放在servletContext对象中并非唯一的方式,有兴趣的朋友能够尝试其它的方式。比如使用类属性。

asp.net – 如何使用PowerShell了解IIS中托管的特定网站的活动会话计数

asp.net – 如何使用PowerShell了解IIS中托管的特定网站的活动会话计数

我问了一个关于知道IIS中运行会话数的问题.

Get running session count from IIS for my hosted Asp.Net web site

我得到了以下的powershell脚本

Write-host Getting performance counters ...

$perfCounterString = "\asp.net applications(__total__)\sessions active" 
$counter = get-counter -counter $perfCounterString 
$rawValue = $counter.CounterSamples[0].CookedValue 

write-host Session Count is $rawValue

此单击此脚本为IIS中托管的所有网站提供活动会话计数

我只想知道如何修改此脚本,以便它只应为特定网站提供活动会话计数.

解决方法

$ServerName = 'IIs1'
$SiteName = 'default web site'

get-counter "\\$ServerName\web service($SiteName)\current connections"

cookie和session的会话和会话状态讲解

cookie和session的会话和会话状态讲解

一、会话概述

1)现象:http协议是一种无状态的协议,web服务器本身不能识别出哪些请求是同一个浏览器发出的,浏览器的每一次请求都是完全孤立的。

2)解决:借助会话状态,Web服务器能够把属于同一会话中的一系列请求和响应过程关联起来。

3)实现:需要浏览器对其发出的每个请求消息都进行标识。这个标识称为会话ID(SessionID)。

 

二、Cookie

一:存在两种类型的cookie:

1>会话cookie (session cookie)

       不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,   cookie就消失了。

       生命期为浏览器会话期。

       一般不保存在硬盘上而是保存在内存里。

2>持久性cookie (persistent cookies)

       设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。

       保存在用户硬盘上面,同一浏览器可以获取。

二: session相关知识

2.1: 什么是session?

       Session 是一种保存上下文信息的机制,它是针对每一个用户的,变量的值保存在服务器端,通过sessionid来区分不同的客户,session是以cookie或url重       写为基础.

2.2: session  的工作原理

client———>1.request————————->server

                       2. session_start();

   |

   |————->4.request(SESSION_ID)———>|

                       5. session_start();

   |

   |————->7. request(SESSION_ID + logout)–>|

                      8. session_destroy();

   |

 

 

client打开网页,向server发出请求,client上由于没有相应的cookie文件存在,在请求中不输送SESSION_ID

服务器在接受到client的请求后,通过执行session_start()函数开始进行session的处理, 首先确认请求中有没有SESSION_ID,如果没有的话,发行一个新的SESSION_ID;如果有的话, 则调用那个存有SESSION_ID的文件,并把信息写入$_SESSION里去,并存入以sess_开头的文件里。

把写入信息的$_SESSION参数发回给client,client在GET服务器发来的信息后,把这些信息保存在cookie里。

client把cookie里的SESSION_ID一起写入header后再次向server发出请求。重复1-3的操作

client发出登出请求

服务器接受请求后,通过执行session_destroy()函数开始删除session文件处理

服务器向client发出删除保存在client上的cookie文件的命令:   setcookie(session_name(), ”, time()-60, ‘/’);

 

2.3: 注意

    通常情况下是不能跨窗口使用,但用sessionid保存在持久cookie中,然后在从新窗口中读取,就可以得到sessionid,实现跨窗口的使用.

    在大浏览量的网站,session并不保险,可能会出现重复的sessionid.

    Session ID不能从硬盘上的Cookie文件获得,如果想在客户端获知自己的Session ID,只能通过Javascrīpt来读取。

 

2.4 php使用及设置

        Session_start() :开始一个会话或者返回已经存在的会话。在使用Session_start()之前浏览器不能有任何输出,否则会发生以下错误。你可以在php.ini里   启动session.auto_start=1,这样就无需每次使用session之前都要调用session_start()。

如果在session.auto_start=1,会让session_save_path (‘./t/’);变的无效。因为后一条语句须放前面。

 

2.5 增加PHP的Session存储和处理能力

      ;session.save_path = “N;MODE;/path”  这项设置提供给我们可以给session存放目录进行多级散列,其中“N”表示要设置的目录级数,

      “MODE”表示目录的权限属性,默认为600

 

 2.6:多服务器共享php的SESSION

    1、NFS或者Samba共享的方法,让各个服务器上存放session文件的磁盘共享,这种方法简单可行。

    2、集中存储到数据库中,这是比较多的实现方法,通过php提供的session_set_save_handler()函数来重定义session函数,推荐使用这种方法。

 

三: cookie知识

     什么是 Cookie?其工作原理如何?Cookie 是一小段文本信息,伴随着用户请求和页面在 Web 服务器和浏览器之间传递。用户每次访问站点时,Web 应用程序都可以读取 Cookie 包含的信息。 Cookie 的基本工作原理如果用户再次访问站点上的页面,当该用户输入 URLwww.*****.com时,浏览器就会在本地硬盘上查找与该 URL 相关联的 Cookie。如果该 Cookie 存在,浏览器就将它与页面请求一起发送到您的站点。Cookie 有哪些用途?最根本的用途是:Cookie 能够帮助 Web 站点保存有关访问者的信息。更概括地说,Cookie 是一种保持Web 应用程序连续性(即执行“状态管理”)的方法.使 Web 站点记住您.

1、客户端执行程序请求 服务器发回请求结果 并且生成一个cookie给客户端 所以 第二次刷新的时候 才会有cookie的出现
2、session是保存在内存中,跟进程是同时存在的会话cookie,但是此时服务器端还保存有session文件 需要设置时间来删除session文件
3、Cookie是在本地Cookie文件中保存一些信息,Cookie文件中保存的是键值对(key-value)。Cookie文件存放于你本地计算机系统盘的Document   and   Settings/用户名   目录下。如果你访问的网站的名称为www.abc.com,那么一般来说,Cookie文件的名称为   用户名@abc.com,你可以自己打开文件夹看一看。你提到的getName获得的是保存在Cookie文件中某一个Cookie的key值。

我们知道,session是在服务器端保持用户会话数据的一种方法,对应的cookie是在客户端保持用户数据。HTTP协议是一种无状态协议,服务器响应完之后就失去了与浏览器的联系,最早,Netscape将cookie引入浏览器,使得数据可以客户端跨页面交换,那么服务器是如何记住众多用户的会话数据呢?
首先要将客户端和服务器端建立一一联系,每个客户端都得有一个唯一标识,这样服务器才能识别出来。建议唯一标识的方法有两种:cookie或者通过GET方式指定。默认配置的PHP使用session的时会建立一个名叫”PHPSESSID”的cookie(可以通过php.ini修改session.name值指定),如果客户端禁用cookie,你也可以指定通过GET方式把session id传到服务器(修改php.ini中session.use_trans_sid等参数)。
我们查看服务器端session.save_path目录会发现很多类似sess_vv9lpgf0nmkurgvkba1vbvj915这样的文件,这个其实就是session id “vv9lpgf0nmkurgvkba1vbvj915〃对应的数据。真相就在这里,客户端将session id传递到服务器,服务器根据session id找到对应的文件,读取的时候对文件内容进行反序列化就得到session的值,保存的时候先序列化再写入。

三、HttpSession

1. 概念

1)含义:在Web开发环境中,session 是指一类用来在客户端与服务器之间保持状态的解决方案。有时候也用来指这种解决方案的存储结构。

2)机制:采用在服务器端保持HTTP状态信息。

3)原理:

  • 创建一个 session 时先检查这个客户端的请求里是否包含了一个 session 标识(即sessionID),即请求里是否存放了名为"JESESSIONID",值为 sessionID 的 cookie

  • 若已存在就检索出来使用,

  • 否则为此客户创建一个 session,并生成一个与此 session 相关联的 sessionID,用 set-cookie 方式传递给请求,那么下一次请求发出时,就会使用此 sessionID 作为 cookie 中名为"JESESSIONID"的值进行传递 sessionID。

4)保存方式:最常用的是用 cookie 保存。但如果 cokkie 被禁用,必须有其他机制进行保存。如URL重写:把 sessionID 附加在URL路径后面。

5)注意:由于是通常是用 cookie 来保存的,所以如果让 cookie 持久化就可以在重启浏览器后也能获取到该 sessionID。

//用持久化cookie保存sessionIDCookie cookie = new Cookie("JESESSIONID",session.getId());
cookie.setMaxAge(20);
response.addCookie(cookie);
登录后复制

 

2. Session的创建

1) Session 属性

  • 若 page 指定的 Session 属性默认为 true,那么 第一次访问一个 WEB 应用的一个 JSP 页面时,该页面都必须有一个和这个请求相关联的 Session 对象。

  • 否则JSP 页面不会要求一定有一个 Session 对象和当前的 JSP 页面相关联,所以第一次访问JSP页面时不会创建一个 Session。

2)request.getSession(boolean flag):

  • true,则一定会返回一个 HttpSession 对象,如果已经有和当前 JSP 页面关联的 HttpSession对象,直接返回;如果没有,则创建一个新的返回。

  • false,则若没有和当前JSP页面关联的 HttpSession 对象返回null,否则返回取得的HttpSession对象。

  • request.getSession() 相当于 request.getSession(true)。

 

3. Session对象的销毁

1)调用HttpSession 的 invalidate()方法。

2)HttpSession 超过过期时间自动销毁,可以在 Tomcat 的 web.xml 文件中配置 Session 的最大时效, 单位是分钟。

<!-- apache-tomcat-x.x.xx\conf\web.xml --><session-config><session-timeout>30</session-timeout></session-config>
登录后复制

 

相关方法签名:

  • int getMaxInactiveInterval()                         //返回最大时效,单位:秒

  • void setMaxInactiveInterval(int interval)      //设置最大时效

3)服务器卸载当前 WEB 应用。

 

4.Session相关方法

String getId()                                                       //得到sessionID

boolean isNew()                                                  //该session是不是新创建的

long getCreationTime()                                       //该session被创建的时间

long getLastAccessedTime()                              //该session最后一次被访问的时间

void setAttribute(String key, Object value)         //存放值,相当于哈希表

Object getAttrbute(String key)                           //根据键从session中取得对应的值

 

5.URL重写实现Session跟踪

方法签名:String encodeURL(String url)  //该方法会在URL后面加上sessionID

重新登录
登录后复制
登录后复制
重新登录
登录后复制
登录后复制

 

以上就是cookie和session的会话和会话状态讲解的详细内容,更多请关注php中文网其它相关文章!

我们今天的关于具有HttpSessionListener的会话计数器和会话计数变量访问session会话技术的分享就到这里,谢谢您的阅读,如果想了解更多关于HttpSessionListener和HttpSessionAttributeListener区别、servletContextListener、httpSessionListener和servletRequestListener使用整理、asp.net – 如何使用PowerShell了解IIS中托管的特定网站的活动会话计数、cookie和session的会话和会话状态讲解的相关信息,可以在本站进行搜索。

本文标签: