状态管理 Cookie Session

为什么需要状态管理

  • Web应用程序使用HTTP协议通信,而HTTP协议是"无状态"协议,即服务器一旦响应完客户请求之后,就断开连接,而同一用户的下一次请求有需要重新建立网络连接.
  • 服务器应用程序有时需要判断是否同一用户发出的请求,比如客户的多次选购商品.因此,有必要跟踪同一个客户发出的一系列请求.
  • 将客户端(浏览器)与服务器之间多次交互(一次请求,一次响应)当做一个整体来看待,并且将多次交互所涉及的数据即状态保存下来.状态指的是数据,管理指的是多次交互时对数据的修改.

什么是Cookie
浏览器向Web服务器发送请求时,服务器会将少量的数据以set-Cookie消息头的方式发送给浏览器,浏览器将这些数据保存下来.当浏览器再次访问服务器时,会将这些数据以Cookie消息头的方式发送给服务器.
状态管理 Cookie Session
创建Cookie
Cookie cookie = new Cookie(String name,String value)
name:区分不同Cookie的名字
value:Cookie存储的值
查询Cookie
Cookie[ ] request.getCookies();
String Cookie.getName();
String Cookie.getVlaue();
修改Cookie

	Cookie[] cookies = request.getCookies();
		if(cookies != null){
			for(Cookie cookie:cookies)
			String name = cookie.getName();
				if(name.equals("city")){
					cookie.setValue("hangzhou")
					response.addCookie(cookie);
		}
}

Cookie的生存时间
默认情况下,浏览器会将Cookie保存到内存中,只要浏览器不关闭,Cookie就一直存在.如果希望关闭浏览器后Cookie仍在,可以通过设置过期时间
Cookie.setMaxAge(int seconds)
状态管理 Cookie Session

Cookie的路径问题
状态管理 Cookie Session
状态管理 Cookie Session

Cookie的限制
状态管理 Cookie Session

什么是Session
浏览器访问Web服务器时,服务器会为每一个浏览器在服务器端的内存中分配空间,单独创建一个Session对象,该对象有一个Id属性,其值唯一,一般称之为SessionId,并且服务器将这个SessionId(使用Cookie的方式)发送给浏览器,浏览器再次访问服务器时,会将SesssionId发送给服务器,服务器可以根据SessionId找到对应的对象.
状态管理 Cookie Session

获取Session
状态管理 Cookie Session

Session绑定对象
绑定对象 void Session.setAttribute(String name,Object obj);
获取绑定对象 Object Session.getAttribute(String name);
移除绑定对象 void Session.removeAttribute(String name);
Session验证
用户访问需要保护的资源师,可以使用Session验证的方式来保证其安全性,比如要求登陆后才能访问的资源.
实现Session验证,有以下步骤:
- 使用Session.setAttribute()先绑定数据
- 使用Session.getAttribute()方式来读绑定值,如果没有,则跳转回登录界面
Session超时
Web服务器会将空闲时间过长的Session对象删除掉,以节省服务器内存空间资源.缺省的超时时间限制一般是30分钟.

30 修改缺省时间

session,setMaxInactiveInterval(int seconds) 修改缺省时间
禁用Cookie的后果
状态管理 Cookie Session
URL重写
浏览器在访问服务器上的某个地址是,不再使用原来的那个地址,而是使用经过改写的地址(在原来的地址后面加上SessionId)
链接地址和表单提交:response.encodeURL(String url)生成重写后的URL
重定向:response.encodeRedirectURL(String url)生成重写后的URL
Session的优缺点
状态管理 Cookie Session