Java 之 Session
Session
一、Session 概述
1、Session 就是一个接口(HttpSession)。
2、Session技术:服务器端会话技术,它是用来维护一个客户端和服务器之间关联的一种技术。
3、每个客户端都要一个自己的 Session 会话,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象(HttpSession)中。
4、Session 会话中,经常用来保存用户登录之后的信息。
Session的作用就是在服务器端保存一些用户的数据,然后传递给用户一个名字为JSESSIONID的Cookie,这个JESSIONID对应这个服务器中的一个Session对象,通过它就可以获取到保存用户信息的Session。
二、Session 的工作原理
1、Session 的创建
(1)Session的创建时机是在 request.getSession() 方法第一次被调用时。
(2)Session被创建后,同时还会有一个名为 JSESSIONID 的 Cookie 被创建。
(3)这个 Cookie 的默认时效就是当前会话。
2、Session 的使用
(1)Session被创建后,对应的Cookie被保存到浏览器中,之后浏览器每次访问项目时都会携带该Cookie。
(2)当我们再次调用时会根据该JSESSIONID获取已经存在的Cookie,而不是在创建一个新的Cookie。
(3)如果Cookie中有JSESSIONID,但是JSESSIONID没有对应的Session存在,则会重新创建一个HttpSession对象,并重新设置JSESSIONID。

二、Session 的使用
1、创建与获取 Session
通过 HttpServletRequest 可以获取 HttpSession 对象
方法:
HttpSession session = request.getSession();
注意:当第一次调用该方法,是用于创建 Session 会话;之后再次调用,都是获取前面创建好的 Session 会话对象。
2、获取 id,判断 session 是否为新建
每个 Session 都有一个身份证号,就是 ID值,并且这个 ID 是位置的。
还可以通过 isNew() 方法来判断是不是刚创建出来的 session
方法:
String getId(): 用于获取 session的 id(唯一)
boolean isNew(): 用于判断 session 是不是新建的,true 表示是刚创建的,false 表示获取之前就已经创建了
3、Session 域对象的存取数据
Session 也相当于一个作用域,可以用来存储和获取数据
方法:
Object getAttribute(String name)
void setAttribute(String name, Object value)
void removeAttribute(String name)
二、Session 生命周期控制
基本原则:Session 对象在服务器端不能长期保持,它是有时间限制的,超过一定时间没有被访问过的 Session 对象就应该释放掉,以节约内存。
两个常用方法:
public void setMaxInactiveInterval(int interval):设置 session的超时时间(以秒为单位)超过指定的时长,session 就会被销毁;
设置值为正数的时候,设定 session 的超时时长;值为负数或为零表示永不失效
public void invalidate():让当前 session 会话马上超时无效;
1、Session 的默认的超时时长是多少?
Session 默认的超时时间长为 30分钟。
在 Tomcat 服务器的下的 conf目录下的配置文件 web.xml 中默认有以下的配置,它就表示配置了当前 Tomcat 服务器下所有的 Session 超时配置默认时长 30分钟。
Tomcat 中的配置:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
2、如何给web工程设置超时时长?
在自己的 Web 工程中的 web.xml 配置中可以配置 session 的超时时长,这样就可以修改 web 工程下所有 Session 的默认超时时长。
超时时长配置:
<!--表示当前 web 工程。 创建出来 的所有 Session 默认是 20 分钟 超时时长-->
<session-config>
<session-timeout>20</session-timeout>
</session-config>
3、如何给个别的 session 设置超时?
如果只想修改个别的 session 的超时时长,就可以使用上面的 setMaxInactiveInterval(int interval) 来进行单独的设置。
session.setMaxInactiveInterval(int interval)单独设置超时时长。
4、Session 的超时是什么?
Session 的超时是指,客户端两次请求的最大间隔时长。

