session的机制



http是无状态的协议,客户每次读取web页面时,server都打开新的会话,并且server也不会自己主动维护客户的上下文信息,那么要怎么才干实现会话跟踪呢?session就是一种保存上下文信息的机制,它是针对每个用户的,变量的值保存在server端,通过SessionID来区分不同的客户,session是以cookie或URL重写为基础的,默认使用cookie来实现,系统会创造一个名为JSESSIONID的输出返回给clientCookie保存。



保存session id的几种方式



A.保存session id的方式能够採用cookie,这样在交互过程中浏览器能够自己主动的依照规则把这个标识发送给server。

B.因为cookie可以被人为的禁止,必须有其他的机制以便在cookie被禁止时仍然可以把session id传递回server,常常採用的一种技术叫做URL重写,就是把session id附加在URL路径的后面,附加的方式也有两种,一种是作为URL路径的附加信息,还有一种是作为查询字符串附加在URL后面。网络在整个交互过程中始终保持状态,就必须在每一个client可能请求的路径后面都包括这个session id。

C.还有一种技术叫做表单隐藏字段。就是server会自己主动改动表单,加入一个隐藏字段,以便在表单提交时可以把session id传递回server。



session何时被删除



session在下列情况下被删除:

A.程序调用HttpSession.invalidate()

B.距离上一次收到client发送的session id时间间隔超过了session的最大有效时间

C.server进程被停止



再次注意关闭浏览器仅仅会使存储在client浏览器内存中的session cookie失效,不会使server端的session对象失效。



URL重写有什么缺点



对全部的URL使用URL重写,包含超链接,form的action,和重定向的URL。每一个引用你的网站的URL,以及那些返回给用户的URL(即使通过间接手段,比方server重定向中的Location字段)都要加入额外的信息。

这意味着在你的网站上不能有不论什么静态的HTML页面(至少静态页面中不能有不论什么链接到网站动态页面的链接)。因此,每一个页面都必须使用servlet或JSP动态生成。即使全部的页面都动态生成,假设用户离开了会话并通过书签或链接再次回来,会话的信息都会丢失,由于存储下来的链接含有错误的标识信息-该URL后面的SESSION ID已经过期了。



使用隐藏的表单域有什么缺点



仅当每一个页面都是有表单提交而动态生成时,才干使用这样的方法。单击常规的<A HREF..>超文本链接并不产生表单提交,因此隐藏的表单域仅仅能用于一系列特定的操作中,比方在线商店的结账过程。



怎样将信息与会话关联起来



setAttribute会替换不论什么之前设定的值;假设想要在不提供不论什么取代的情况下移除某个值,则应使用removeAttribute。这种方法会触发全部实现了HttpSessionBindingListener接口的值的valueUnbound方法。



会话属性的类型有什么限制吗



一般会话属性的类型仅仅要是Object就能够了。除了null或基本类型,如int,double,boolean。

假设要使用基本类型的值作为属性,必须将其转换为对应的封装类对象



使用isNew来推断用户是否为新旧用户的错误做法



public boolean isNew()方法假设会话尚未和客户程序(浏览器)发生不论什么联系,则这种方法返回true,这通常是由于会话是新建的,不是由输入的客户请求所引起的。

但假设isNew返回false,仅仅只是是说明他之前以前訪问该Web应用,并不代表他们曾訪问过我们的servlet或JSP页面。

由于session是与用户相关的,在用户之前訪问的每个页面都有可能创建了会话。因此isNew为false仅仅能说用户之前訪问过该Web应用,session能够是当前页面创建,也可能是由用户之前訪问过的页面创建的。

正确的做法是推断某个session中是否存在某个特定的key且其value是否正确



是否仅仅要关闭浏览器,session就消失了



程序一般都是在用户做log off的时候发个指令去删除session,然而浏览器从来不会主动在关闭之前通知server它将要被关闭,因此server根本不会有机会知道浏览器已经关闭。server会一直保留这个会话对象直到它处于非活动状态超过设定的间隔为止。

之所以会有这样的错误的认识,是由于大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个session id就消失了,再次连接到server时也就无法找到原来的session。

假设server设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求报头,把原来的session id发送到server,则再次打开浏览器仍然可以找到原来的session。

恰恰是因为关闭浏览器不会导致session被删除,迫使server为session设置了一个失效时间,当距离客户上一次使用session的时间超过了这个失效时间时,server就能够觉得client已经停止了活动,才会把session删除以节省存储空间。

由此我们能够得出例如以下结论:

关闭浏览器,仅仅会是浏览器端内存里的session cookie消失,但不会使保存在server端的session对象消失,相同也不会使已经保存到硬盘上的持久化cookie消失。



怎样使用会话显示每一个客户的訪问次数



因为客户的訪问次数是一个整型的变量,但session的属性类型中不能使用int,double,boolean等基本类型的变量,所以我们要用到这些基本类型的封装类型对象作为session对象中属性的值

但像Integer是一种不可改动(Immutable)的数据结构:构建后就不能更改。这意味着每一个请求都必须创建新的Integer对象,之后使用setAttribute来取代之前存在的老的属性的值。比如:

HttpSession session = request.getSession();

SomeImmutalbeClass value = (SomeImmutableClass)session.getAttribute(“SomeIdentifier”);

if (value= =null){

value = new SomeImmutableClass(…); // 新创建一个不可更改对象

}else{

value = new SomeImmutableClass(calculatedFrom(value)); // 对value又一次计算后创建新的对象

}

session.setAttribute(“someIdentifier”,value); // 使用新创建的对象覆盖原来的老的对象



怎样使用会话累计用户的数据



