1、会话的作用

  使用会话是为了维持状态,维持的是请求域请求之间的状态。因为HTTP请求自身是完全无状态的。从服务器的角度来看,当用户发出第一个请求开始,服务器无法将新的请求与之前的请求关联起来,举例说就是假如你当前的请求是登陆账号,下一个请求是查询信息,服务器端并不清楚这两个请求来自同一个客户。

  你也许认为IP地址可以作为唯一标识符,那么在某一个时间段来自同一IP地址的所有请求一定属于相同的客户端,但是其实这个是不一定的,就比如使用校园网的学生,这些学生使用的是相同的IP地址,他们真实的IP地址隐藏在路由之后。所以所有的HTTP服务器端技术都普遍采用HTTP会话的机制。

2、会话cookie和URL重写

  在Web会话中,容器和用户浏览器将通过某种方式连接起来,出于这个原因,通常会话会被赋予一个随机生成的字符串,称为会话ID。第一次创建会话的时候(即收到请求时),创建的会话ID会作为响应的一部分返回到用户的浏览器中,接下来从该用户浏览器中发出的请求都将通过某种方式包含该会话ID,通过这个会话ID把请求关联起来。

  将会话ID从服务器返回到浏览器中使用的有两项技术:会话cookie和URL重写

  • 会话cookie是HTTP的一种通信机制,通过Set-Cookie响应头在服务器之间传递任意数据,并存储在用户的计算机中,然后在;通过请求头Cookie从浏览器返回到服务器从。

   cookie可以 有各种不同的特性,例如域名、路径、过期日期或最大生命周期、安全标志只含HTTP的标志  

   这是浏览器和服务器之间的一系列HTTP请求和响应的头数据

   

    第一个响应中的Set-Cookie头将用于将cookie发送到用户浏览器,在Java EE应用服务器中会话cookie的名字默认为JSESSIONID,收到第一个响应之后浏览器会把cookie存储在用户计算机本地,请求的Cookie头也将用于将cookie发送回服务器。

  • URL中的会话ID

   Java应用程序中将会话ID添加到URL的最后一个路径段(或目录)采用这种方式分离会话ID和查询字符串的参数,使他们不会互相冲突,例如:

http://localhost:/hello-world/shop;JSESSIONID=7F2E3989B7780DE?action=view

  将会话ID内嵌在URL中可以避免使用cookie,那么第一次如何将请求URL中的会话ID发送到浏览器呢?下面的头信息将演示如何通过URL内嵌完成与cookie相同的工作的。

 在这个例子中,浏览器通过Location头返回会话ID,浏览器从未真正意识到会话ID的存在,只是重写location头中的URL以及任何响应内容的URL,是所有访问服务器的URL都内嵌此会话ID。

3、在Web.xml中配置会话

  在许多情况下,都可以直接使用HTTP会话,不需要添加显示的配置,不过默认的设置始终是不够的,所以我们可以在Web.xml中使用<session-config> 标签配置会话,下面列出了部署描述符所有可能用于设置会话的标签。

<session-config>
<session-timeout></session-timeout>
<cookie-config>
<name>JSESSIONID</name>
<domain>example.org</domain>
<path>/shop</path>
<comment>
<!-- some information -->
</comment>
<http-only>true</http-only>
<secure>false</secure>
<max-age></max-age>
</cookie-config>
<tracking-mode>COOKIE</tracking-mode>
<tracking-mode>URL</tracking-mode>
<tracking-mode>SSL</tracking-mode>
</session-config>

  所有在<session-config>和</cookie-config>中的标签都是可选的,但是如果使用了这些标签,就必须按照上面的顺序添加到Web.xml中。

  然后是每个标签的意义:

  • 标签<session-timeout>指定了会话在无效之前,可以保持不活跃状态的时间,以分钟为单位。如果该值小于等于0,那么会话将永远也不过期。如果不设置该值那么将使用容器的默认值.
  • 标签<name>可以自定义会话cookie的名字。默认值为JSESSIONID
  • 标签<domain>将告诉浏览器应该把cookie发送到那个域名中
  • 标签<path>进一步的将cookie限制在了某个特定的URL中
  • 标签<comment>将在会话ID cookie中添加Comment特性,在其中可以添加任意文本。这通常用于解释cookie的目的,并告诉用户网站的隐私策略。
  • 标签<http-only>若为真将会把cookie限制在直接的浏览器请求中,例如JavaScript和Flash将无法访问cookie
  • 标签<secure>若为真浏览器只会通过HTTPS发送cookie,这将保护cookie,避免以未加密的方式进行传输
  • 标签<max-age>指定了cookie的Max-Age特性,用于控制cookie何时过期。默认情况下,cookie没有过期日期,这意味着它将在浏览器关闭时过期。可以自定义该值,单位为秒
  • <tracking-mode>用于表示容器应该使用哪种技术追踪会话ID,它的合法值有:
       URL----容器将只在URL中内嵌会话ID 。不使用cookie或SSL会话ID。这种方式非常不安全。
       COOKIE -----容器将使用会话cookie追踪会话ID 。该技术非常安全。
       SSL ----容器将使用SSL会话ID作为HTTP会话ID。该方法是最安全的方式,但要求使用的所有请求都必须是HTTPS请求。

  

