JavaWeb(五)——Session和Cookie

会话技术

  • 会话过程
  • cookie
    • cookie流程
    • cookie应用
      • Cookie的持久化时间
      • Cookie的携带地址设置
      • 获取cookie参数
    • 将用户最后访问时间封装到cookie中
    • Cookie中存入中文
  • Session
    • Session应用
    • session的钝化与活化技术

会话过程

一次简单请求过程:浏览器发送请求到服务器,服务器解析请求创建request和response对象
将请求转给对应的servlet对象,调用service方法,处理业务,产生响应数据
封装响应数据,返回浏览器响应
至此request和response域对象消亡
一次简单的会话过程:浏览器访问服务器到浏览器的关闭代表了一次会话

用户的数据如果存放在request域中的话,域对象的范围太小,
	每次请求都会产生新的请求对象,用户数据无法持久
用户的数据如果存放在servletContent域中的话,域对象的范围太大,
	当前服务不停止,域对象一直存在,过于消耗资源

因而产生了cookie与session对象来存储用户的数据

cookie

会话技术分为Cookie和Session
Cookie:数据存储在客户端本地,减少服务器端的存储的压力,
安全性不好,客户端可以清除或者禁用cookie

cookie流程

客户端发送请求到服务器,服务器将信息写入cookie对象,将cookie对象加入响应对象中响应给客户端	
客户端每次发送请求的时候在请求头中都会带上这个cookie对象
Cookie:JSESSIONID=A242202CB4BCE9BDA489F7555544388D; 
username=xxx
无论访问什么资源地址都会带上这个cookie对象

cookie应用

在Servlet中创建Cookie
Cookie cookie = new Cookie(String cookieName,String cookieValue);
注意:Cookie中不能存储中文

向响应中添加cookie
response.addCookie(Cookie cookie);

Cookie的持久化时间

cookie默认是存储在浏览器的缓存中,是会话级别的,会话开始而存在,会话结束(浏览器关闭)而销毁
想延长cookie在客户端的持久化时间,需要单独设置
cookie.setMaxAge(int seconds); ---时间秒
这样Cookie就会存储到硬盘中,不会因为浏览器的关闭而销毁
只会因为持久化时间的到来而销毁

Cookie的携带地址设置

 无论访问什么资源地址都会带上cookie对象
 可以设置携带Cookie对象的资源地址
 cookie.setPath(String path); 只允许path资源路径可以携带Cookie对象
 示例:
cookie.setPath("/WEB");
代表访问WEB应用中的任何资源都携带cookie

注意:如果不设置携带路径,那么该cookie信息会在访问产生该cookie的web资源所在的路径都携带cookie信息
例如该cookie对象产生路径为/WEB/mycookie/coo下产生,
不设置携带路径,则/WEB/mycookie下所有路径的访问都会携带cookie信息

获取cookie参数

Cookie[] cookies = request.getCookies();获取请求中的cookie对象
通过cookie名称获得想要的cookie
	if(cookies!=null){
		for(Cookie cookie : cookies){
			//获得cookie的名称
			String cookieName = cookie.getName();
			if(cookieName.equals("name")){
				//获得该cookie的值
				String cookieValue = cookie.getValue();
				System.out.println(cookieValue);
			}
		}
	}

将用户最后访问时间封装到cookie中

//获取当前访问时间
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String currentTime = format.format(date);

//创建Cookie 记录当前的最新的访问时间
Cookie cookie = new Cookie("lastAccessTime",currentTime);
cookie.setMaxAge(60*10*500);//设置过期时间
response.addCookie(cookie);//添加cookie对象到响应中

//获得客户端携带cookie ---- lastAccessTime
String lastAccessTime = null;
Cookie[] cookies = request.getCookies();
if(cookies!=null){
     
	for(Cookie coo : cookies){
     
		if("lastAccessTime".equals(coo.getName())){
     
			lastAccessTime = coo.getValue();
		}
	}
}
//展示时间
response.setContentType("text/html;charset=UTF-8");
if(lastAccessTime==null){
     
		response.getWriter().write("您是第一次访问");
	}else{
     
		response.getWriter().write("您上次的访问的时间是:"+lastAccessTime);
	}

