※ 会话追踪技术 session cookie
http协议的访问是无状态的访问,就是说当前这次访问是不会知道之前访问的状态的.(http协议的访问是不会帮我们保存访问的记录/痕迹的).
有些我们的访问是不需要知道之前访问的状态的.比如我们访问一些静态的页面,在访问一个校园网站的时候,第一次访问点击了页面中的校园风采,第二次访问点击了学生作品,这俩次访问完全可以没有任何关系,也不需要知道各自访问的状态.
但是有些访问我们是一定要知道之前几次访问的状态的.比如在购物网站的时候,第一次访问点击购买了一个手机,第二次访问点击购买了一个电脑,第三次访问点击购物车结算,这个时候我们就必须知道前俩次访问的时候购买了什么,要不然就没有方法去结算。
所以我们就有了会话追踪技术来解决这个访问无状态的问题。

※ session和cookie

  1. session是保存在服务器端的一个对象.客户端是没有session的.
  2. cookie在客户端和服务器端都会有。但是存在的形式不一样.在客户端cookie是以本地文件(浏览器管理的文件)的形式存在的,在服务器端是以java对象的形式存在.

cookie的作用:
和session一样,是用来保存用户访问的信息数据的。但是session是把数据保存在服务器端的内存里面,cookie是把数据保存在客户端的文件里面.

客户端访问服务器的时候,服务器会给这个客户端创建一个会话,也就是一个session对象,服务器端的内存里面同时可能有好多个session对象,分别对应的不同的客户端,每一个session对象都有一个唯一的id值,叫做JSESSIONID。服务器端给客户端产生一个session对象后,会通过这次访问的response对象把这个session的JSESSIONID的值返回给浏览器,浏览器接收到后会把这个值以一个cookie文件的形式保存起来。之后,这个浏览器再发生请求到服务器的时候,就会把之前保存在cookie文件中的JSESSIONID的值传给服务器,服务器通过这个JESSIONID的值就能够知道服务器内存中是哪一个session对象和当前这个客户端对应。这样以来,最后就能到达一个效果,我们客户端的每一次访问,在服务器端都能够拿到相同的一个session对象,从而实现不同请求之间通过相同的session对象进行数据的共享。

※ 如何从服务器端向浏览器写回cookie

//创建cookie对象
		Cookie c1 = new Cookie("name","tom");
		Cookie c2 = new Cookie("msg","hello");
		//设置cookie的有效时间
		c1.setMaxAge(60*60*24*365);
		c2.setMaxAge(60*60*24*365*10);
		//把cookie放到response里面
		resp.addCookie(c1);
		resp.addCookie(c2);
package com.briup.web.Servelt;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class CookieTest
 */
@WebServlet("/cook")
public class CookieTest extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		for(int i=0;i<100;i++) {
			
		 //给浏览器中的cookie写内容,cookie不能带中文
		Cookie cookie=new Cookie("name"+i,"tom");
		//参数类型是时间,单位秒,表示多久让浏览器删除该cookie(过期时间)
		cookie.setMaxAge(60*60*24*365*6);
		Cookie cookie1=new Cookie("passwd"+i,"111");
		cookie1.setMaxAge(60*60*24*365*6);
		response.addCookie(cookie);
		response.addCookie(cookie1);
		request.getRequestDispatcher("test.jsp").forward(request, response);
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

最后response对象会把cookie带回到浏览器,并又浏览器把cookie对象中的内容保存到对应的一个cookie的文件中。

注意:如果没有设置cookie生效的时间,那么这个cookie就是会话cookie,当会话结束(关闭浏览器)的时候cookie就是失效了。

※ 如何在servlet中拿到从浏览器发送过来的cookie文件中的数据

//从request中拿到一个cookie数组
	   //如果没任何cookie数据则返回null
           Cookie[] cookies = req.getCookies();
	   //遍历数组 拿出key和value
	   for(Cookie c:cookies){
		String key = c.getName();
		String value = c.getValue();
	   }
package com.briup.web.Servelt;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class CookieGet
 */
@WebServlet("/getc")
public class CookieGet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		Cookie[] cookies=request.getCookies();
		for(Cookie c:cookies) {
			System.out.println(c.getName()+"--"+c.getValue());
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

注意:session对象的创建时间。

Cookie保存服务器端的信息(用户名,密码)
浏览器cookie是以文件的方式呈现

注意:cookie是response带给浏览器的
浏览器接收的站点是有限的,每一个站点可以写入的cookie也是有限的。
(eg:火狐每个站点最多维护180多个cookie)
每一个cookie的值最多4096b(4kb)
服务器写回cookie本地存在key,覆盖value值。
如果浏览器cookie维护到达最大值,服务器再次写回cookie对象,浏览器移除最早写入的。