状态管理-Session

Session

什么是Session(会话)

  • 浏览器访问Web服务器时,服务器会为每一个浏览器在服务器端的内存中分配空间,单独创建一个Session对象,该对象有一个Id属性,其值唯一,一般称之为SessionId,并且服务器会将这个SessionId(使用Cookie的方式)发送给浏览器;浏览器再次访问服务器时,会将Session发送给服务器,服务器可以依据SessionId找到对应的Session对象。

Session工作原理

如何获取Session

HttpSession s = request.getSession(boolean flag);
  • HttpSession是个接口,后面返回的是符合接口规范的对象
  • 当flag为true时:先查看请求中有没有SessionId,如果没有SessionId,服务器创建一个Session对象;如果有SessionId,依据SessionId查找对应Session对象,找到则返回,找不到则创建一个新的Session对象,所以flag为true时,一定能得到一个Session对象
  • 当flag为false时,没有SessionId及有SessionId但没有找到Session对象,均返回null;找到则返回。
HttpSession s = request.getSession()
  • 等价于request.getSession(true)
  • 提供该方法是为了代码书写更方便一些,大部分情况下是不管找没找到都需要返回一个Session对象。

如何使用Session绑定对象

//绑定对象:
void Session.setAttribute(String naem,Object obj);
//获取绑定对象:
Object Session.getAttribute(String name);
//移除绑定对象
void Session.removeAttribute(String name);
/*
注:getAttribute方法的返回值是Object类型,在去除数据时要对其进行数据类型转换,且必须与我们存入的数据类型一致。
*/

如何删除Session对象

  • 立即删除Session对象
Session.invalidate();

Session验证

  • 用户访问需要保护的资源时,可以使用Session验证的方式来保证其安全性,比如要求登录后才能访问的资源
  • 实现Session验证,遵循以下步骤
    • 1、使用Session.setAttribute()先绑定数据
    • 2、使用Session.getAttribute()方式来读取绑定值,如果没有则返回登录页面。

Session超时

什么是Session超时

  • Web服务器会将空闲时间过长的Session对象删除掉,以节省服务器内存空间资源
  • Web服务器缺省的超时时间限制:一般是30分钟

如何修改Session的缺省时间限制

  • 通过修改Tomcat中conf/web.xml文件的设置
<session-config>
    <session-timeout>30</session-timeout>
</session-config>
  • 通过编程的方式来修改
void session.setMaxInactiveInterval(int seconds);

浏览器禁用Cookie的后果

  • 如果浏览器禁用Cookie,Session将不能使用。
  • 服务器在默认情况下,会使用Cookie的方式将SessionId发送给浏览器,如果用户禁用Cookie,则SessionId不会被浏览器保存,此时,服务器可以使用如URL重写这样的方式来发送SessionId。

URL重写

  • 浏览器在访问服务器上的某个地址时,不再使用原来的那个地址,而是使用经过改写的地址(即,在原来的地址后面加上了SessionId)

如何实现URL重写

  • 如果是链接地址和表单提交,使用response.encodeURL(String url)生成重写后的URL
  • 如果是重定向,使用response.encodeRedirectURL(String url)生成重写后的URL

Session的优缺点

  • 优点
    • 安全(将状态保存在服务器端)
    • Session能够保存的数据类型更丰富,Cookie只能保存字符串
    • Session能够保存更多的数据,Cookie大约保存4K
  • 缺点
    • Session将状态保存在服务器端,占用服务器的内存,如果用户量过大,会严重影响服务器的性能

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏码神联盟

NoSQL篇 | NoSQL从小白到码神 之 Redis篇

课程目录: - NoSQL背景 - NoSQL简介 - NoSQL和关系型数据库对比 - Redis简介 - Redis下载安装配置(Linux环境) - R...

70280
来自专栏菩提树下的杨过

ZooKeeper 笔记(3) 实战应用之【统一配置管理】

大型应用通常会按业务拆分成一个个业务子系统,这些大大小小的子应用,往往会使用一些公用的资源,比如:需要文件上传、下载时,各子应用都会访问公用的Ftp服务器。如果...

54050
来自专栏数据库

JDBC常见错误及解决方案

最近很多同学在数据库编程这一块遇到了很多的问题,各种问题都有,但却苦于不知道怎么解决这些问题,以至于编程效率非常低。今天我就来总结一下在数据库编程时经常遇到的问...

25880
来自专栏linux、Python学习

Shell的18条常用命令整理

Linux上的文件以.开头的文件被系统视为隐藏文件,仅用ls命令是看不到他们的,而用ls -a除了显示一般文件名外,连隐藏文件也会显示出来。

10600
来自专栏我思故我在

ABP框架 - 模块系统

15220
来自专栏IT派

Python 的异步 IO:Asyncio 简介

所谓「异步 IO」,就是你发起一个 IO 操作,却不用等它结束,你可以继续做其他事情,当它结束时,你会得到通知。

16030
来自专栏大内老A

通过3个Hello World应用来了解ASP.NET 5应用是如何运行的(2)

对于上面创建的这个Hello World应用来说,程序入口点由应用自身来提供,所以应用本身具有自我执行的能力。从应用托管(Host)的角度来讲,这样的应用同时负...

20680
来自专栏Golang语言社区

Golang语言社区--了解C++ 用libcurl库进行http通讯网络编程

一、LibCurl基本编程框架 二、一些基本的函数 三、curl_easy_setopt函数部分选项介绍 四、curl_easy_perform 函数说明(er...

74190
来自专栏Flutter&Dart

DartVM服务器开发(第十二天)--Jaguar获取请求内容

当路径上为参数时,我们可以在参数名前添加:符号,表面该路径上有一个是参数,下面我们请求一下这个地址吧!

16810
来自专栏有趣的django

Django+xadmin打造在线教育平台(二)

代码 github下载 三、xadmin后台管理 3.1.xadmin的安装 django2.0的安装(源码安装方式): https://github.com...

4.3K80

扫码关注云+社区

领取腾讯云代金券