会话技术(cookie)

会话技术(cookie)

什么是会话?

会话:生活中 一次谈话 一次交谈

会话是浏览器和服务器之间的多次请求和响应
为了实现某一个功能(比如买东西),浏览器和服务器之间可能会产生多次的请求和响应,从浏览器访问服务器开始,到访问服务器结束,浏览器关闭为止,这期间产生的多次请求和响应加在一起就称之为浏览器和服务器之间的一次会话

web中的会话:指的是 浏览器与服务器建立的一次连接
这次连接 就称之为一次会话 在这次会话中 可以包含多次请求与多次响应
并且可以在多次请求和响应间进行数据共享

会话技术 解决多次请求间 数据共享的问题

客户端会话技术:Cookie 把数据保存在客户端 减轻服务器压力 不好之处 数据不安全 容易被篡改

服务端会话技术:Session 把数据存在服务端 增加了服务器的压力 数据安全

http是无状态的协议,客户每次读取web页面时,服务器都打开新的会话,而且服务器也不会自动维护客户的上下文信息。如果说我们要实现购物车添加或删除商品的功能的话,我们就需要使用到Cookie和Session技术。也就是说,Cookie和Session是域对象。所谓域就相当于给存储的内容设置一个边界,将存储的内容存储到这片区域内。

保存会话中产生的数据

在一次会话中往往会产生一些数据,可以通过会话技术(Session和Cookie)保存会话中产生的数据

会话技术的概述

会话简单理解为:用户打开一个浏览器,点击多个超链接访问服务器的web资源,然后关闭浏览器,整个过程称为是一次会话

会话技术分类

Cookie技术
概念
客户端会话技术:Cookie 把数据保存在客户端 减轻服务器压力 不好之处 数据不安全 容易被篡改

Cookie是客户端技术,程序把每个用户的数据以cookie的形式保存到各自浏览器中。当用户使用浏览器再次访问服务器中的web资源的时候,就会带着各自的数据过去。这样,web资源处理的就是用户各自的数据了
原理
1. 当浏览器第一次请求服务器时 服务器将数据 通过set-cokkie让浏览器带回去保存

2. 当浏览器第二次请求服务器时 会通过cookie头将数据再带给服务器
代码

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String num = "100";
        Cookie num1 = new Cookie("num", "333");
        response.addCookie(num1);
    }
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//取出cokkie中的值
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                if (name.equals("num")){
                    String value = cookie.getValue();
                    System.out.println("收到cookie参数:"+value);
                }
            }
        }
    }

运行结果:
收到cookie参数:333
cookie的分类
默认级别的Cookie
指的是没有设置有效时间的Cookie,默认的情况下只要关闭了浏览器,Cookie也会被销毁。(Cookie存在于浏览器的内存中,当关闭了浏览器Cookie就销毁了)
持久级别的Cookie
指的是有有效时间的Cookie,这种Cookie的内容不是保存在浏览器的内存中,将Cookie的内容保存(持久化)到硬盘上。这个时候,关闭浏览器,再次打开浏览器会加载硬盘上的文件,从而Cookie中的数据就不会丢失。
cookie注意事项
1. cookie的持久化问题
  • 概念

    cookie的持久化问题 默认浏览器会把cookie的数据 存在浏览器的内存中 浏览器一关 内存释放 数据就丢失了

    通过设置cookie的存活周期来解决

    cookie.setMaxAge(-1); -1是默认值 存在浏览器的内存中
    cookie.setMaxAge(606024); 存在硬盘上时间由你来设置 单位是秒
    cookie.setMaxAge(0); 清楚cookie

  • 代码

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String num = "100";
        Cookie cookie = new Cookie("num", "333");
        cookie.setMaxAge(60*60*24);
        /*
        设置cookie的存活周期
        cookie.setMaxAge(-1); -1是默认值 存在浏览器的内存中
        cookie.setMaxAge(60*60*24); 存在硬盘上 时间由你来设置 单位是秒
        cookie.setMaxAge(0);  清楚cookie
         */
        response.addCookie(cookie);
    }
  • 编码转换问题
将cookie数据转换为非中文存储
使用URL解码编码
        Cookie username = new Cookie("username", URLEncoder.encode(username, "UTF-8"));
        Cookie password = new Cookie("password", URLEncoder.encode(password, "UTF-8"));
        username= URLDecoder.decode(username, "UTF-8");
        password = URLDecoder.decode(password, "UTF-8");
        
Tomcat8.5及以上支持中文cookie Tomcat7.0不支持中文cookie
1. 一个Cookie只用标识一种信息,至少含有一个标识该信息的名称和值。
2. 一个web站点可以给一个浏览器发送多个Cookie。一个web浏览器可以存储多个web站点的Cookie。
3. 浏览器一般只允许存放300个Cookie,每个站点最多可以存放20个Cookie,每个Cookie的大小限制为4KB(老版本浏览器)。-----**浏览器存放的Cookie的大小和个数是有限制的。**
4. 如果创建了一个Cookie,并发送到浏览器,默认情况下它是一个**会话级别的Cookie**。用户退出浏览器就被删除。如果希望将这个Cookie存到磁盘上,需要设置有效时长调用setMaxAge(int maxAge)方法,以秒为单位的。
5. 需要手动删除持久性Cookie,可以将Cookie的有效时长设置为0.必须注意:删除Cookie时候,path必须一致,否则无法删除。
Cookie域的常用方法:
1.获取Cookie的内容:

 Cookie[] cookies = request.getCookies();