Cookie中存入中文

cookie不能直接存入中文
但是可以将中文编码为二进制文件再存入
取出时再解码为字符串即可
//获取中文参数
String username = request.getParameter("username");
//对中文进行编码
String username_code = URLEncoder.encode(username, "UTF-8");// %AE4%kfj
//创建cookie
Cookie cookie_username = new Cookie("cookie_username",username_code);
//设置cookie的持久化时间
cookie_username.setMaxAge(60*60);
//设置cookie的携带路径
cookie_username.setPath(request.getContextPath());
//发送cookie
response.addCookie(cookie_username);
获取cookie中的中文编码
String cookie_username = null;
//获得cookie
Cookie[] cookies =request.getCookies();
if(cookies!=null){
     
		for(Cookie cookie : cookies){
     
			//获得cookie_username
			if("cookie_username".equals(cookie.getName())){
     
				cookie_username = cookie.getValue();
				//恢复中文用户名
				cookie_username = URLDecoder.decode(cookie_username, "UTF-8");
			}			
		}
	}

Session

Session基于Cookie技术的,Cookie存储Session标识ID——JSESSIONID	
请求达到服务器,服务器创建一个session对象在服务器端存储(仅作用于一次会话)
返回session标识ID存放到cookie中,下次访问时自动带上session标识ID
服务器通过session标识ID找对应的session对象
发送编号和根据编号去寻找Session对象是服务器自动去完成的,不需要手动设置

一个客户端只会存在一个session
不同的浏览器访问同一个服务器session是不同的
session存储在服务端

Session应用

Session的获取
request.getSession();通过请求对象获取Session对象
session.setAttribute(key, value);Session对象存储数据
					当存储的是一个对象时,该对象需要实现序列化接口Serializable
session.getId();获取session对象的id

request.getSession()方法内部会判断 该客户端是否在服务器端已经存在session
如果该客户端在此服务器不存在session 那么就会创建一个新的session对象
如果该客户端在此服务器已经存在session 获得已经存在的该session返回
//通过请求对象获取Session对象
HttpSession session = request.getSession();
//存储数据
session.setAttribute("name", "zs");
//获取session对象的id
String id = session.getId();

//手动创建一个存储JSESSIONID的Cookie 为该cookie设置持久化时间
Cookie cookie = new Cookie("JSESSIONID",id);
cookie.setPath("/WEB/");//设置cookie对象携带路径
cookie.setMaxAge(60*60*24);//设置cookie对象的过期时间,单位秒
response.addCookie(cookie);//往响应中添加cookie对象
response.getWriter().write("JSESSIONID:"+id);//在页面展示session对象id值

//从session中获得存储的数据
HttpSession session = request.getSession();
Object attribute =  session.getAttribute("name");	
Session对象的生命周期
	创建:第一次执行request.getSession()时创建
销毁:
1)服务器(非正常)关闭时
2)session过期/失效(默认30分钟)	
	问题:时间的起算点 从何时开始计算30分钟?
	从不操作服务器端的资源开始计时(不发送请求,不操作资源)		
	可以在工程的web.xml中进行配置
	
	        30
	
3)手动销毁session
	session.invalidate();

浏览器关闭不会导致session销毁
JSESSIONID是存储在浏览器的,所以关闭浏览器后Cookie对象会销毁,再次打开浏览器session对象就是新的对象

如果禁止浏览器的Cookie就会使得session的方法出错,如session.setAttribute()存入数据时,getAttribute()获取的值为null

session的钝化与活化技术

session的活化(从硬盘到内存)
session的钝化(从内存到硬盘)
HttpSessionActivationListener接口可以监听session的钝化和活化
重写sessionWillPassivate方法:监听钝化
重写sessionDidActivate方法:监听活化
示例:
1.自定义一个MyTest类实现Serializable接口和HttpSessionActivationListener接口
2.在servlet中创建这个MyTest类,为其属性赋值
3.将这个对象存储到session中
4.获取session中的数据

你可能感兴趣的:(java)