一.Session和Cookie

  1.Cookie

   1.cookie创建于服务器,保存于浏览器,保存了特定网站操作记录和资料凭证的信息。

    2.未设置cookie期限的时候,默认是关闭浏览器后cookie消失,此时cookie保存于内存中,这种cookie称为会话cookie。

    3.设置了过期时间的cookie会被保存到硬盘中,在下次启动浏览器后,只要还未超过过期时间还能继续使用,过期将被清除。

    4.cookie过期时间通过 cookie.setMaxAge(2000) 来设置。

    注意:设置了cookie.setMaxAge但是下次请求通过req.getMaxAge()取得的值总是-1的原因如下:

       第一次请求服务时,服务器端传输cookie并写到客户端,浏览器关闭,cookie设置生效。
     第二次请求服务,request请求传给服务端,但在这个request中是不包含maxage值的,所以服务端取到的值还是默认值-1。也就是说设置完maxage值后,maxage不会再被服务端读取和修改了。这一过程由浏览器完成,浏览器判断maxage的值,从而判断cookie是否过期,期间服务器并不会参与cookie的生命周期过程。所以你在debug中取到的值一直是默认值!
     

  2.Session

     Session保存于服务器,为了高速存取,一般放在内存中,在浏览器第一次请求服务去的时候会为浏览器创建一个Session,因为HTTP请求是无状态的,所以会在浏览器端以Cookie形式保存一个JSESSIONID用于查找保存在服务器端session的凭证。

    

    每次请求的时候会判断请求头是否含有可用的JSESSIONID的Cookie,通过JSESSIONID查找对应的session,如果不存在则重新创建一个session,并把JSESSION保存到浏览器。所以二次请求的时候请求头里是带有JSESSIONID的Cookie的,通过jsessionid ==request.getSession().getId()获取sessionID.

    

    JSESSIONID的Cookie会在浏览器关闭后清除,下次从新开启时是不存在的 。

    请求流程:

    

二.Session生命周期

   1.session过期时间:

    session的是保存浏览器和服务器间信息的一块内存,在服务器规定时间内,如果浏览器没有对服务器进行任何的请求,那么规定时间段结束,服务器将会清除该过期的session,并释放内存,不然越来越多的session占用了内存却不工作,会导致服务器内存不断消耗,导致服务器崩溃。tomcat默认保存时间是30分钟(这是指在30分钟内浏览器不发生任何请求行为,如果有请求行为每次这个时间都会更新重置)

     这个时间可以在tomcat目录下的conf/web.xml文件内修改

    

  2.Session对浏览器的要求:

  Cookie为服务器自动生成的,它的maxAge属性一般为-1,表示仅当前浏览器内有效,并且各浏览器窗口间不共享,关闭浏览器就会失效。因此同一机器的两个浏览器窗口访问服务器时,会生成两个不同的Session。但是由浏览器窗口内的链接、脚本等打开的新窗口(也就是说不是双击桌面浏览器图标等打开的窗口)除外。这类子窗口会共享父窗口的Cookie,因此会共享一个Session。

  注意:新开的浏览器窗口会生成新的Session,但子窗口除外。子窗口会共用父窗口的Session。例如,在链接上右击,在弹出的快捷菜单中选择"在新窗口中打开"时,子窗口便可以访问父窗口的Session。

  3.如果客户端浏览器将Cookie功能禁用,或者不支持Cookie怎么办?

  例如,绝大多数的手机浏览器都不支持Cookie。Java Web提供了另一种解决方案:URL地址重写。

  URL地址重写是对客户端不支持Cookie的解决方案。URL地址重写的原理是将该用户Session的id信息重写到URL地址中。服务器能够解析重写后的URL获取Session的id。这样即使客户端不支持Cookie,也可以使用Session来记录用户状态。HttpServletResponse类提供了encodeURL(String url)实现URL地址重写,

  该方法的实现机制为: 
    ● 先判断当前的 Web 组件是否启用 Session,如果没有启用 Session,直接返回参数 url。 
    ● 再判断客户端浏览器是否支持 Cookie,如果支持 Cookie,直接返回参数 url;如果不支持 Cookie,就在参数 url 中加入 Session ID 信息,然后返回修改后的 url。

  

  禁用了Cookie重写了URL:

  

  未禁用Cookie:

  

  注意:TOMCAT判断客户端浏览器是否支持Cookie的依据是请求中是否含有Cookie。尽管客户端可能会支持Cookie,但是由于第一次请求时不会携带任何Cookie(因为并无任何Cookie可以携带),URL地址重写后的地址中仍然会带有jsessionid。当第二次访问时服务器已经在浏览器中写入Cookie了,因此URL地址重写后的地址中就不会带有jsessionid了。

  

