一.Session简介

  • Session的使用场景

  • 当我们登陆电商网站时,无论浏览哪个页面都会显示登陆人的名字,还可以随时查看购物车里面的商品

  • 也就是说当一个用户浏览一个网站的不同页面时,服务器怎么知道此时是张三在访问还是李四在访问

这也就引出我们的另一个会话技术Session 与cookie不同session是保存在服务器端上,在每一次与浏览器的会话中,服务器都会创建该会话独享的session空间用于存储数据,用户浏览多个页面时可以从session对象中读取数据进行相关操作

  • 会话

在解释session前,我们要先了解什么是会话。会话就是用户通过浏览器访问多个网站页面,并关闭浏览器这一过程,严谨的讲一次会话和浏览器保存的JSessionID和服务器端保存的Session对象有关

总之,用户通过浏览器访问服务器,并操作Session时,服务器会在内存中为这次会话分配一个Session对象,被该浏览器所独占。

这个session可以看作一个容器/集合,默认存在时间为30分钟(可以在web.xml文件中修改)

二.Session的简单理解

1. Session的存储结构
session的存储结构类似于HashMap,相当于一张表

2. Session简单的执行流程


总结session的实现基于cookie,服务器端通过得到cookie来判断是一个新的会话,还是以前的会话

三.Session的使用

  • 创建session

getSession方法的调用在某些情况下就相当于创建了一个Session对象

HttpSession session = request.getSession();

什么时候创建session

  • 浏览器的HTTP请求cookie中没有携带JSESSIONID
  • 浏览器的HTTP请求cookie中携带了JSESSIONID,但在服务器内存中没有与其匹配的JESSIONID
    抓包分析
    如果浏览器没有携带JESSIONID,操作session时服务器会为该浏览器分配一个ID以cookie的形式返回给浏览器进行保存

再此访问该服务器资源时浏览器会携带上次分配的JSESSIONID,到服务器端找到对应的session对象进行数据的操作

  • 向session添加/读取属性
session.setAttribute("user", "jbc");
session.getAttribute("user");
  • 移除session中的属性
session.removeAttribute("user");
  • 获取JESSIONID

每一个session对象都有与之唯一对应的JSESSIONID

session.getID();
  • 判断是否是新创建的session
session.isNew();

四.Session的生命周期

  • setMaxInterval方法设置session的生命周期(以秒为单位)

    正数是session的超时时间

    负数为永不超时

  • getMaxInterval()得到该session的生命周期

  • invalidate()销毁该session

  • 在没有设置session的超时时长时默认为30分钟失效

  • Tomcat会在底层轮询存储JSESSIONID-session的容器,如果最近访问时间
    lastAccessDate与现在的时间超过session的MaxInterval,就会销毁该session

要说明的是session的生命周期是:浏览器能够访问到该session间隔的最大时长,而不是累计时长,在每次访问session时都会重置session的MaxInterval

代码举例

创建与访问该资源的浏览器关联的session对象,设置超时时长60秒

     HttpSession session = request.getSession();System.out.println("JSessionID= " + session.getId());session.setMaxInactiveInterval(60);session.setAttribute("user", "jbc");

读取当前会话的session中的数据

     HttpSession session = request.getSession();System.out.println("JSessionID= " + session.getId());System.out.println(session.getAttribute("user"));

抓包分析

由于我们没有携带JSESSIONID,服务器分配了这次会话的ID

分析可知,在超过60秒后,服务器会将这次会话的session销毁,
这时我们再想要读取该session中的数据时,我们发现服务器端又返回了一个新的JSESSIONID,说明原来的会话已经被销毁,再对session进行操作时,服务器认为当前是新的会话,会创建session对象并返回给浏览器SID

需要再次说明的是session的生命周期是指,间隔的最大时长,如果在间隔时间内再次访问就会重置他的生命周期

五.应用实例

1.只要密码为 666666, 我们认为就是登录成功 ,用户名不限制
2. 如果验证成功,则进入管理页面 ManageServelt.java ,否则进入 error.html
3. 如果用户直接访问 ManageServet.java , 重定向到到 login.html

此案例只是为了理解session做的简单案例