JavaWeb——使用会话维持状态的更多相关文章

  1. JavaWeb——使用会话维持状态2

    在这次的例子里面,将完成一类似购物车的功能,在客户访问网站的时候,会选中自己将要购买的商品,而购物车将始终维持着商品的状态,会话将联系起选择第一个商品(第一个请求),选择其他商品(其他请求)以及付款等 ...

  2. JavaWeb——使用会话维持状态3

    这次的例子是使用会话给上一个例子添加登陆功能 1.页面逻辑 首先是登陆页面,这里需要输入账号和密码,输入正确后将进入商品列表页面,输入错误将会提示账号或者密码错误 其次是商品列表和购物车页面,添加了注 ...

  3. SqlServer性能急剧下降,查看所有会话的状态及等待类型---Latch_Ex

    当某个数据库文件空间用尽,做自动增长的时候,同一时间点只能有一个用户人员可以做文件自动增长动作,其他任务必须等待,此时会出现Latch资源的等待.使用sp_helpdb查看业务数据库时发现:该数据库设 ...

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

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

  5. JavaWeb(六):会话与状态管理

    HTTP协议是一种无状态的协议,WEB服务器本身不能识别出哪些请求是同一个浏览器发出的 ,浏览器的每一次请求都是完全孤立的.即使 HTTP1.1 支持持续连接,但当用户有一段时间没有提交请求,连接也会 ...

  6. JavaWeb基础—会话管理之Cookie

    一.什么是会话 打开浏览器,浏览各种资源,点击各种超链接,直至关闭浏览器,整个过程称为会话 二.会话管理的两种技术 1.Cookie 基于客户端.在客户端记录信息来确认用户身份.以cookie的形式写 ...

  7. JavaWeb基础: 会话技术简介

    会话技术 用户使用Web应用的过程实际是调用了一系列的Servlet来组合处理请求,从而完成整个业务流.不同Servlet组合起来为用户服务的时候就会遇到一个数据共享和传输的问题,如何让多个Servl ...

  8. java_web学习(8)会话与状态管

    HTTP简介       WEB浏览器与WEB服务器之间的一问一答的交互过程必须遵循一定的规则,这个规则就是HTTP协议.HTTP是hypertext transfer protocol(超文本传输协 ...

  9. JavaWeb基础 - 会话

    会话概述 什么是会话 简单的理解:用户打开浏览器,点击多个超链接,访问Web服务器上多个资源,然后关闭浏览器,整个过程称之为一次会话. 需要解决的问题 每个用户在使用浏览器与服务器会话的过程中,会产生 ...

随机推荐

  1. scrapy基础知识之 处理Redis里的数据:

    数据爬回来了,但是放在Redis里没有处理.之前我们配置文件里面没有定制自己的ITEM_PIPELINES,而是使用了RedisPipeline,所以现在这些数据都被保存在redis的xx:items ...

  2. 修改SearchBar的取消按钮Cancel为中文

    一开始在网上看到很多方法都是循环,好吧,我也循环 创建UISearchBar的时候循环,不行 用searchBarTextDidBeginEditing事件去循环,也不行 无语了,搜索了Baidu第一 ...

  3. 寻觅Azure上的Athena和BigQuery (二):神奇的PolyBase

    前情回顾 在“数据湖”概念与理论逐渐深入人心的今天,面向云存储的交互式查询这个需求场景显得愈发重要.这是因为原生的云存储(主要指S3这样的对象存储)既能够容纳大容量的明细数据,又能在性能和成本间取得一 ...

  4. Java 集合类Hashmap

    一.HashMap 简介 HashMap在程序员的开发过程中是一个十分常用的集合类,它是一个以键值对形式存在的集合类, 在开发中我们可以利用的它的一个key存在即替换的特性,实现一个更新的去重的操作. ...

  5. 走近Java之幕后的String

    前几天,有个同事问了我一个表面看起来显而易见的问题,是关于String的,我们一起来看一下(如果有说的不正确的地方,欢迎大家指正). java中,字面量在编译期计算,并且String字面量作为常量,存 ...

  6. spark 源码分析之十五 -- Spark内存管理剖析

    本篇文章主要剖析Spark的内存管理体系. 在上篇文章 spark 源码分析之十四 -- broadcast 是如何实现的?中对存储相关的内容没有做过多的剖析,下面计划先剖析Spark的内存机制,进而 ...

  7. Linux 提升逼格之 命令别名 分享

    1, 使用场景 Linux下开发 肯定是日常要用命令行的,命令行里包含了众多的命令和工具,例如: git.shell.以及一众系统命令等. 举个例子,码农最常用的 git add ,如果加上别名 可设 ...

  8. centos7 linux下增加swap虚拟内存分区大小

    此方法不限于centos,linux均适用 最近在服务器上部署了一个java项目,java进程经常性莫名被自动Kill,首先java程序是没有报错的,那么我想可能是内存不足的原因,因为4G内存的服务上 ...

  9. 小记---idea springboot 报错没有get或者set方法

    给idea 安装一个插件即可

  10. Python基础总结之第五天开始【认识简单的条件语句,也可以叫判断语句】(新手可相互督促)

    周五更新很累... 坚持,年薪20万又进了一步~~ python中的条件语句以[ if ]开头,条件语句成立时,运行该代码块,如果条件不成立,则跳过该代码块,执行后面的代码块. 简单的小示例: 输入性 ...