session和request的生命周期

首先是session,比如我们在实现一个购物车功能时,在某一页面(这里称为页面A)选择了一些购物的商品,添加到购物车。那么当我们选择完成后点击我的购物车时会跳转到一个购物车页面(这里称为页面B),这和页面A是两个不同的页面,那么怎么讲页面A选取的商品添加到页面B呢。这里一种解决方案就是session。直接上一个demo了:

A.jsp页面:

<body>
<h1>A界面</h1>
<%
session.setAttribute("name","苹果");//这是jsp文件,如果是Servlet的话,先得获得Session,HttpSession hs=request.getSession(true);
%>
</body>

B.jsp页面:

<body>
<h1>B界面</h1>
<%
String name = (String) session.getAttribute("name");
%>
<p>Session的值为:<%=name%></p>
</body>

上面就达到了一个传值的目的,当然,我们谈的是session的生命周期,Tomcat里,默认的session生命周期是30min,也就是你不操作界面的时间,你一刷新界面的话,session会重新计时的,那么session的默认时间可以改么,答案是肯定的。可以在Tomcat目录下的conf文件下的web.xml进行修改,如下图所示,默认是30min,修改的话改个数值就行了:

当然我们每个应用程序的session可以自己设置生命周期,比如在A.jsp界面加句话就行了。

A.jsp页面:

<body>
<h1>A界面</h1>
<%
session.setAttribute("name", "苹果");//这是jsp文件,如果是Servlet的话,先得获得Session,HttpSession hs=request.getSession(true);
session.setMaxInactiveInterval(5);
%>
</body>

这里session.setMaxInactiveInterval(5);设置的是有效时间5秒,这里是以秒为单位的。

那么比如我从A界面跳转到B界面,B界面会显示Asession传过来的session内容,但是如果我5秒内没有动过B界面,那么再次刷新A界面时, 将不会再获得session内的值了,因为这个session失效了。

下面是request,request有两个方法:getParameter()和getAttribute()

现在有两个界面test1.jsp,test2.jsp,当我们在浏览器中输入http://127.0.0.1:8080/AA/test2.jsp时,一个request就产生了,也就是生命周期的开始。test1.jsp的request中,我们可以设置一些值,比如我在test1.jsp是这样设置的:

<body>
<h1>test1界面</h1>
<%
request.setAttribute("name", "hello");
%>
<a href="test2.jsp"></a>
</body>

上面setAttribue是在request中设置值的。那么问题来了,我们需要从test1.jsp界面跳转访问test2.jsp界面,是否test2.jsp界面中的request也保存test1.jsp中的request值呢?

一般来说有两种处理方式实现跳转,一种是response.sendRedirect,另一种是request.getRequestDispatcher("xxx.jsp").forward(request,response);

用第一种方法,那么test1.jsp中的request不会传递到test2.jsp。

用第二种方法,request的生命周期将延续下去,当采用forward如果到达JSP页面,那么之前从第一个JSP页面中发送出来的request的消息将仍然存在,新的页面同样能够取得该request里所包含的一些信息,比如之前的JSP发送request中所包含的参数信息。事实上,它们是同一个request

这里注意一下:第二种方法中,如果在页面中通过setAttribute()设置一个Object值到request中,那么在另一个页面中可以通过getAttribute()来获得值,这里值是Object类型的。

下面是test1.jsp和test2.jsp页面的代码:

test1.jsp

<body>
<h1>test1界面</h1>
<%
request.setAttribute("name", "hello");
request.getRequestDispatcher("test2.jsp").forward(request, response);
%>
<a href="test2.jsp"></a>
</body>

test2.jsp

<body>
<h1>test2界面</h1>
<%
String name = (String) request.getAttribute("name");
%>
<p>值为:<%=name%></p>
</body>

session和cookie的区别

session是存储服务器端,cookie是存储在客户端,所以session的安全性比cookie高。

也因此关了浏览器session当然仍然存在,因为session是储存在服务器端的,而服务器是不知道你有没有关掉浏览器的。

获取session里的信息是通过存放在会话cookie里的session id获取的。

session是存放在服务器的内存中里,而session里的数据不断增加会造成服务器的负担,所以会把很重要的信息存储在session中,而把一些次要东西存储在客户端的cookie里。

cookie确切的说分为两大类:会话cookie和持久化cookie。

会话cookie是存放在客户端浏览器的内存中,他的生命周期和浏览器是一致的,当浏览器关闭会话cookie也就消失了。

而持久化cookie是存放在客户端硬盘中,持久化cookie的生命周期(session-timeout)是我们在设置cookie时候设置的那个保存时间,

session的信息是通过session id获取的,而session id是存放在会话cookie当中的,当浏览器关闭的时候会话cookie消失,所以session id也就消失了,

但是session的信息还存在服务器端,并没有消失,只是查不到session但它并不是不存在。同时由于关闭浏览器不会导致session被删除,所以迫使服务器为seesion设置了一个失效时间(session-timeout),当距离客户端上一次使用session的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间。

对于“只要关闭浏览器,session就消失了”误解的解释