package homework;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;@WebServlet(name = "LoginCheck", value = "/LoginCheck")
public class LoginCheck extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String pwd = request.getParameter("pwd");//如果密码正确就创建一个会话if ("666666".equals(pwd)) {HttpSession session = request.getSession();session.setAttribute("username", request.getParameter("username"));request.getRequestDispatcher("/Manger").forward(request, response);} else {//否则请求转发到error.html         request.getRequestDispatcher("/error.html").forward(request, response);}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}
package homework;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;@WebServlet(name = "Manger", value = "/Manger")
public class Manager extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {HttpSession session = request.getSession();String username = (String) session.getAttribute("username");//获得一个session对象如果该session对象是刚刚创建的//该对象就不会存储username这一属性,就可以判断用户是非法访问的该资源if (username == null) {//重定向到login.htmlresponse.sendRedirect("/session/login.html");} else {//如果是通过CheckLogin通过的就显示成功登陆response.setContentType("text/html;charset=utf-8");PrintWriter writer = response.getWriter();writer.print("<h1>欢迎" + username + "登陆</h1>");}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}

Session的理解相关推荐

  1. [html] 说说你对cookie和session的理解

    [html] 说说你对cookie和session的理解 cookie: 可以通过客户端, 服务端设置, 容量小, 可以通过设置domain来实现同步登录, 除了name, value, 它还有多个选 ...

  2. Spark session 深入理解

    Spark session Spark session 深入理解 创建SparkSession Builder 的方法如下: 设置参数 读取元数据 读取数据 使用SparkSQL 存储/读取Hive表 ...

  3. 对cookie与session的理解

    cookie: 在网站中,http请求是无状态的.也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户. cookie的出现就是为了解决这个问题, 第一次登录 ...

  4. Java Web之Cookie和Session的理解

    日常现象 登录了某个网站,过一会儿再登录,诶,不用输入密码了,直接是登录状态了,好神奇~~~ 在某网站看了一部手机,接下来浏览其他网站,旁边的广告全是手机和类似信息,好恐怖~~~ 浏览某网站时,提示我 ...

  5. cookie和session的理解

    一个常见的错误是以为 session 在有客户端访问时就被创建,然而事实是直到某 server 端程序(如 Servlet )调用HttpServletRequest.getSession(true) ...

  6. hibernate中SessionFactory,Session的理解?

    Session接口         Session接口对于Hibernate   开发人员来说是一个最重要的接口.然而在Hibernate中,实例化的Session是一个轻量级的类,创建和销毁它都不会 ...

  7. 对session的理解

    java Servlet API引入session 机制来跟踪客户的状态,session指的是在一段时间内,单个客户和web服务器之间一连串的交互过程,在一个session中,一个客户可能会多次请求同 ...

  8. 说说对javaee中的session的理解

    在服务器上,通过Session来区分每一个上网用户 用户只要一连接到服务器,则立刻分配一个Session给用户 Session主要方法: 1 服务器上通过Session来分别不同的用户-->Se ...

  9. cookie 百科_Cookie和session应该这样理解

    前言 虽然在学习服务器端语言的时候屡屡提到了Cookie和session这两个概念,有关Cookie和Session的接口也调用过,但始终对实现交互机制和这两者区别的理解感觉是云里雾里,于是打算静下心 ...

最新文章

  1. Ubuntu14.04 x64 zabbix 3.0 安装
  2. sql server 字符串转table
  3. JScript 和 VBscript访问网络上的打印设备
  4. linux下cpu opencl加速,GPU挑战CPU!详解CUDA+OpenCL威力
  5. x·dy+y²·sinx·dx=0
  6. springboot 不使用 thymeleaf_springboot 使用swagger 不显示basic-error-controller解决
  7. 第一章 Javscript的数据类型
  8. 6 EDA技术实用教程【基础知识2】
  9. fluent前处理——gambit边界设置
  10. wx.getStorage异步和wx.getStorageSync同步区别
  11. 微信小程序tabBar闪烁问题
  12. photoshop----剪切蒙版/置入图片
  13. php ueditor mysql_PHP Ueditor 富文本编辑器
  14. 2018年Linux发行版颜值排行榜发布啦!
  15. 秋招一个半月流水账+招银网路科技offer
  16. RJS参考之JavaScriptCollectionProxy
  17. SPSS--回归-多元线性回归模型案例解析!(一)
  18. 9 项目资源管理 人人都是项目经理系列(第9/13篇)
  19. SFM4300流量传感器应用笔记
  20. 外呼系统APP外呼软件手机电销软件拨号销售软件功

热门文章

  1. IDEA Java 死锁 解决死锁状态的三种方法
  2. DNS服务器的作用 路由器的功能,dns服务器是什么意思 dns服务器主要功能有哪些...
  3. 如何做华为云服务器迁移?
  4. 云-移动手机端项目总结
  5. 四川师范大学人文地理(7-13章)95分版本提纲
  6. java将大写数字转换成小写并输出
  7. Android监听消息(二)——电话及短信监听
  8. 足球视频AI(五)——球员与球的对象跟踪
  9. Android自定义View之图形图像(模仿360的刷新球自定义一个SeekBar)
  10. 马悦凌:从初级护士到“民间奇医”[1]