\2-11Cookie和Session-2

\第5节 Session快速入门

18_会话技术_Session_原理分析

## Session:主菜
	1. 概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。HttpSession
	2. 快速入门:
		1. 获取HttpSession对象:
			HttpSession session = request.getSession();
		2. 使用HttpSession对象:
			Object getAttribute(String name)  
			void setAttribute(String name, Object value)
			void removeAttribute(String name)  
	
	3. 原理
		* Session的实现是依赖于Cookie的。

我们打开idea服务器。
在浏览器访问sessiondemo1,sessiondemo2.
在idea有获取到值Attribute

但是如果将网页关闭。
再一次访问sessiondemo2。没有获取到值,
说明session就是一次会话。

原理图

在这里插入图片描述

会话

会话是指一个终端用户与bai交互系统进行通讯的du过程。

比如zhi从输入账户密码进dao入操作系统到退出操作系统就是一个会话过程。会话较多用于网络上,TCP的三次握手就创建了一个会话,TCP关闭连接就是关闭会话。
Session代表服务器与浏览器的一次会话过程,这个过程是连续的,也可以时断时续的。在Servlet中,当JSP页面没有显式禁止session的时候,在打开浏览器第一次请求该jsp的时候,服务器会自动为其创建一个session,并赋予其一个sessionID,发送给客户端的浏览器。
以后客户端接着请求本应用中其他资源的时候,会自动在请求头上添加:(Cookie:SESSIONID=客户端第一次拿到的session ID)。这样,服务器端在接到请求时候,就会收到session ID,并根据ID在内存中找到之前创建的session对象。

在这里插入图片描述
在这里插入图片描述

\第6节 Session细节

4. 细节:
		1. 当客户端关闭后,服务器不关闭,两次获取session是否为同一个?
			* 默认情况下。不是。客户端关闭,一次会话结束。
			* 如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。
				 Cookie c = new Cookie("JSESSIONID",session.getId());
		         c.setMaxAge(60*60);
		         response.addCookie(c);

		2. 客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
			服务器都关闭了,session对象被销毁。
			* 不是同一个,但是要确保数据不丢失。tomcat自动完成以下工作
				* session的钝化:
					* 在服务器正常关闭之前,将session对象系列化到硬盘上
				* session的活化:
					* 在服务器启动后,将session文件转化为内存中的session对象即可。
				
		4. session什么时候被销毁?
			1. 服务器关闭
			2. session对象调用invalidate()3. session默认失效时间 30分钟
				选择性配置修改	
				<session-config>
			        <session-timeout>30</session-timeout>
			    </session-config>

20_会话技术_Session_细节2

这个视频需要重新看一遍。

有讲解一部分,路径的内容

21_会话技术_Session_细节3_session销毁

22_会话技术_Session_特点

 5. session的特点
		 1. session用于存储一次会话的多次请求的数据,存在服务器端
		 2. session可以存储任意类型,任意大小的数据

		* session与Cookie的区别:
			1. session存储数据在服务器端,Cookie在客户端
			2. session没有数据大小限制,Cookie有
			3. session数据安全,Cookie相对于不安全

\第7节 Session之验证码案例

23_案例_验证码_需求&分析

在这里插入图片描述

24_案例_验证码_代码实现

重定向和请求转发的区别

http://blog.sina.com.cn/s/blog_8d40d34b0102uy5p.html

比喻:
请求转发:A向B发送请求,想让B帮忙完成一项工作,当B接收到请求后发现自己完成不了,于是B请C帮忙,C接收到B的请求后最终完成了该项工作,并把最后的结果返回给A。此过程A只发送了一次请求给B,A只知道把请求发给B,至于B是怎么完成的A并不关心,他只等待最终的结果。
重定向:A向B发送请求,想让B帮忙完成一项工作,当B接收到请求后发现自己无法完成,就立即告诉A情况,并向A推荐C可以完成该项工作,于是A就找C帮忙,C最终完成该项工作,返回给A。

不同点:
1、浏览器地址栏显示不同(表面区别):
无论进行多少次请求,如果使用请求转发来实现,浏览器地址栏中只显示第一次发送请求的地址;
如果使用重定向来实现,浏览器地址栏显示的是每次请求的新地址。这只是表面上看到的不同地方。

2、组件之间可否共享信息不同(本质区别)
从本质上讲,请求转发时,从发送第一次到最后一次请求的过程中,WEB容器只创建一次request和response对象,请求之间始终共享这两个对象,所以每个请求可以访问他之前请求中的参数和属性的值;
而重定向时,浏览器每发送一次请求,WEB容器都会重新创建新的request和response对象,所以请求之间不能共享信息,即不能在请求中访问到他之前请求中的参数和属性的值。

3、实现方式不同:
3.1 请求转发的实现步骤:
1)说明将要转发的资源;
2)获取请求转发的对象;
3) 调用请求转发对象中forward()方法
Java代码
1). String forward = “/a.jsp”;
2). RequestDispatcher rd = request.getRequestDispatcher(forward);
3). rd.forward(request, reponse);
综合:request.getRequestDispatcher("/a.jsp").forward(request,response);

3.2 重定向的实现步骤:

  1. 说明将要重定向的资源;
  2. 调用response对象中sendRedirect方法
    Java代码
  1. String resource = request.geContextPath() + “/a.jsp”;
  2. response.sendRedirect(resource);
    综合:response.sendRediect(request.geContextPath() + “/a.jsp”);

4、知情人不同
请求转发的过程只有WEB服务器知道,而浏览器不知道进行了多少次转发,以及都转发给哪些组件(servlet,JSP),它只是在等待WEB服务器最终的结果。
而重定向时,每发送一次请求,WEB服务器都会通知浏览器的,所以重定向了几次请求以及每次都向哪个组件发送的请求,浏览器很清楚,当让WEB服务器也很明白。

相同点: 两者都可以进行多次请求的转发。

总结:什么情况下使用重定向,什么情况下请求转发,这个不是看我们的习惯,而是什么情况下必须用什么:
重定向:之前的request中存放的变量全部失效并进入一个新session的作用域;
请求转发:之前的request中存放的变量没有失效,就想把两个页面拼在一起

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值