Session和Cookie总结的更多相关文章

  1. 理解Session与Cookie

    写在前面的话:Session和Cookie是非常有意思的两个概念,对于两者的管理可以处理的很复杂,但是无论如何,理解Session和Cookie的基本概念和发明初衷,对于问题的解决,大有裨益. === ...

  2. PHP之session与cookie

    1.session与cookie的关系 众所周知,session是存储在服务器端,cookie是存储在客户端,如果禁用了浏览器的cookie功能,很多时候(除非进行了特殊配置)服务器端就无法再读取se ...

  3. 安全退出,清空Session或Cookie

    概览: 网站中点击退出,如果仅仅是重定向到登录/出页面,此时在浏览器地址栏中输入登录后的某个页面地址如主页,你会发现不用登录就能访问.这种所谓的退出并不是安全的. 那么怎样做到安全退出呢? 那就是点击 ...

  4. 11月7日上午PHP会话控制(session和cookie)、跨页面传值

    1.session  登录上一个页面以后,长时间没有操作,刷新页面以后需要重新登录. 特点:(1)session是存储在服务器:   (2)session每个人(登陆者)存一份: (3)session ...

  5. 【荐】PHP Session和Cookie,Session阻塞,Session垃圾回收,Redis共享Session,不推荐Memcached保存Session

    什么是 Session 在 web 应用开发中,Session 被称为会话.主要被用于保存某个访问者的数据. 由于 HTTP 无状态的特点,服务端是不会记住客户端的,对服务端来说,每一个请求都是全新的 ...

  6. Session与Cookie概念

    摘:一.Session机制session是一种服务器端的状态管理技术,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息.当程序需要为某个客户端的请求创建一个session的时候,服务 ...

  7. session和cookie

    第一次听到cookie这个词的时候着实兴奋了一段时间,以为是小饼干呢~快喝一杯82年的java压压惊!哈哈~ 与cookie的第一次邂逅——清缓存和清cookie 刚毕业的时候上班,做二次开发,明明后 ...

  8. 深入理解Session与Cookie

    Session与cookie的作用都是为了保持访问用户与后端服务器的交互状态. cookie通过把所有要保存的数据通过HTTP协议的头部从客户端传递到服务端,又从服务端再传回到客户端,所有的数据都存储 ...

  9. TP中的session和cookie

    session:1.session('name','value');  //设置session2.$value = session('name');  // 获取所有的session 3.2.2版本新 ...

  10. thinkphp里的session、cookie方法

    thinkphp里,对于session和cookie的操作,不管是存值.获取.删除,均只有一个方法.现分享出来,供大家参考参考. /** * session管理函数 * @param string|a ...

随机推荐

  1. Java经典编程题50道之十九

    打印出如下图案(菱形)        *      ***    ******  ********    ******      ***        * public class Example19 ...

  2. 浅谈扩展欧几里得算法(exgcd)

    在讲解扩展欧几里得之前我们先回顾下辗转相除法: \(gcd(a,b)=gcd(b,a\%b)\)当a%b==0的时候b即为所求最大公约数 好了切入正题: 简单地来说exgcd函数求解的是\(ax+by ...

  3. [翻译] .NET Core 2.1 Preview 1 发布

    [翻译] .NET Core 2.1 Preview 1 发布 原文: Announcing .NET Core 2.1 Preview 1 今天,我们宣布发布 .NET Core 2.1 Previ ...

  4. python——Django项目模板

    views.py # -*- coding: utf-8 -*- from __future__ import unicode_literals from django.shortcuts impor ...

  5. IntentService源码

    原文地址IntentService源码分析 @Override public void onCreate() { super.onCreate(); HandlerThread thread = ne ...

  6. Spring data mongodb 替换 Repository 实现类,findAll 排除 字段

    因文档比较大,有时候findAll 不想返回所有数据.没有找到默认的findAll 能够include 或者 exclude 的方法,所以想办法扩展一下实现类 query.fields().inclu ...

  7. HTTP协议报文结构及示例

    HTTP基本架构 下面我们用一张简单的流程图来展示HTTP协议基本架构,以便大家先有个基本的了解. 9.png Web Client可以是浏览器.搜索引擎.机器人等等一切基于HTTP协议发起http请 ...

  8. python2.x和python3.x的区别

    一.python2.x和python3.x中raw_input( )和input( )区别 1.在Python2.x中raw_input( )和input( ),两个函数都存在,其中区别为 raw_i ...

  9. Oracle总结【SQL细节、多表查询、分组查询、分页】

    前言 在之前已经大概了解过Mysql数据库和学过相关的Oracle知识点,但是太久没用过Oracle了,就基本忘了...印象中就只有基本的SQL语句和相关一些概念....写下本博文的原因就是记载着Or ...

  10. Android开发学习必备的java知识

    Android开发学习必备的java知识本讲内容:对象.标识符.关键字.变量.常量.字面值.基本数据类型.整数.浮点数.布尔型.字符型.赋值.注释 Java作为一门语言,必然有他的语法规则.学习编程语 ...