会话概述

什么是会话

简单的理解:用户打开浏览器,点击多个超链接,访问Web服务器上多个资源,然后关闭浏览器,整个过程称之为一次会话。

需要解决的问题

每个用户在使用浏览器与服务器会话的过程中,会产生一些用户数据,如用户登陆标记,WEB应用程序必须要为每个用户在一次或多次会话过程中保存这些数据。

两种技术

  • Cookie
    Cookie是客户端技术,WEB应用程序把每个用户数据以Cookie的形式发送给各自的的浏览器,当用户使用浏览器再次访问WEB应用时,就会带上这些Cookie,这样,WEB应用可以为每个用户分别处理各自的数据了。
  • HttpSession
    简称Session,是服务器端技术,服务器在运行时为每个用户的浏览器创建一个其独享的HttpSession对象。由于用户各自独享session,所以可以把各自的数据存放在各自的session域中,当用户去访问当前web应用其他web资源时,其他web资源再从用户各自的session中取出数据为其服务。

    Cookie类

    1、javax.servlet.http.Cookie
    Cookie的属性:

  • name:必须的,Cookie名

  • value:必须的,Cookie名对应的数据
  • comment:可选,备注
  • path:默认值就是产生Cookie的Servlet对应的URI

有一个cookie它的路径是:/app/servlet/
当浏览器访问的新资源的路径是:/app/1.jsp
问?浏览器会将该cookie带给1.jsp吗?不会

当浏览器访问的新资源的路径是:/app/servlet/a/b/ServletDemo1
问?浏览器会将该cookie带给ServletDemo1吗?

总结:在访问一个资源时,带不带已有的cookie。访问的资源路径.startsWith(cookie的path),如果为true,则会带

如果把一个Cookie的path设置成了/app/,说明访问/app/下面的任何资源,都会带cookie过去。

  • domain:默认就是产生Cookie的Servlet所在的网站域名

    加入cookie的domain是www.baidu.com
    访问http://www.163.com带不带?不带

  • maxAge:标识cookie的生命周期。默认是一次会话

要想在客户端的缓存中保存住Cookie的数据,增大它的存活时间。单位是秒
如果取值为0,就是要删除之。

  • version:可选,Cookie的版本

2、服务器向客户端写Cookie
response.addCookie(Cookie cookie);对应设置响应头的“Set-Cookie”

3、获取客户端提交过来的Cookie
Cookie[] cookies = request.getCookies();接着遍历cookies数组确定所需的Cookie

4、如何唯一确定一个Cookie(有同名Cookie情况)
通过domain+path+name,可以确定唯一一个Cookie

5、其他

  • 一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器可以存储多个WEB站点提供的Cookie
  • 浏览器一般只允许存放300个cookies,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB
  • 如果创建一个Cookie,并发送到浏览器,默认情况是一个会话级别的cookie,即只存在浏览器的内存中。若需要存储在磁盘上则需要设置maxAge属性为大于0的数值,单位为秒。为0则是告诉浏览器删除该cookie。
  • 删除cookie时,path必须一致,否则删除不成功

HttpSession类

javax.servlet.http.HttpSession HttpSession技术实际上还是利用Cookie技术

1、获得HttpSession对象:

HttpSession session = request.getSession();

每一个HttpSession对象都有一个唯一的ID
为了标识每一个客户端,实际上向客户端写了一个特殊的Cookie:

  • 该Cookie的name为固定的“JSESSIONID”
  • 该Cookie的value为HttpSession对象的id
  • 该Cookie的path为当前应用路径

request.getSession()方法详解:

  • 如果用户带着一个名称叫做JSESSIONID的Cookie过来了,先按照ID到服务器内存中找对应的HttpSession对象,
  • 没找到或者浏览器没有带,则创建一个新的HttpSession对象,亦即有了新的ID,同时写给客户端JSESSION=sessionid;
  • 如果找到了,返回该HttpSession对象,继续为用户服务。

request.getSession(boolean b):如果b为true,作用等同于request.getSession()。 如果b为false,作用只是获取。找不到则返回null。

session.invalidate():立刻摧毁服务器中的HttpSession对象。

2、HttpSession本身是一个域对象

void setAttribute(String name,Object obj) 设置属性
void removeAttribute(String name) 移除属性
Object getAttribute(String name) 获取属性

3、HttpSession生命周期

3.1 客户端向服务器第一次发送请求的时候,request中并无sessionID.
3.2 此时server端会创建一个session对象,并分配一个sessionID,serssion对象会保存在服务器端。此时session的状态处于new state状态,如果调用session.isNew(),则返回true
3.3 当服务器段处理完毕后,将此sessionID,以Cookie的形式传到客户段。
3.4 当客户段再次发送请求时,会将sessionID 同request参数一起发送,传递给服务器端。
3.5 服务器端可以根据传递过来的sessionID将这次请求(request)与保存在服务器端的session对象联系起来,此时的session已不处于new state状态,如果调用session.isNew(),则返回false.
3.6 循环3-5 ,直到session超时或被销毁。

4、HttpSession对象的状态转换

HttpSession对象默认超时为30分钟。
4.1 更改HttpSession的默认超时时间:
在web.xml中配置

1
2
3
<session-config>
<session-timeout>1</session-timeout><!--单位为1分钟-->
</session-config>

4.2 HttpSession对象状态