Demo:
// session 3秒后超时
protected void life3(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 先获取 Session 对象
HttpSession session = req.getSession();
// 设置当前 Session3 秒后超时
session.setMaxInactiveInterval(3);
resp.getWriter().write("当前 Session 已经设置为 3 秒后超时");
} //Session 马上被超时示例:
protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 先获取 Session 对象
HttpSession session = req.getSession();
// 让 Session 会话马上超时
session.invalidate();
resp.getWriter().write("Session 已经设置为超时(无效) ");
}
5、如何强制释放 Session?
session.getMaxInactiveInterval():该方法可以让 session 立刻失效
6、可以使 Session 对象释放的情况有什么?
(1)当 Session 对象空闲时间达到了目标设置的 最大值,自动释放;
(2)Session 对象被强制失效;
(3)Web 应用卸载;
(4)服务器进程停止;
三、Session 原理
Session 技术,底层实现是基于 Cookie 技术来实现的。
原理示意图:

四、Session 细节
1、当客户端关闭后,服务器不关闭,两次获取 session 是否为同一个?
默认情况下不是同一个对象。
如果需要相同,则可以创建 cookie对象,键为 JSESSIONID,设置最大存活时间,让 cookie 持久化保存。
代码实现:
Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(60*60);
response.addCookie(c);
2、客户端不关闭,服务器关闭后,两次获取的 session 是同一个吗?
不是同一个,但是要确保session中数据不丢失。Tomcat 会自动完成以下工作
(1)session的钝化
在服务器正常关闭之前,将 session 对象系列化到硬盘上。
(2)session的活化
在服务器启动后,将 session 文件转化为内存中的 session 对象。
3、session 什么时候被销毁?
(1)服务器关闭时,session 对象被销毁
(2)session 对象调用 invalidate(),session 自动销毁
(3)session 默认失效时间,30分钟。可以在 web.xml 配置文件中进行修改
<session-config>
<session-timeout>30</session-timeout>
</session-config>
五、URL 重写
在整个会话控制技术体系中,保持 JSESSIONID 的值主要通过 Cookie 实现,但 Cookie 在浏览器端可能会被禁用,所以还需要一些备用的技术手段,如:URL 重写。
URL 重写其实就是将 JSESSIONID 的值以固定格式附着在 URL 地址后面,以实现保持 JSESSIONID,进而保持会话状态。
固定格式是:
URL;jsessionid=xxxxxxxxx
例如:
targetServlet;jsessionid=F9C893D3E77E3E8329FF6BD9B7A09957
实现方式:
response.encodeURL(String)
response.encodeRedirectURL(String)
例如:
//1.获取Session对象
HttpSession session = request.getSession(); //2.创建目标URL地址字符串
String url = "targetServlet"; //3.在目标URL地址字符串后面附加JSESSIONID的值
url = response.encodeURL(url); //4.重定向到目标资源
response.sendRedirect(url);
六、Session 的活化和钝化
Session 机制很好的解决了 Cookie 的不足,但是当访问应用的用户很多时,服务器上就会创建非常多的 Session 对象,如果不对这些 Session 对象进行处理,那么在 Session 失效之前,这些 Session 一直都会在服务器的内存中存在,那么就出现了 Session 活化和钝化的机制。
Session 的钝化:Session 在一段时间内没有被使用时,会将当前存在的 Session 对象序列化到磁盘上,而不再占用服务器内存空间;
Session 的活化:Session 被钝化后,服务器再次调用 Session 对象时,将 Session 对象由磁盘加载到服务器内存中使用。
注意:如果希望 Session 域中的对象也能够随着 Session 钝化过程一起序列化到磁盘上,则对象的实现类也必须实现 java.io.Serializable 接口。不仅如此,如果对象中还包含其他对象的引用,则被关联的对象也必须支持序列化,否则会抛出异常:java.io.NotSerializableException,如果没有实现该接口,只能被序列化,不能被反序列化。
五、Session的特点
(1)session 用于存储一次会话的多次请求的数据,存在服务器端
(2)session 可以存储任意类型,任意大小的数据
session 与 cookie 的区别:
(1)session 存储数据在服务器端,cookie 在客户端;
(2)session 么有数据大小限制,cookie 有限制;
(3)session 数据安全,cookie 相对于不安全;
Java 之 Session的更多相关文章
- Java操作Session与Cookie
1,Java操作Session Java操作Session非常简单,步骤如下 1.1,在servlet中通过request获取session HttpSession session = request ...
- 转!!Java设置session超时(失效)的时间
Java设置session超时(失效)的时间 在一般系统登录后,都会设置一个当前session失效的时间,以确保在用户长时间不与服务器交互,自动退出登录,销毁session具体设置的方法有三种:1 ...
- java web Session会话技术(原理图解+功能+与Cookie的区别+基本使用)
java web Session会话技术(原理图解+功能+与Cookie的区别+基本使用) 这是我关于会话技术的第二篇文章,对 Cookie有不了解的兄弟可以点击下方的Cookie跳转 Cookie链 ...
- Java设置session超时(失效)的三种方式
1. 在web容器中设置(此处以tomcat为例) 在tomcat-6.0\conf\web.xml中设置,以下是tomcat 6.0中的默认配置: <!-- ================= ...
- java web session监听销毁跳转
1.了解如何使用HttpSessionListener监听session的销毁. 2.了解如何使用HttpSessionBindingListener监听session的销毁. 一. 使用HttpSe ...
- Java Web Session设置
一.前言 在做 java web项目时,我们很多时候都要用到 Session,那么我就简单的写一下 Session 的写法. 二.代码实现 Servlet Session 的设置 package co ...
- Java设置session超时(失效)的时间
在一般系统登录后,都会设置一个当前session失效的时间,以确保在用户长时间不与服务器交互,自动退出登录,销毁session具体设置的方法有三种:1.在web容器中设置(以tomcat为例)在tom ...
- java web session过期 跳转页面没有跳出frame的问题
对于frame页面框架的java web项目,如果session过期执行跳转操作时,只在一个frame中(例如center frame)跳转到设置的login页面了,为了能直接跳转到最初的登录页面,就 ...
- java mail session使用Properties的clone方法
/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreem ...
- Java 之 Session 包含验证码登录案例
需求: 1. 访问带有验证码的登录页面login.jsp 2. 用户输入用户名,密码以及验证码. 如果用户名和密码输入有误,跳转登录页面,提示:用户名或密码错误 如果验证码输入有误,跳转登录页面, ...
随机推荐
- linux查找历史命令
1.ctr+r 输入搜索关键词 2.&history 3.上箭头翻看
- java 把 PEM 格式的公钥证书转换为 X.509 格式的证书
代码: @UtilityClass public final class X509Certs { private static final CertificateFactory CERTIFICATE ...
- Linux虚拟机:发布WebService接口出现异常,无法访问接口
Linux虚拟机:发布WebService接口出现异常,无法访问接口 今天在部署WebService工程的时候遇到的问题: 在Linux虚拟机上部署一个tomcat同时在tomcat下放置2个工程,其 ...
- 【C++】C++中的类模板
基础的类模板 模板类的继承 内部声明定义普通模板函数和友元模板函数 内部声明友元模板函数+外部定义友元模板函数 声明和定义分别在不同的文件(模板函数.模板友元) C++中有一个重要特性,那就是模板类型 ...
- C语言 按位异或实现加法
/* C语言 按位异或实现加法 */ #include <stdio.h> #include <stdlib.h> #include <string.h> void ...
- 使用gevent包实现concurrent.futures.executor 相同的公有方法。组成鸭子类
类名不同,但公有方法的名字和提供的基本功能大致相同,但两个类没有共同继承的祖先或者抽象类 接口来规定他,叫鸭子类. 使并发核心池能够在 threadpoolexetor和geventpoolexecu ...
- 容器docker快速入门
一.概述 什么是docker docker是一个应用容器引擎,通俗的讲,docker和我们的vm虚拟机有很多相似的地方,当然也有很多不同的地方 Docker理念是将应用及依赖包打包到一个可移植的容器中 ...
- 为什么0x00400000是可执行文件的默认基址?EXE base address start with 400000H,Why is 0x00400000 the default base address for an executable?
DLL的默认基址是0x10000000,但EXE的默认基址是0x00400000.为什么EXE特别值?4 兆字节有什么特别之处它与x86上单页目录条目映射的地址空间量和1987年的设计决策有关.对EX ...
- elk配置路径
elk/usr/local/etc/elasticsearch-6.5.1/usr/local/Cellar/logstash/6.5.1/./logstash -f/usr/local/Cellar ...
- maven工程仿springboot手写代码区分开发测试生产
读取代码: package com.jz.compute.mc.v2.config; import java.util.Enumeration; import java.util.ResourceBu ...