对于session,request,cookie的理解
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的理解的更多相关文章
- Session、Cookie简单理解
Session: session是一种记录客户状态的机制,session是保存在服务器上的,当浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这就是所谓的session,当浏览器再 ...
- session与cookie的理解
噶,nation同志又给我布置任务了~~是隔壁家老王提到多次的,session和cookie的运行机制问题~~于是我真的意识到一个问题,程序猿都是一个德行! 1. cookie概述 cookie 常用 ...
- 关于http协议session和cookie的理解
http是无状态协议,不能够记录访问者的身份, 为了解决这一问题服务器端设置了session 浏览器端设置了cookie 这种机制 当浏览器第一次访问服务器的时候,服务器会判断是否有cookie的存在 ...
- Session和Cookie的理解
原文地址:https://juejin.im/post/5aede266f265da0ba266e0ef
- 理解Session与Cookie
写在前面的话:Session和Cookie是非常有意思的两个概念,对于两者的管理可以处理的很复杂,但是无论如何,理解Session和Cookie的基本概念和发明初衷,对于问题的解决,大有裨益. === ...
- 转!!深入理解 Session 与 Cookie
摘要 Session 与 Cookie 不管是对 Java Web 的初学者还是熟练使用者来说都是一个令人头疼的问题.在初入职场时恐怕很多程序员在面试的时候都被问到过这个问题.其实这个问题回答起来既简 ...
- 对session和cookie的一些理解
由于项目需要,最近用session容器比较多,传载的同时加上了自己的一些理解,不足之处还请大家补充和纠正.); response.addCookie(c1); * ...
- 深入理解Session与Cookie(一)
Session,Cookie简介: Session和Cookie的作用都是为了保持用户与后端服务器的交互状态,但是各自都有缺陷: Cookie: 随着Cookie的个数的增多和访问量的增加,它占用的网 ...
- 深入理解 Session 与 Cookie
Session 与 Cookie 的作用都是为了保持访问用户与后端服务器的交互状态.它们有各自的优点,也有各自的缺陷,然而具有讽刺意味的是它们的优点和它们的使用场景又是矛盾的.例如,使用 Cookie ...
随机推荐
- Sass::SyntaxError related to active_admin/mixins
in active_admin.css.sass, change: @import "active_admin/mixins"; @import "active_admi ...
- 一辈子只有1次成为BAT的机会,你如何把握?
本文转自:http://www.fmi.com.cn/index.php?m=content&c=index&a=show&catid=9&id=614308 感谢作者 ...
- 23种设计模式之外观模式(Facade)
外观模式是对象的结构模式,要求外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 优点: 1 ...
- [工具] TreeSizeFree 查看每个文件夹的大小
下载 URL :http://www.jam-software.com/treesize_free/ TreeSize Free这个软件可以非常简单方便的查看到每个文件夹的大小,而目录树的查看方式则让 ...
- PHPStorm 注册码&主题皮肤
JetBrains PhpStorm 注册方法: 用浏览器打开 http://idea.lanyus.com/ 点击页面中的“获得注册码” 然后打开PhpStorm,在注册时切换至Activation ...
- yii---实现加一或减一
废话少说,直接看: /** * 添加帖子的浏览数 * @author fyz */ public function addViewNum($threadId){ $list = ForumThread ...
- linux 安装Swagger(swagger-editor , swagger-ui)
一.环境要求 1.Nodejs ( 版本6.0x以上 ) 2.npm (npm 3.x) 注: linux 更新nodejs到最新 node -v 4.2.1 sudo npm cache clean ...
- pandas 数据预处理
pandas 数据预处理 缺失数据处理 csv_data=''' A,B,C,D 1.0,2.0,3.0,4.0 5.6,6.0,,8.0 0.0,11.0,12.0,,''' import pand ...
- 【微信小程序】---线上环境搭建
一.前言 通常我们在本地电脑上开发微信小程序,调用和访问小程序会有很多问题.特别是在配有自己后端的情况下,我们通过真机访问我们的小程序会出现不可访问的问题 二.线上环境搭建 在这里我们主要以腾讯云给大 ...
- Saltstack之job管理和runner
Master端执行命令及操作默认会保存在master端的/var/cache/salt/master/jobs 默认保存时间是24小时 如果需要保存在数据库 先参考http://www.cnblogs ...