因为如果我们打开京东的同时,同时去打开淘宝等,这个时候就会存在多个Cookie

 2.Cookie的构造方法:Cookie(String name,String value)

 3.获取Cookie的值:String getValue()

 4.获取Cookie的名称:String getName()

 5.设置有效的时间:void SetMaxAge(int expiry)

 ①.会话级别的Cookie:默认一个会话的时间,默认保存在浏览器内存中

 ②.持久的Cookie:把Cookie保存到磁盘上,通过(5.)设置。eg:保存用户名,QQ...等

  SetMaxAge(0):提前将Cookie结束

  前提条件:有效路径必须相同,从别的Servlet停止,首先要设置同一路径。

 6.设置有效路径: void SetPath(String url)

 7.设置有效域名:void SetDomain(String patten)

eg:我要登录百度,那么:www.baidu.com

登录百度书城:book.baidu.com

SetDomain(".baidu.com");
Session技术
概念
服务端会话技术:Session 把数据存在服务端 增加了服务器的压力 数据安全

Session是服务器端技术,利用这个技术,服务器在运行时为每一个用户的浏览器创建一个独享的session对象 由于session为用户浏览器独享,所有用户在访问服务器的时候,可以把各自的数据放在各自的session中,当用户再次访问服务器中的web资源的时候,其他web资源再从用户各自的session中取出数据为用户服务

Session称为是一次会话,Cookie将用户产生的私有的数据保存到浏览器端,Session将用户产生的私有的数据保存到服务器端。注意:一个浏览器独占一个session对象。因此,在需要保存用户数据时候,服务器程序可以将用户数据写到session对象中,当用户使用浏览器访问其他程序时,其他程序可以从用户的session中取出该用户的数据,为用户服务。
cookie与session的区别
- Cookie局限性:   
  - Cookie保存的数据是有个数和大小的限制的。
  - 数据是保存客户端浏览器上(相对不是很安全)。
- Session   
  - Session没有个数和大小限制。
  - 数据是保存在服务器上(相对比较安全)。
原理
记录用户上次访问时间的Servlet

用户访问Servlet

	如果是第一次访问
		显示 您好,欢迎来到本网站
		记录当前访问时间,存入到Cookie,回写到浏览器
		
	如果不是第一次访问
		 从cookie中获得上次时间,显示到页面
		  记录当前访问时间,存入到Cookie,回写到浏览器

判断是否是第一次访问:从指定的Cookie的数组中获取指定名称的Cookie。

	获得从浏览器带过来的所有的Cookie:
	从数组中找到指定名称的Cookie:
	
	判断是否是第一次访问:
		是第一次访问
		显示到页面上一段内容:
			
	不是第一次访问
		获得cookie中的上次访问时间,显示到页面
		显示到页面上一段内容:
		记录当前系统时间存入到Cookie,回写到浏览器
		存入到Cookie:
		
给Cookie设置有效路径

给Cookie设置有效时长

回写到浏览器:
Session域的常用方法
1. 如何获得session对象
  HttpSession session =request.getSession();

2. 如何存取数据
  String age = (String)session.getAttribute("age");
//getAttribute(String name)
//通过Session来存入内容,然后来获取这指定的值,或添加指定的值
  session.setAttribute("age","20");
  session.removeAttribute(“age”);

3. String getId() 获取Session的唯一id

4. void invalidate() 销毁Session
/**
 * 记录用户上次访问时间的Servlet
 */
public class VisitServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		/**
		 * 用户访问Servlet
		 * 	* 如果是第一次访问
		 * 		* 显示 您好,欢迎来到本网站
		 * 		* 记录当前访问时间,存入到Cookie,回写到浏览器
		 *  * 如果不是第一次访问
		 *  	* 从cookie中获得上次时间,显示到页面
		 *  	* 记录当前访问时间,存入到Cookie,回写到浏览器
		 */
		// 判断是否是第一次访问:从指定的Cookie的数组中获取指定名称的Cookie。
		// 获得从浏览器带过来的所有的Cookie:
		Cookie[] cookies = request.getCookies();
		// 从数组中找到指定名称的Cookie:
		Cookie cookie = CookieUtils.findCookie(cookies, "lastVisit");
		// 判断是否是第一次访问:
		if(cookie == null){
			// 是第一次访问
			// 显示到页面上一段内容:
			response.setContentType("text/html;charset=UTF-8");
			response.getWriter().println("<h1>您好,欢迎来到本网站!</h1>");
		}else{
			// 不是第一次访问
			// 获得cookie中的上次访问时间,显示到页面
			String value = cookie.getValue();
			// 显示到页面上一段内容:
			response.setContentType("text/html;charset=UTF-8");
			response.getWriter().println("<h1>您好,您的上次访问时间为:"+value+"</h1>");
		}
		// 记录当前系统时间存入到Cookie,回写到浏览器
		Date d = new Date();
		// 存入到Cookie:
		Cookie c = new Cookie("lastVisit",d.toLocaleString());
		// 给Cookie设置有效路径
		c.setPath("/web03");
		// 给Cookie设置有效时长
		c.setMaxAge(60 * 60); // 设置有效时长为1小时
		// 回写到浏览器:
		response.addCookie(c);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
	{
		doGet(request, response);
	}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值