session 总结(单节点场景)

session 称作域对象,一般保存在当前服务器的内存中,如果有很多session也会部分不常用的session“钝化”到磁盘中,若磁盘中的session又被访问到,会又被“活化”到内存中。

作用:保存一些信息,在一次会话期间使用同一个对象(即通过JSESSIONID判断提取出session对象),所以这个对象可以用来保存共享数据

  1. Cookie 中也可以保存数据,但是Cookie保存在客户端,不安全;同时Cookie数据多会增大传输量,而且浏览器对Cookie的数量有限制,注定不能保存过多信息,这才导致Session机制的出现

  2. Session 的作用就是在服务器端保存一些用户的数据,然后传递给用户一个名字为JSESSIONID 的 Cookie,这个 JESSIONID 对应这个服务器中的一个 Session 对象,通过它就可以获取到保存用户信息的 Session

Session是基于Cookie的

  1. 用户第一次访问Web服务器时,服务器可以为用户创建一个Session域对象(全局),并使用一个全局唯一的jsessionid和这个对象关联,这个对象在真个用户回话期间存活使用。服务端返回的响应体中会增加一项 set-cookie:jsessionid=xxx,用户如果使用的是浏览器,下次及以后的请求中都会携带jsessionid 这个参数,我们使用 request.getSession()的时候,就会使用 jsessionid 取出 session 对象。

Session原理图

sequenceDiagram
participant 浏览器
participant 服务器
浏览器 ->> 服务器: 发起请求
服务器 ->> 服务器: 生成Session对象和对应的JSessionID(全局唯一),全局保存
服务器 ->> 浏览器: 返回的响应体中增加 set-cookie:jsessionid=xxx
浏览器 ->> 服务器: 以后请求都会携带Cookie:JSESSIONID=xxx

在Serlvet中如何获取HTTPSession对象

request.getSession(boolean create);
request.getSession(); //即默认true; request.getSession()等同于 request.getSession(true)

create 为 false, 若没有和当前request的sessionID相关联的 HttpSession 对象, 则返回 null; 若有, 则返回 HttpSession 对象

create 为 true, 一定返回一个 HttpSession 对象. 若没有和当前当前request的sessionID关联的 HttpSession 对象, 则服务器创建一个新的HttpSession 对象返回, 若有, 直接返回关联的.

如何使用Session

获取Session

//request里有sessionID,拿对应的session返回
//若request里没有sessionID,会创建新的sessionID和对应的Session对象
HttpSession session = request.getSession();

其他常用方法:

session.setAttribute("user", new Object()); //存储key-value值
session.getAttribute("user"); //提取user对应的值
session.setMaxInactiveInterval(60*60*24);//秒为单位,设置当前session过期时间

Session 失效控制

1.基本原则

Session对象不可以在服务器上长期保存,它是有时间限制的,超过一定时间没有被访问过的会被释放掉,以节省内存,超时是按照最后一次访问Session对象的时间来计算的。

2.Session对象被释放场景

[1] Session对象的空闲时间达到设置的阈值

[2] Session对象被强制失效

[3] 应用进程停止

3. session设置方法

[1] 在全局 web.xml 中能够找到如下配置:

<session-config>
<session-timeout>30</session-timeout>
</session-config>

[2] 手动设置

session.setMaxInactiveInterval(int seconds)
session.getMaxInactiveInterval()

[3] 强制失效

session.invalidate()

URL重写(Session)问题

在整个会话控制技术体系中,保持 JSESSIONID 的值主要通过 Cookie 实现

当浏览器禁用Cookie时,当前方案将失效,需要采用URL重写方案

1. 如何判断浏览器禁用了Cookie(两种方式)

[1] 客户端JS来判断

<script>
function CookieEnable() {
var result=false;
if(navigator.cookiesEnabled) return true; document.cookie = "testcookie=yes;";
var cookieSet = document.cookie; if (cookieSet.indexOf("testcookie=yes") > -1) result=true; document.cookie = "";
return result;
} if(!CookieEnable()){
alert("对不起,您的浏览器的Cookie功能被禁用,请开启");
}
</script>

[2] 服务端判断(最好还是客户端检查)

1. 先通知前端写入cookie (可根据IP:PORT 在服务端全局保存要求写入cookie的值)
2. 第二次请求是从cookie中读之前写入的值,读不到说明禁用了cookie
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class CookieUtils {
//获取对应cookie
public static String getCookie(HttpServletRequest request,String cookieName){ Cookie[] cookies = request.getCookies();
if(cookies != null){
for(Cookie cookie : cookies){
if(cookie.getName().equals(cookieName)){
return cookie.getValue();
}
}
} return null;
}
//写入cookie
public static void writeCookie(HttpServletResponse response, String cookieName,String value){
Cookie cookie = new Cookie(cookieName,value);
cookie.setPath("/");
cookie.setMaxAge(3600);
response.addCookie(cookie);
} }

判断cookie禁用后,可选择url重写方案

//1.获取Session对象
HttpSession session = request.getSession(); //2.创建目标URL地址字符串
String url = "targetServlet"; //3.在目标URL地址字符串后面附加JSESSIONID的值
url = response.encodeURL(url); //4.重定向到目标资源
response.sendRedirect(url);

最后url会变为