Java会话(session)管理的更多相关文章

  1. cisco telnet会话SESSION管理及相关Dynagen配置文件

    #Lab 2-5 autostart = False [localhost] [[2621]] ram = 64 image = C:\Program Files (x86)\Dynamips\ima ...

  2. 通过Spring Session实现新一代的Session管理

    长期以来,session管理就是企业级Java中的一部分,以致于我们潜意识就认为它是已经解决的问题,在最近的记忆中,我们没有看到这个领域有很大的革新. 但是,现代的趋势是微服务以及可水平扩展的原生云应 ...

  3. 转:通过Spring Session实现新一代的Session管理

    长期以来,session管理就是企业级Java中的一部分,以致于我们潜意识就认为它是已经解决的问题,在最近的记忆中,我们没有看到这个领域有很大的革新. 但是,现代的趋势是微服务以及可水平扩展的原生云应 ...

  4. MyBatis之会话Session原理

    MyBatis 之会话 Session 执行逻辑 1.SQL 会话工厂构建器类 SqlSessionFactoryBuilder 的 build 方法用于构建 SqlSessionFactory 类的 ...

  5. 通过 Spring Session 实现新一代的 Session 管理

    长期以来,session 管理就是企业级 Java 中的一部分,以致于我们潜意识就认为它是已经解决的问题,在最近的记忆中,我们没有看到这个领域有很大的革新. 但是,现代的趋势是微服务以及可水平扩展的原 ...

  6. Redis-基本概念、java操作redis、springboot整合redis,分布式缓存,分布式session管理等

    NoSQL的引言 Redis数据库相关指令 Redis持久化相关机制 SpringBoot操作Redis Redis分布式缓存实现 Resis中主从复制架构和哨兵机制 Redis集群搭建 Redis实 ...

  7. Java通过遍历sessionId获取服务器所有会话session

    Servlet2.1之后不支持SessionContext里面getSession(String id)方法,也不存在遍历所有会话Session的方法.但是,我们可以通过HttpSessionList ...

  8. 使用SpringSession管理分布式系统的会话Session

    在我方供应链项目分布式部署的环境下,需要在统一网关服务中管理访问的Session,即无论访问请求路由到哪一个网关服务环境,使用的都是相同的HttpSession,这样就保证了在用户登录之后,能够使用统 ...

  9. java web Session会话技术(原理图解+功能+与Cookie的区别+基本使用)

    java web Session会话技术(原理图解+功能+与Cookie的区别+基本使用) 这是我关于会话技术的第二篇文章,对 Cookie有不了解的兄弟可以点击下方的Cookie跳转 Cookie链 ...

  10. redis 与java的连接 和集群环境下Session管理

    redis 的安装与设置开机自启(https://www.cnblogs.com/zhulina-917/p/11746993.html)  第一步: a) 搭建环境 引入 jedis jar包 co ...

随机推荐

  1. Python网络爬虫之BeautifulSoup模块

    一.介绍: Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮 ...

  2. CodeForces 719A Vitya in the Countryside (水题)

    题意:根据题目,给定一些数字,让你判断是上升还是下降. 析:注意只有0,15时特别注意一下,然后就是14 15 1 0注意一下就可以了. 代码如下: #pragma comment(linker, & ...

  3. CentOS-用户的管理

    用户组及配置文件 用户的类型 Linux是一个多用户.多任务的操作系统,如果要使用系统资源,就必须向系统管理员申请一个用户,通过这个用户进入系统,通过建立不同属性的用户实现不同的作用或权限,可以合理利 ...

  4. E20180419-hm

    rectangle n. [数] 长方形,矩形; ratio n. 比例; 比,比率; 系数;  vt. 求出比值,除,使…成比例; 将(相片)按比例放大[缩小]; aspect  n. 方面; 面貌 ...

  5. sublime text3 注册码

    —– BEGIN LICENSE —– TwitterInc 200 User License EA7E-890007 1D77F72E 390CDD93 4DCBA022 FAF60790 61AA ...

  6. AT2534 港湾設備 (Port Facility)

    洛谷 先膜一下Iscream巨巨 首先我们可以把题目转化为线段覆盖,如果两条线段相交(不算某一条完全在另一条里面的情况),那么这两条线段代表的集装箱就不能放到同一个栈里,我们在它们之间连一条边.如果图 ...

  7. LuoguP2846[USACO08NOV]光开关Light Switching【线段树维护区间异或】By cellur925

    题目传送门 题目大意,给你一串灯,按一下开关可以将灯的状态取反(开变成关,关变成开).维护这个序列的两种操作:询问区间内有多少灯是开着的,区间按灯. 开始想的是分别维护区间内0的数量,1的数量,两个懒 ...

  8. OpenCv图像像素操作

    1:像素 有两种直接操作像素点的方法: 第一种: 将其转化为numpy.array格式,直接进行操作. 第二种:使用Opencv提供的Get1D,Get2D等函数. 2:获取行和列像素 有一下四个函数 ...

  9. A. Banana (2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛)

    题目大意是有一堆猴子,然后每个猴子都有自己喜欢的香蕉类型,然后香蕉会在指定的位置,问每个猴子能不能在每个地方吃到自己喜欢的香蕉. 其实直接暴力即可(因为最大最大最大是50) 上代码: #include ...

  10. c++ 优先级大全

    重置优先级