对于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 ...
随机推荐
- OpenStack cloud 第一天
这是刚接触openstack时候,看到的第一篇文章,感触很深,自己很喜欢的一个词Horizon就是出自本文 ============================================ ...
- linux下压缩和解压
.tar 解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!)———————————————.gz解压1:gun ...
- Windows正向绑定shell和反向反弹shell的Python代码
Windows下的shell原理 经过查阅资料,使用os.dup2(nfd, ofd)的方式重定向socket的输入输出到windows系统的cmd是无法做到的,属于系统原因,不能直接复制Linux下 ...
- ubuntu 14.04 升级到 16.04 问题总结
1. 需要的依赖关系未安装 The required dependency 'apt (>= 1.0.1ubuntu2.13)' is not installed. http://forum.u ...
- 添加Net4CollectionTypeFactory的原因
.NET4.0已经实现了该功能 http://jahav.com/blog/nhibernate-using-net-4-iset/ NHibernate using .NET 4 ISet 0 Co ...
- Android ActivityManager与WindowManager
<uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission ...
- JAVA基础知识点转载
JAVA部分: 1.Java 指定线程执行顺序(三种方式) 转载link:https://blog.csdn.net/difffate/article/details/63684290 2.jdk7中 ...
- 基于pandas python的美团某商家的评论销售(数据分析)
数据初步的分析 本文是该系列的第一篇 数据清洗 数据初步的统计 第二篇 数据可视化 第三篇 数据中的评论数据用于自然语言处理 from pyecharts import Bar,Pie import ...
- 2018牛客网暑期ACM多校训练营(第四场) A - Ternary String - [欧拉降幂公式][扩展欧拉定理]
题目链接:https://www.nowcoder.com/acm/contest/142/A 题目描述 A ternary string is a sequence of digits, where ...
- Git:从github上克隆、修改和更新项目
一.在本地新建一个文件夹,作为本地仓库,如“BigProjet”.在该文件夹打开git bash,进入到该文件夹目录下 二.将本地仓库初始化 $ git init 三.将项目从github或者服务器上 ...