servlet容器request、session、application以及cookie

1.servlet容器request /session/ application

1.1 这三种对象可以在服务器内部帮我们保存数据以及传递数据.
			类型(接口)      对象名
	   HttpServletRequest   request
	   HttpSession			session
	   ServletContext	    application

1.2 doGet或者doPost中怎么拿到这三种对象
	request对象
		在doGet或者doPost方法的参数中
	session对象
		HttpSession session = request.getSession();
	application对象
		request.getServletContext();
		或者
		this.getServletContext();
		或者
		request.getSession().getServletContext();
		或者
		this.getServletConfig().getServletContext();

	注意:无论哪一种方式,拿到的都是同一个application对象

1.3	这三种对象的生命周期及作用范围
	request对象
	    生命周期:
			客户端每次发请求,服务器就会创建一个新的request对象,本次访问结束后,该request对象就会被销毁
		作用范围:
			使用request存/取数据只能在一次请求之内起作用.比如服务器内部跳转的时候(因为内部跳转客户端只发一次请求).
		注意:客户端重定向是不行的,因为客户端重定向会发出多个请求(多个新的request对象).

	session对象 (会话)
		获得session对象的三种方式:

		//如果request有对应的session,则返回这个session,如果request没有对应的session,则创建一个新的session并返回
		HttpSession session = request.getSession(true);

		//如果request有对应的session,则返回这个session,如果request没有对应的session,则返回null
		HttpSession session = request.getSession(false);

		//等同于request.getSession(true);
		HttpSession session = request.getSession();

		生命周期:
			getSession()方法第一次被调用时创建session对象。

			session.invalidate()调用的时候会销毁session

			session如果自动超时的话,也会被销毁
			session默认超时时间为30分钟
			session的超时时间可以在代码中设置或者在web.xml中设置
				代码中设置:session.setMaxInactiveInterval(5); 5秒

				web.xml中设置:
					1分钟超时,负数或者0为不限制时间
					<session-config>  
						<session-timeout>1</session-timeout>  
					</session-config>
			session超时时间是指:客户端不与服务器进行交互的时间

		作用范围:
			在一个会话之中起作用.一个会话中可以有多个request请求,所以放在session中的数据,可以被多个请求所共享.
		
		
		注意:注意服务器正常关闭和非正常关闭对session对象的影响(session被序列化的问题)
			【正常关闭会序列化到文件保存,非正常关闭不会】
			session钝化和活化:  
				钝化的现象,tomcat的work的文件下面产生一个临时文件seesion.ser
				活化的现象,临时文件session反序列化成session对象写到代码中
		
	application对象
		ServletContext被称为应用上下文/servlet上下文
		生命周期:
			启动tomcat服务器的时候,就会被创建
			关闭tomcat服务器的时候,就会被销毁
			而且每个项目在运行期间,都会有且只有一个application对象

		作用范围:整个项目在运行期间,只有一个application对象,所以这个对象是所有用户共享的,大家都可以向这个对象里面存值,也可以再拿出来.因为这个对象一个项目中只有一个.


1.4使用这三种对象存/取数据
	存值:
	request.setAttribute("key", value);
	session.setAttribute("key", value);
	application.setAttribute("key", value);
	
	取值:
	request.getAttribute("key");
	session.getAttribute("key");
	application.getAttribute("key");

2.会话追踪技术:cookie

2.1 http协议的访问是无状态的访问
	当前访问是不会知道之前访问的状态的.(http协议的访问是不会帮我们保存访问的记录/痕迹的)。

2.2 有些时候需要记录之前的访问状态
	比如在购物网站的时候,第一次访问点击购买了一个手机,第二次访问点击购买了一个电脑,第三次访问点击购物车结算,这个时候我们就必须知道前俩次访问的时候购买了什么,要不然就没有方法去结算。
	所以我们就有了会话追踪技术来解决这个访问无状态的问题

2.3 session和cookie的位置
	session是保存在服务器端的一个对象.客户端是没有session的.
	cookie在客户端和服务器端都会有。但是存在的形式不一样.在客户端cookie是以本地文件(浏览器管理的文件)的形式存在的,在服务器端是以java对象的形式存在.我们平时说说的cookie都是指的客户端文件形式存在的cookie

2.4 session和cookie的作用
	session是在服务器端保存用户的相关信息,cookie是在客户端保存用户的相关信息。同时cookie还可以在客户端保存session的信息,例如session的id值

2.5 session和cookie之间的关系
	1.客户端访问服务器的时候,假设服务器创建了一个session对象,服务器端的内存里面同时可能有好多个session对象,分别对应着不同客户端的访问,每一个session对象都有一个唯一的id值,叫做JSESSIONID。

	2.服务器端给客户端产生一个session对象后,会通过这次访问的response对象把这个session的JSESSIONID的值返回给浏览器,浏览器接收到后会把这个值以一个cookie文件的形式保存起来.

	3.在此之后,这个浏览器再发请求到服务器的时候,就会把之前保存在cookie文件中的JSESSIONID的值传给服务器,服务器通过这个JESSIONID的值就能够知道服务器内存中是哪一个session对象和当前这个客户端对应.
	
	4.这样以来,就能到达一个效果,客户端的每一次访问,在服务器端都能够拿到相同的一个session对象,从而实现不同请求之间通过相同的session对象进行数据的共享.

2.6 服务器端向浏览器写回cookie
	response对象会把cookie带回到浏览器,然后浏览器把cookie对象中的内容保存到对应的一个cookie的文件中。

	//创建cookie对象
	Cookie c1 = new Cookie("name","tom");
	Cookie c2 = new Cookie("msg","hello");
	//设置cookie的有效时间
	c1.setMaxAge(60*60*24*365);
	c2.setMaxAge(60*60*24*365*10);
	//把cookie放到response里面
	response.addCookie(c1);
	response.addCookie(c2);

	注意:如果没有设置cookie生效的时间,那么这个cookie就是会话cookie,当关闭浏览器的时候cookie就是失效了。

2.7 servlet中拿到从浏览器发送过来的cookie文件中的数据
	//从request中拿到一个cookie数组
	//如果没任何cookie数据则返回null
	Cookie[] cookies = request.getCookies();
	//遍历数组 拿出key和value
	for(Cookie c:cookies){
		String key = c.getName();
		String value = c.getValue();
		System.out.println(key+" : "+value);
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值