本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用

内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。

本人互联网技术爱好者,互联网技术发烧友

微博:伊直都在0221

QQ:951226918

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1.定义:session在Web开发环境下,它的含义是指一类用来在客户端与服务器端之间保持状态的解决方案。有时候Session也用来指这种解决方案的存储结构。

2.session机制

  1)session机制采用的是在服务器端保持 HTTP 状态信息的方案 

  2)服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息

  3)当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否包含了一个session标识(即sessionId)。

    如果已经包含一个sessionId则说明以前已经为此客户创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个,这种情况可能出现在服务端已经删除了该用户对应的session对象,但用户人为地在请求的URL后面附加上一个JSESSION的参数)。

    如果客户请求不包含sessionId,则为此客户创建一个session并且生成一个与此session相关联的sessionId,这个session id将在本次响应中返回给客户端保存。

3.保存session id的几种方式

  1)保存session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。

  2)由于cookie可以被人为的禁用,必须有其它的机制以便在cookie被禁用时仍然能够把session id传递回服务器,经常采用的一种技术叫做URL重写,就是把session id附加在URL路径的后面,附加的方式也有两种:

    一种是作为URL路径的附加信息;

     一种是作为查询字符串附加在URL后面;

      网络在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id;

4.Session cookie

  1)session通过SessionID来区分不同的客户, session是以cookie或URL重写为基础的。默认使用cookie来实现,系统会创造一个名为JSESSIONID的输出cookie,这称之为session cookie,以区别persistent cookies(也就是我们通常所说的cookie),session cookie是存储于浏览器内存中的,并不是写到硬盘上的,通常看不到JSESSIONID,但是当把浏览器的cookie禁止后,web服务器会采用URL重写的方式传递;

  2)session cookie针对某一次会话而言,会话结束session cookie也就随着消失了,而persistent cookie只是存在于客户端硬盘上的一段文本;

  3)关闭浏览器,只会是浏览器端内存里的session cookie消失,但不会使保存在服务器端的session对象消失,同样也不会使已经保存到硬盘上的持久化cookie消失。

5.HttpSession 的声明周期

  1).什么时候创建 HttpSession 对象

  ① 对于JSP:是否浏览器访问服务器端的任何一个JSP, 服务器都会立即创建一个 HttpSession 对象呢?不一定。
    > 若当前的 JSP 是客户端访问的当前 WEB 应用的第一个资源,且 JSP 的 page 指定的 session 属性值为 false,
       则服务器就不会为 JSP 创建一个 HttpSession 对象;

    > 若当前 JSP 不是客户端访问的当前 WEB 应用的第一个资源,且其他页面已经创建一个 HttpSession 对象,
      则服务器也不会为当前的JSP 页面创建一个HttpSession 对象,而会把和当前会话相关联的那个HttpSession 对象返回给当前的JSP 页面;

  ② 对于Servlet:若Servlet 是客户端访问的第一个WEB 应用的资源,
    则只有调用了request.getSession() 或者 request.getSession(true) 才会创建 HttpSession 对象

  2).page指令中的 session=“false“ 到底表示什么意思?
    > 当前 JSP 页面禁用 session 隐含变量!但可以使用其他的显式的 HttpSession 对象
    如:HttpServlet session = request.getSession(false);

  3).在Servlet 中如何获取HttpSession 对象?

    > request.getSession(boolean create):
       若参数为 false, 则 若没有和当前JSP 页面关联的HttpSession 对象,则返回 null , 若有 则返回 关联的 HttpSession 对象
       若参数为 true, 一定返回一个HttpSession 对象,若没有和当前JSP 页面关联的HttpSession 对象,则服务器创建一个新的HttpSession 对象,若有,直接返回关联的HttpSession对象

    > request.getSession():等同于 request.getSession(true)

  4).什么时候销毁HttpSession 对象
    ① 直接调用HttpSession 的invalidate() 方法,使当前的HttpSession 对象失效。即,以后每次刷新页面就会重新创建一个HttpSessioin 对象

    ② 服务器卸载了当前的 WEB 应用

    ③ 超出HttpSession 的过期时间: 以秒为单位
      >session.setMaxInactiveInterval(interval) //设置 session 过期的时间 ,默认是 30分钟
      >session.getMaxInactiveInterval(); //获取 sesson 过期时间

      > 在web.xml 文件中设置HttpSession 的过期时间 : 单位为分钟。在$TOMECAT_HOME/web.xml
      <session-config>
      <session-timeout>30</session-timeout>
      </session-config>

    ④ 并不是关闭了浏览器就销毁了HttpSession:url重写,持久化cookie

  5).利用URL重写实现Session跟踪

  ① Servlet规范中引入了一种补充的会话管理机制,它允许不支持Cookie的浏览器也可以与WEB服务器保持连续的会话。

   这种补充机制要求在响应消息的实体内容中必须包含下一次请求的超链接,并将会话标识号作为超链接的URL地址的一个特殊参数

  ② 将会话标识号以参数形式附加在超链接的URL地址后面的技术称为URL重写。

     如果在浏览器不支持Cookie或者关闭了Cookie功能的情况下,WEB服务器还要能够与浏览器实现有状态的会话,就必须对所有可能被客户端访问的请求路径(包括超链接、form表单的action属性设置和重定向的URL)进行URL重写

  HttpServletResponse接口中定义了两个用于完成URL重写方法: encodeURL方法     encodeRedirectURL方法

 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>session login JSP</title>
