http session

1. 什么是session?
1.1. 定义

提供了一种在多个页面请求或对网站的访问中识别用户并存储有关该用户的信息的方法。

理解http session是什么,就需要理解session的本质。session即“会话”,生活中张三与李四进行一次会话,他们可能会以互相问答的形式持续好多次。这个过程就是一次session。 http请求采用client的request 和 server的response 作为会话过程的载体,这种典型的B/S模式下的client和server就好比张三和李四。

相比张三和李四的记忆力,不幸的是http是无状态的(stateless)。这导致http的下一次request根本不知道上一次request是谁,或者其他信息。

这里有三种方案可以存储这些信息,或者说三个地方,分别是:


http session
  • 客户端
    cookie就是客户端存储信息的实现,可以参考:https://www.jianshu.com/p/fe0a4b5943e3。客户端存储信息的方式,显然会随着客户端的关闭清除信息,这不利于服务端对用户信息的获取,一些场景下我们还是希望服务端可以存储用户信息的。
  • 过程中
    当然我们也可以在url中携带一些参数,这些参数包含了上一个请求的信息,比如http://example.com/myPage?asd=lol&boo=no。这种方式显然无法存储信息,只能让信息作为参数在多个request间传递。
  • 服务端
    如果我们可以在客户端存储用户的一些信息,当用户访问时,我们就可以进行身份认证或者其他操作。这种思想促成了http session的产生。

对比以上三种方案,显然服务端存储更加利于会话信息的存储,具体一点,当发起http请求我们可以选择服务端存储session对象,其中可以包含一些信息。然后返回session id,客户端在接下来的调用加入sessionid,传入客户端。客户端就可以跟绝sessionid确认请求者的信息,从而实现身份认证等功能。

1.2. java实现

显然,每种语言都可以对session有自己的实现,java提供了一个接口HttpSession,https://docs.oracle.com/javaee/7/api/javax/servlet/http/HttpSession.html

jdk是这样解释的:servlet 容器使用此接口在 HTTP 客户端和 HTTP 服务器之间创建会话。 会话持续指定的时间段,跨越来自用户的多个连接或页面请求。 一个会话通常对应一个用户,他可能多次访问一个站点。 服务器可以通过多种方式维护会话,例如使用 cookie 或重写 URL。

该接口允许 servlet

  • 查看和操作有关会话的信息,例如会话标识符、创建时间和上次访问时间
    将对象绑定到会话,允许用户信息跨多个用户连接保持
  • 当应用程序在会话中存储对象或从会话中删除对象时,会话会检查该对象是否实现了 HttpSessionBindingListener。如果是,servlet 会通知对象它已绑定到会话或从会话中解除绑定。在绑定方法完成后发送通知。对于失效或过期的会话,在会话失效或过期后发送通知。
1.3. 总结

session的本质是会话跟踪技术的一种,它就是一种保存上下文信息的机制,它是针对每一个用户的,变量的值保存在服务器端,通过SessionID来区分不同的客户,session是以cookie或URL重写为基础的,默认使用cookie来实现,系统会创造一个名为JSESSIONID的输出返回给客户端Cookie保存。

1.4. 一些疑问
  1. session存储在什么地方?

存储在服务器的内存中,tomcat的StandardManager类将session存储在内存中,也可以持久化到file,数据库,memcache,redis等。客户端只保存sessionid到cookie中,而不会保存session,session销毁只能通过invalidate或超时,显然关掉浏览器并不会关闭session。

  1. 什么时候创建了session?

不同语言实现的应用程序有不同创建Session的方法,而在Java中是通过调用HttpServletRequest的getSession方法(使用true作为参数)创建的。在创建了Session的同时,服务器会为该Session生成唯一的Session id,而这个Session id在随后的请求中会被用来重新获得已经创建的Session;在Session被创建之后,就可以调用Session相关的方法往Session中增加内容了,而这些内容只会保存在服务器中,发到客户端的只有Session id;当客户端再次发送请求的时候,会将这个Session id带上,服务器接受到请求之后就会依据Session id找到相应的Session,从而再次使用之。

  1. 保存session id的方式
  1. 保存sessionid的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。
  2. 由于cookie可以被人为的禁止,必须有其它的机制以便在cookie被禁止时仍然能够把sessionid传递回服务器,经常采用的一种技术叫做URL重写,就是把sessionid附加在URL路径的后面,附加的方式也有两种,一种是作为URL路径的附加信息,另一种是作为查询字符串附加在URL后面。网络在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个sessionid。
2. 如何使用session?
2.1. servlet中如何新建http session?

在Servlet中,你肯定用过下面这句话,
HttpSession session = request.getSession();
如果当前没有session,则会立刻建立一个session;
如果有session则返回当前session。
这句话和
HttpSession session = request.getSession(true);
的效果是一样的。
但是如果你写成
HttpSession session = request.getSession(false);
则不会自动建立session。
若当前没有session,你所得到的seesion只会是一个null。
显然session是调用getSession方法产生的。
相应的jsp中没有显式的使用 <% @page session="false"%> 关闭session,则JSP文件在编译成Servlet时将会自动加上这样一条语句
HttpSession session = HttpServletRequest.getSession(true);
这也是JSP中隐含的session对象的来历。

2.2. http session的属性

获取到HttpSession对象后,我们就需要使用HttpSession的某些方法去设置和更改某些参数了。如:
void setAttribute(String name, Object value);
Object getAttribute(String name);
void removeAttribute(String name);
还有另外一个常用的设置:session.setMaxInactiveInterval(5); 可以用来设置过期时间。
更多细节可以参考jdk:https://docs.oracle.com/javaee/7/api/javax/servlet/http/HttpSession.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容