【Servlet--状态管理、cookie、session、servletContext】


一、Servlet状态管理

1.为什么要进行状态管理?

	·HTTP协议本身是无状态的,不能保存客户端与服务器端交互的数据
	·当用户发送新的请求时,无法判定是否与上一次请求有联系
	·对于用户的相同请求,必须重复多次提交,用户体验差(例如:每次登录都要输入账密等信息)

2.什么是状态管理

	为了解决以上存在的问题,将浏览器与服务器之间的多次交互所涉及的数据(即状态)保存下来,并对其进行管理。

3.状态管理分类

客户端状态管理:代表cookie,将浏览器与服务器交互数据保存在客户端

服务器状态管理:代表session和application,将状态保存在服务器端

二、Cookie

1.什么是cookie?

	cookie是浏览器在访问web服务器的某个资源时,由web服务器在HTTP响应头中附带传送给浏览器的一小段数据
	浏览器保存了cookie后,在以后每次访问该web服务器时,都会在HTTP请求头中将这个cookie回传给web服务器

2.cookie执行流程

	1)浏览器第一次访问web服务器
	2)web服务器中创建cookie,并在响应头中携带cookie给浏览器
	3)浏览器收到web服务器响应的cooike后存储
	4)第二次访问web服务器时,携带cookie
	5)web服务器收到请求后,从请求中查找cookie,存在就获取,并执行操作

3.cookie的创建与使用

	1)创建cookie对象
	Cookie cookie = new Cookie(String name,String value);
	2)设置cookie路径(只有设置路径下的资源共享,访问;默认是当前项目下所有资源都可以访问)
	cookie.setPath()
	3)设置cookie生命周期
	cookie.setMaxAge(int n)		(n的取值(单位秒):0代表不存储;小于0代表临时存储,浏览器关闭时无效;大于0代表设置的有效期
	4)将cookie添加到响应中
	response.addCookie(cookie);
	5)获取cookie
	Cookie[] cookies=request.getCookies();
	5)修改cookie(确保cookie名称和路径与之前一致,新的cookie的值才会覆盖之前的)
	Cookie cookie1 = new Cookie(String name,String value);
	cookie1.setPath()
	cookie1.setMaxAge(int n)	//有效期也会覆盖之前的
	response.addCookie(cookie1);

4.cookie编码与解码

1)cookie默认不支持中文,只能包含ASCII字符,所以使用cookie存储中文,需要对Unicode字符进行编码,否则会出现乱码

		·编码可以使用java.net.URLEncoder类的encode(String str,String encoding)方法
		·解码可以使用java.net.URLDecoder类的decode(String str,String encoding)方法

2)创建带中文的cookie

//创建带中文的cookie
Cookie cookie = new Cookie(
URLEncoder.encode("姓名",“utf-8),
URLEncoder.encode("张三"),“utf-8)
);
response.addCookie(cookie)

//获取带中文的cookie
Cookie[] cookies =request.getCookies();
if(cookies != null){
	for(Cookie cookie: cookies){
		System.out.println(
		URLDecoder.decode(cookie.getName(),"utf-8")+":"+
		URLDecoder.decode(cookie.getValue(),"utf-8")
		);
	}
}

5.cookie优点与缺点

优点

	1)可以配置到期规则
	2)简单性:cookie是一种基于文本的轻量结构,包含简单的键值对
	3)数据持久型:cookie默认在过期之前是可以一直保存在浏览器上的

缺点

	1)大小受到限制:大多数浏览器对cookie的大小有4k,8k字节的限制
	2)用户配置为禁用:有些用户禁用了浏览器或者客户端接收cookie
	3)潜在风险:cookie可能会被篡改,对安全性造成潜在风险或者导致依赖与Cookie的应用程序失败

三、Session

1.什么是Session

	session用于记录一段时间内(一个会话中),单个客户端与web服务器多次交互过程中的数据
	
	原理解析:
	服务器会为每一次会话分配一个session对象
	同一个浏览器发起的多次请求,同属于一次会话(session)
	首次使用到session时,服务器会自动创建session,并创建cookie存储sessionID发送给客户端

	应用场景:
	1.用于管理员权限验证
			管理员首次登录:
				·获取请求数据
				·调用业务方法
				·判断查询结果,如果不为空,则将管理员信息保存到session域中;如果为空,则跳转登录页面
			管理员业务操作:
				·从session中获取管理员登录信息
				·判断,如果管理员登录信息为空,则跳转登录页面;如管理员信息不为空,表示已登录,则调用业务方法,转发跳转jsp显示结果
	2.用于验证码的验证

2.Session作为域对象

	session作用域:拥有存储数据的空间,作用范围是一次会话有效
			·一次会话是:使用同一个浏览器发送的多次请求,一旦浏览器关闭,则结束会话
			·可以将数据存入session中,在同一次会话中的任意位置获取数据
			·可以传递任意类型数据(基本类型数据,对象,集合,数组等)

3.Session的使用

	HttpSession session = request.getSession();					获取session对象
	session.getId()																	获取session的唯一标记
	session.setAttribuet(String name,Object value) 				将数据存储到session域中
	Object value = session.getAttribute(String name);			获取session中存储的数据
	session.removeAttribute(String name);							将name对应的值从session中移除

4.Session的生命周期

开始:浏览器第一次请求服务器端时,由服务器端创建session对象

结束:浏览器关闭、session超时、手动销毁

		session.setMaxInactiveInterval(seconds)					设置最大有效时间(单位:秒)
		session.invalidate()								手工销毁,应用场景:登录退出、注销

四、浏览器禁用cookie的解决方案

1.浏览器禁用cookie导致的后果

	服务器在默认情况下,会使用Cookie的方式将sessionID发送给浏览器,如果用户禁用cookie,则sessionID无法发送给浏览器保存

2.解决方案:重写URL

	浏览器在访问服务器上某个地址时,在原来的地址上增加sessionID
	String newUrl = response.encodeRedirectURL(String url)				重写url
String newUrl = response.encodeRedirectURL(String url);
System.out.println(newUrl);
response.sendRedirect(newUrl);

//newUrl的输出结果:url;jsessionid=sessionid值
//此时即使用户端禁用cookie,也可以确保是同一次会话

五、ServletContext

1.什么是ServletContext

	·全局对象,有自己的作用域,对应一个tomcat中的web应用(即在整个web应用中可以共享数据)
	·当web服务器启动时,会为每一个web应用程序创建一个servletContext域对象,当服务器关闭时销毁

	应用场景:统计当前项目的访问次数

2.ServletContext使用

	1)获取ServletContext对象
		GenericServlet提供了getServletContext()方法  		(推荐)this.getServletContext()
		HttpServletRequest提供了getServletContext()方法
		HttpSession提供了getServletContext()方法
	2)获取项目真实路径
		servletContext.getRealPath("/");
	3)获取项目上下文路径
		servletContext.getContextPath();
		request.getContextPath();
	4)存储数据
		servletContext.setAttribute(String name,Object value);
	5)获取数据
		servletContext.getAttribute(String name);
	6)移除数据
		servletContext.removeAttribute(String name);

六、request、session、servletContext比较

	request是一次请求有效,请求改变,则request改变(用于存储临时数据)
	session是一次会话有效,浏览器改变,则session改变(用户保存登录状态,权限验证等)
	servletContext是服务器启动开始,到服务器关闭之前有效,作用范围是整个web容器(全局访问次数统计等)

与poppy一起学习

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值