使用可变的数据结构,比方数组、List、Map或含有可写字段的应用程序专有的数据结构。通过这样的方式,除非首次分配对象,否则不须要调用setAttribute。比如



HttpSession session = request.getSession();

SomeMutableClass value = (SomeMutableClass)session.getAttribute(“someIdentifier”);

if(value = = null){

value = new SomeMutableClass(…);

session.setAttribute(“someIdentifier”,value);

}else{

value.updateInternalAttribute(…); // 假设已经存在该对象则更新其属性而不需又一次设置属性

}

HttpSession具体解释的更多相关文章

  1. springmvc 注解 配置文件解释

    概述 继 Spring 2.0 对 Spring MVC 进行重大升级后,Spring 2.5 又为 Spring MVC 引入了注解驱动功能.现在你无须让 Controller 继承任何接口,无需在 ...

  2. Java路径操作具体解释

    1.基本概念的理解 绝对路径:绝对路径就是你的主页上的文件或文件夹在硬盘上真正的路径.(URL和物理路径)比如: C:\xyz\test.txt 代表了test.txt文件的绝对路径.http://w ...

  3. struts.xml在Action配置具体解释

    在博客上我已经基本上解释struts.xml基本配置.配置过程最为基本的是action的动态配置. 一.Action的创建方法 1)实现Action接口 2)继承ActionSupport类,覆写当中 ...

  4. webscoket实战之利用httpsession定向推送

    webscoket实战之利用httpsession定向推送 开发框架 springboot 场景 在利用websocket主动推送信息给客户端的过程中,经常会遇到一个普遍需求,就是推送的消息要定向推送 ...

  5. Java中Httpsession是如何实现的?

    HTTP协议(http://www.w3.org/Protocols/)是“一次性单向”协议. 服务端不能主动连接客户端,只能被动等待并答复客户端请求.客户端连接服务端,发出一个HTTP Reques ...

  6. Java进阶(十五)Java中设置session的详细解释

    Java中设置session的详细解释 简单通俗的讲session就是象一个临时的容器,用来存放临时的东西.从你登陆开始就保存在session里,当然你可以自己设置它的有效时间和页面,举个简单的例子: ...

  7. python locust 性能测试:HttpSession

    官网解释:用于在请求之间执行Web请求和保留(会话)cookie的类(以便能够登录和退出网站):记录每个请求,以便locust可以显示统计信息: from locust import TaskSet, ...

  8. WebSocket获取httpSession空指针异常的解决办法

    小坑:使用requestListner解决不了这个问题! 如何获取HttpSession 在使用webSocket实现p2p或者一对多聊天功能的时候我们经常会有这样的需求:webSocket服务端需要 ...

  9. JAVAWEB开发之Session的追踪创建和销毁、JSP具体解释(指令,标签,内置对象,动作即转发和包括)、JavaBean及内省技术以及EL表达式获取内容的使用

    Session的追踪技术 已知Session是利用cookie机制的server端技术.当client第一次訪问资源时 假设调用request.getSession() 就会在server端创建一个由 ...

随机推荐

  1. MIT 三课程

    mit三课程: Introduction to Computer Science and Programming artificial intelligence introduction to alg ...

  2. 我的Python成长之路---第一天---Python基础(5)---2015年12月26日(雾霾)

    六.流程控制 与C语言不通的事Python的流程控制的代码块不是用{}花括号表示的,而是用强制缩进来,而且缩进必须一致,官方推荐是使用4个空格,不建议使用使用tab(制表符)做缩进,一是不同的系统ta ...

  3. Linux下动态库使用

    1. 静态库和动态库的基本概念 静态库,是在可执行程序连接时就已经加入到执行码中,在物理上成为执行程序的一部分:使用静态库编译的程序运行时无需该库文件支持,哪里都可以用, 但是生成的可执行文件较大.动 ...

  4. Atitit.Gui控件and面板----web server区----- web服务器监控面板and控制台条目

    Atitit.Gui控件and面板----web server区----- web服务器监控面板and控制台条目 1. Resin4.0.22 1 2. 查看http连接数::Summary>& ...

  5. 分布式消息系统jafka快速起步(转)

    Jafka 是一个开源的/性能良好的分布式消息系统.在上一篇文章中有所简单介绍.下面是一篇简单的入门文档.更多详细的文档参考wiki. Step 1: 下载最新的安装包 完整的安装指南在这里.最新的发 ...

  6. 暴力或随机-hdu-4712-Hamming Distance

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4712 题目大意: 求n个20位0.1二进制串中,两两抑或最少的1的个数. 解题思路: 两种解法: 1 ...

  7. perl 使用SUPER类来访问覆盖的方法

    有时候,你希望一个衍生类的方法表现得象基类中的某些方法的封装器 这就是 SUPER 伪类提供便利的地方.它令你能够调用一个覆盖了的基类方法,而不用声明 是哪个类定义了该方 法.(注:不要把这个和第十一 ...

  8. 配置开源项目 SlidingMenu 的问题

    最近想研究一下开源项目 SlidingMenu,单是配置项目就花了好长的时间,断断续续的尝试,终于配置成功了,写下来和大家分享一下经验. Step 1:导入依赖的项目和例子 打开项目 File -&g ...

  9. HDU 3966 Aragorn&#39;s Story(树链剖分)

    HDU Aragorn's Story 题目链接 树抛入门裸题,这题是区间改动单点查询,于是套树状数组就OK了 代码: #include <cstdio> #include <cst ...

  10. SSH2三大框架整合出错(四)

    <%@taglib prefix="c" uri="http://java.sun.com/jsf/core" %> usage: java org ...