会话(状态)管理Cookie与Session(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34598667/article/details/83012671

会话(状态)管理Cookie与Session(一)

目录

  1. 什么是会话?
  2. 保存会话状态的两种技术
  3. Cookie应用
    a.Cookie运行原理
    b.创建Cookie

什么是会话

会话可以简单的理解为:用户打开浏览器访问了多个资源,然后关闭浏览器。整个过程称之为一次会话。
就像你去参加考试,监考老师要记录你来参加过考试,这种对于数据的管理我们称之为状态的管理。
我们所说的会话管理其实就是之状态管理,而状态的管理其实就是对数据的管理!
而在整个会话的过程中不可避免的会产生一些数据(状态)。程序要想办法来保存这些数据,但是浏览器发送的是基于HTTP协议的请求,HTTP又是无状态协议,所以我们要使用其他技术来完成状态的管理。


保存会话状态的两种技术

Cookie

Cookie是客户端技术,数据保存在客户端,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。
例如:你去奶茶店买奶茶,奶茶店会有积分卡,你每消费一次给你改个章,这个卡你是拿走的,并不是放在奶茶店。下次你再来消费时把你的积分卡带着即可。

Session

Session是服务器端技术,数据保存在服务器端,服务器在运行时为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。
例如:你去理发店理发办了个VIP,你的个人信息,余额等都是存放在理发店的系统中,你只要带个VIP的号码走即可,下次你来根据你的号码可以找到你的信息,无论你是剪头染发都可以。

Cookie应用

Cookie运行原理

1、当浏览器第一次访问服务器时,服务器会产生一个Cookie对象
2、当服务器向浏览器发送响应时,会把cookie对象以消息头的形式发送给浏览器,并保存在内存或硬盘上(通过程序设置)
3、当浏览器再次向同一服务器发送请求时会附带cookie信息
4、服务器可以得到cookie信息进行处理

Cookie案例

使用Servlet API提拱的javax.servlet.http.Cookie
1、编写一个servlet作为案例CookieServlet

@WebServlet(urlPatterns={"/cookie"})
public class CookieServlet extends HttpServlet{

   @Override
   protected void service(HttpServletRequest req, HttpServletResponse resp)
   		throws ServletException, IOException {
   	//设置Cookie 消息头是以name-value 名值对的形式存在的
   	Cookie cookie=new Cookie("city", "ShangHai");
   	//把cookie添加到响应对象上
   	resp.addCookie(cookie);
   }
}

2、通过浏览器访问,打开开发者工具,查看cookie
在这里插入图片描述

3、再次访问服务器,查看发送请求中的cookie

在这里插入图片描述

4、新建一个Servlet用于获取查看Cookie

@WebServlet(urlPatterns={"/getCookie"})
public class GetCookieServlet extends HttpServlet{

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		//使用request获取浏览器发送的所有Cookie对象 该方法有可能返回null
		Cookie [] cookies=req.getCookies();
		//遍历查看
		for(Cookie cookie:cookies){
			System.out.println(cookie.getName()+":"+cookie.getValue());
		}
	}
}

5、修改Cookie
两种方式
1)通过查找到cookie对象,然后使用setValue(String value)
2)新建一个同名的cookie对象,同名cookie会被覆盖

@WebServlet(urlPatterns={"/getCookie"})
public class GetCookieServlet extends HttpServlet{

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		//使用request获取浏览器发送的所有Cookie对象 该方法有可能返回null
		Cookie [] cookies=req.getCookies();
		//遍历查看
		for(Cookie cookie:cookies){
			//第一种
			if(cookie.getName().equals("city")){
				cookie.setValue("HeFei");
			}
		}
		//第二种
		Cookie c=new Cookie("city","HeFei");
	}
}

Cookie的生存时间

默认情况下,浏览器会将Cookie保存在内存中,只要浏览器不关闭, Cookie就一直存在
可以通过setMaxAge(int seconds)来设置过期时间 (单位为秒)
seconds>0:保存cookie在硬盘上,如果超过了指定时间则浏览器会删除此cookie
seconds=0:删除cookie,即response响应完成后即删除,可理解为不保存
seconds<0:默认值,浏览器会将cookie保存在内存中,即浏览器关闭则删除
1、新建在CookieServlet中添加过期时间

@WebServlet(urlPatterns={"/cookie"})
public class CookieServlet extends HttpServlet{

   @Override
   protected void service(HttpServletRequest req, HttpServletResponse resp)
   		throws ServletException, IOException {
   	//设置Cookie 消息头是以name-value 名值对的形式存在的
   	Cookie cookie=new Cookie("city", "ShangHai");
   	//添加过期时间为一天
   	cookie.setMaxAge(24*60*60);
   	//把cookie添加到响应对象上
   	resp.addCookie(cookie);
   	
   	
   }
}

2、访问并在浏览器的设置中查看cookie的过期时间
谷歌浏览器:设置->高级->内容设置->cookie

在这里插入图片描述

查看city的过期时间:

在这里插入图片描述


Cookie编码

Cookie只能保存合法的ASCII字符。如果要保存中文,需要将中文 转换成合法的ASCII字符,即编码

 new  Cookie( “city”, URLEncoder.encoder(“上海”,”utf-8”));

编码后的Cookie在查看时要需要重新编码
String value=URLDecoder.decode(cookie.getValue(),”utf-8”);
这里就不做案例了


Cookie路径问题

浏览器在访问服务器上的某个地址时,会比较Cookie的路径与该路 径是否匹配,要访问的地址必须是Cookie的路径或者其子路径时,浏览器才会发 送Cookie
例如:你是北大的学生,办了北大的校园卡,那么你可以使用北大的校园卡在北大横行,吃饭洗澡样样行,但是你想进清华的门进都进不去 !而如果你办了北大的洗澡卡,那你又只能去洗澡,不能拿洗澡卡去吃饭。
如果想改变访问路径怎么办?可以使用cookie设置

cookie.setPath(url);

Cookie的限制

Cookie可以被用户禁止
Cookie会将状态保存在浏览器端,不安全。
浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
Cookie只能保存字符串。


下一章Session讲解
https://blog.csdn.net/qq_34598667/article/details/83016178

猜你喜欢

转载自blog.csdn.net/qq_34598667/article/details/83012671