</head>
<body> SessionId :<%= session.getId() %>
<br><br> IsNew:<%= session.isNew() %>
<br><br> MaxInactiveInterval:<%= session.getMaxInactiveInterval() %>
<br><br> CreateTime:<%= session.getCreationTime() %>
<br><br> LastAccessTime:<%= session.getLastAccessedTime() %>
<br><br>
<%
Object username = session.getAttribute("username");
if(username == null){
username = "";
}
%> <form action="<% response.encodeURL("login.jsp") %>" method="post"> username:<input type="text" name="username" value="<%= username %>"/>
<input type="submit" value="submit"/>
</form> </body>
</html>

6.Session的创建与删除

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

  2)session在下列情况下被删除:

    ①  程序调用HttpSession.invalidate()

    ②  距离上一次收到客户端发送的session id时间间隔超过了session的最大有效时间

    ③  服务器进程被停止

  3)关闭浏览器只会使存储在客户端浏览器内存中的session cookie失效,不会使服务器端的session对象失效

[原创]java WEB学习笔记31:会话与状态管理 session机制 概述(定义,session机制,session的声明周期,保存session的方式,Session的创建与删除)的更多相关文章

  1. [原创]java WEB学习笔记04:Servlet 简介及第一个Servlet程序(配置注册servlet,生命周期)

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  2. [原创]java WEB学习笔记95:Hibernate 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  3. [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  4. [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  5. [原创]java WEB学习笔记11:HttpServlet(HttpServletRequest HttpServletRsponse) 以及关于 Servlet 小结

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  6. [原创]java WEB学习笔记28: 会话与状态管理Cookie 机制

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  7. [原创]java WEB学习笔记15:域对象的属性操作(pageContext,request,session,application) 及 请求的重定向和转发

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  8. [原创]java WEB学习笔记52:国际化 fmt 标签,国际化的总结

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  9. [原创]java WEB学习笔记51:国际化 概述,API 之 locale类,dataFormat类,numberFormat类, MessageFormat类,ResourceBundle 类

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

随机推荐

  1. (五)Thymeleaf标准表达式之——[7->8]条件表达式& 默认表达式

    2.7 条件表达式 模板名称:condition-express.html <1>a ? b:c  (if then:else) <2>a?c (if else) 条件表达式( ...

  2. java替换文本中所有的正则符号 Java问题通用解决代码

    开发时遇到一个需求,需要对一段文本中的所有正则符号进行转义,不然使用split分割方法分割文本的话无效,想到用替换来做,全部替换正则符号为转义后的符号   贴java实现代码:   1.测试版     ...

  3. Docker: devicemapper fix for “device or resource busy” (EBUSY) Cannot start container

    受众:本文适用于熟悉码头工作的人员,并希望解决使用devicemapper存储/图形驱动程序时遇到的特定问题. 概述:虽然这不是专门用于设计师的问题,但是目前参与此驱动程序的技术人员会受到此影响. 使 ...

  4. WDCP管理面板忘记ROOT MYSQL密码及重置WDCP后台登录密码方法

    不管出于何种原因,应该有不少的朋友在自己的VPS/服务器上采用WDCP管理面板的时候有忘记MYSQL ROOT账户管理密码在寻找解决方法,甚至有忘记WDCP后台管理登录密码的.这些问题都比较简单,只需 ...

  5. https 加载问题

    https的网站,加载的资源要全部https,如果里面有http的资源,很多浏览器是加载不进来 要地址栏变绿,网站内部全部引用都是https的

  6. Hibernate学习之属性级别注解

    © 版权声明:本文为博主原创文章,转载请注明出处 属性级别注解 添加方式 1. 写在属性字段上面 2. 写在属性getter方法上面 @Id:必须,定义了映射到数据库表的主键属性,一个实体可以有一个或 ...

  7. MQTT服务器搭建--Apollo

    尊重原创,我是伸手党:https://blog.csdn.net/u012377333/article/details/68943416 1.Apollo下载 下载地址:http://activemq ...

  8. "下列引导或系统启动驱动程序无法加载: cdrom"的解决方案

    1.进入注册表(开始->运行->regedit) 2.展开HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\cdrom 3.把Sta ...

  9. BFS 和 DFS

    DFS用到递归,BFS要用到一个辅助队列 #include "stdafx.h" #include<iostream> #include<vector> # ...

  10. 如何落地全球最大 Kubernetes 生产集群

        鲍永成   京东基础架构部技术总监,   DevOps 标准核心编写专家   前言   JDOS 就是京东数据中心操作系统,随着数据中心规模不断的扩大,我们需要对数据中心做综合的考虑.所以一开 ...