targetUrl;jsessionid=F9C893D3E77E3E8329FF6BD9B7A09957

session 总结的更多相关文章

  1. session实现购物车

    为实现简单的购物功能(购物车添加.账户查看.购物车商品删除.实时的购物商品数量及价格的计算显示.购物车商品数量可手动输入等),用session实现了一简单的以php语言为基础.连接MySQL数据库的购 ...

  2. Asp.net Core中使用Session

    前言 2017年就这么悄无声息的开始了,2017年对我来说又是特别重要的一年. 元旦放假在家写了个Asp.net Core验证码登录, 做demo的过程中遇到两个小问题,第一是在Asp.net Cor ...

  3. 懒加载session 无法打开 no session or session was closed 解决办法(完美解决)

           首先说明一下,hibernate的延迟加载特性(lazy).所谓的延迟加载就是当真正需要查询数据时才执行数据加载操作.因为hibernate当中支持实体对象,外键会与实体对象关联起来.如 ...

  4. 探索ASP.NET MVC5系列之~~~6.Session篇(进程外Session)

    其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.ht ...

  5. Nhibernate的Session管理

    参考:http://www.cnblogs.com/renrenqq/archive/2006/08/04/467688.html 但这个方法还不能解决Session缓存问题,由于创建Session需 ...

  6. nginx+iis+redis+Task.MainForm构建分布式架构 之 (redis存储分布式共享的session及共享session运作流程)

    本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,上一篇分享文章制作是在windows上使用的nginx,一般正式发布的时候是在linux来配 ...

  7. zookeeper源码分析之六session机制

    zookeeper中session意味着一个物理连接,客户端连接服务器成功之后,会发送一个连接型请求,此时就会有session 产生. session由sessionTracker产生的,sessio ...

  8. [转载]Cookie/Session的机制与安全

    Cookie和Session是为了在无状态的HTTP协议之上维护会话状态,使得服务器可以知道当前是和哪个客户在打交道.本文来详细讨论Cookie和Session的实现机制,以及其中涉及的安全问题. 因 ...

  9. 修改session垃圾回收几率

    <?php //修改session垃圾回收几率 ini_set('session.gc_probability','1'); ini_set('session.gc_divisor','2'); ...

  10. Nginx反向代理,负载均衡,redis session共享,keepalived高可用

    相关知识自行搜索,直接上干货... 使用的资源: nginx主服务器一台,nginx备服务器一台,使用keepalived进行宕机切换. tomcat服务器两台,由nginx进行反向代理和负载均衡,此 ...

随机推荐

  1. ASP.NET MVC之读取服务器文件资源的两种方式

    初次认识asp.net mvc时,以为所有文件都需要走一遍路由,然后才能在客户端显示, 所以我首先介绍这一种方式 比如说:我们在服务器上有图片: ~/resource/image/5.jpg 我们就需 ...

  2. 程序员必备,一款让你提高工作效率N倍的神器uTools

    下载地址:https://www.aliyundrive.com/s/f7PU7QxdxEz uTools 是什么? uTools = your tools(你的工具集) uTools 是一个极简.插 ...

  3. 用python随随便便做一个二维码叭~~~

    Python是目前最好的编程语言之一.由于其可读性和对初学者的友好性,已被广泛使用. 那么要想学会并掌握Python,可以实战的练习项目是必不可少的. 接下来,我将给大家介绍非常实用的Python项目 ...

  4. NC14301 K-th Number

    NC14301 K-th Number 题目 题目描述 Alice are given an array A[1..N] with N numbers. Now Alice want to build ...

  5. labview从入门到出家7(进阶篇)--队列的使用

    本节简单讲解队列在Labview中的使用,队列你可以认为就是一组先进先出的数据列表,在Labview中常用来缓存和传递数据.用了这么久的队列,个人认为有个方便的地方在于数据传递的把控,不管是局部变量还 ...

  6. 迭代器的实现原理和增强for循环

    Iterator遍历集合--工作原理 在调用Iterator的next方法之前,迭代器的索引位于第一个元素之前,不指向任何元素,当第一次调用迭代器的next方法后,迭代器的索引会向后移动一位, 指向第 ...

  7. 关于 Flink 状态与容错机制

    Flink 作为新一代基于事件流的.真正意义上的流批一体的大数据处理引擎,正在逐渐得到广大开发者们的青睐.就从我自身的视角看,最近也是在数据团队把一些原本由 Flume.SparkStreaming. ...

  8. 关于ios的IDFA

    了解IDFA,看我这篇文章就够了双11剁手后,我静静的限制了广告追踪 今年双11爆了,据统计,全天交易额1207亿,移动端占比82%,在马云的持续教育和移动端的爆发下,用户在移动端消费的习惯已经不可逆 ...

  9. MATLAB复习资料——浙商大管工学院适用

    包含12套复习卷,课堂PPT 下载链接:MATLAB练习模拟题库(12套).pdf - 蓝奏云 (lanzoub.com)

  10. 第十天python3 函数的销毁

    全局函数销毁 三种方式: 1.重新定义同名函数 2.del语句删除函数对象 3.程序结束时 局部函数销毁 三种方式: 1.重新在上级作用域定义同名函数: 2.del语句删除函数对象: 3.上级作用域销 ...