在谈论session机制的时候,常常听到这样一种误解“只要关闭浏览器,session就消失了”。其实可以想象一下会员卡的例子,除非顾客主动对店家提出销卡,否则店家绝对不会轻易删除顾客的资料。对session来说也是一样的,除非程序(相当于客户)通知服务器删除一个session,否则服务器会一直保留,程序一般都是在用户做log off的时候发个指令去删除session。浏览器从来不会在关闭之前主动通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器是否关闭。之所以会有这种错觉,是因为大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个session id就消失了,再次连接服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,把原来的session id发送给服务器,即持久化cookie,则再次打开浏览器仍然能够找到原来的session。

对于session,request,cookie的理解的更多相关文章

  1. Session、Cookie简单理解

    Session: session是一种记录客户状态的机制,session是保存在服务器上的,当浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这就是所谓的session,当浏览器再 ...

  2. session与cookie的理解

    噶,nation同志又给我布置任务了~~是隔壁家老王提到多次的,session和cookie的运行机制问题~~于是我真的意识到一个问题,程序猿都是一个德行! 1. cookie概述 cookie 常用 ...

  3. 关于http协议session和cookie的理解

    http是无状态协议,不能够记录访问者的身份, 为了解决这一问题服务器端设置了session 浏览器端设置了cookie 这种机制 当浏览器第一次访问服务器的时候,服务器会判断是否有cookie的存在 ...

  4. Session和Cookie的理解

    原文地址:https://juejin.im/post/5aede266f265da0ba266e0ef

  5. 理解Session与Cookie

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

  6. 转!!深入理解 Session 与 Cookie

    摘要 Session 与 Cookie 不管是对 Java Web 的初学者还是熟练使用者来说都是一个令人头疼的问题.在初入职场时恐怕很多程序员在面试的时候都被问到过这个问题.其实这个问题回答起来既简 ...

  7. 对session和cookie的一些理解

    由于项目需要,最近用session容器比较多,传载的同时加上了自己的一些理解,不足之处还请大家补充和纠正.);                  response.addCookie(c1);   * ...

  8. 深入理解Session与Cookie(一)

    Session,Cookie简介: Session和Cookie的作用都是为了保持用户与后端服务器的交互状态,但是各自都有缺陷: Cookie: 随着Cookie的个数的增多和访问量的增加,它占用的网 ...

  9. 深入理解 Session 与 Cookie

    Session 与 Cookie 的作用都是为了保持访问用户与后端服务器的交互状态.它们有各自的优点,也有各自的缺陷,然而具有讽刺意味的是它们的优点和它们的使用场景又是矛盾的.例如,使用 Cookie ...

随机推荐

  1. MySQL知识小结

    MySQL的知识面试中还是经常被问到的,简单的使用似乎无法达到面试官的要求,很多问题会关于Mysql存储引擎,所以这里还是需要系统学习一下Mysql的一些知识,面试过程中游刃有余. MySQL体系结构 ...

  2. 【CF802L】Send the Fool Further! (hard) 高斯消元

    [CF802L]Send the Fool Further! (hard) 题意:给你一棵n个节点的树,每条边有长度,从1号点开始,每次随机选择一个相邻的点走,走到一个叶子时就停止,问期望走的总路程. ...

  3. github使用密钥登录

    注册github之后 初次使用git的用户要使用git协议大概需要三个步骤: 一.生成密钥对 二.设置远程仓库(本文以github为例)上的公钥     一.生成密钥对 再window系统中可以通过x ...

  4. iOS - 处理计算精度要求很高的数据,floatValue,doubleValue等计算不精确问题

    .问题描述:服务器返回的double类型9...94的数字时 .之前处理方式是 :(从内存.cpu计算来说double都是比较合适的,一般情况下都用double) goodsPrice.floatVa ...

  5. Mysql带返回值与不带返回值的2种存储过程

    过程1:带返回值: 1 drop procedure if exists proc_addNum; 2 create procedure proc_addNum (in x int,in y int, ...

  6. springMVC访问 WEB-INF 下的 jsp 和 html

    配置freemarker,记得加上jar包 <?xml version="1.0" encoding="UTF-8"?> <beans xml ...

  7. jsp页面获取参数的方法(url解析、el表达式赋值、session取值)【原创】

    最近使用myEclispse做网站,使用jsp+js+css做页面,网站中常用到从列表进入详情页面的跳转,下面对详情页面的值填充方式做一个简单总结: 1.url中使用request获取参数 jsp上方 ...

  8. vue报错 Module not found: Error: Cannot resolve 'file' or 'directory'

    炸了,我好写sell而组件,直接就用了,我的天哪 看你的写了吗,就用: Module not found: Error: Cannot resolve 'file' or 'directory' 页另 ...

  9. 51nod 1042数字0-9的数量

    1042 数字0-9的数量  基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 给出一段区间a-b,统计这个区间内0-9出现的次数. 比如 10-19 ...

  10. 从经典面试题看java中类的加载机制

    1.概述 类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行,对理解java虚拟机的连接模型和java语言的动态性都有很大帮助. 由于Ja ...