会话技术—Cookie

会话技术

1. 会话:一次会话中包含多次请求和响应。
	* 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止
2. 功能:在一次会话的范围内的多次请求间,共享数据
3. 方式:
	1. 客户端会话技术:Cookie
	2. 服务器端会话技术:Session

Cookie概念

        是一个客户端状态保持机制,用来存储用户特定的信息。当用户再次访问时,应用程序可以检索以前的存储细信息。

会话技术—Cookie_第1张图片

由图片可知  

   1.Cookie 中存储的一段文本信息,是关于网站相关的文本字符串数据。

   2.Cookie 中的存储方式两种:
      1.指定了过期时间,保存在本地硬盘上,设置了某网站过期时间,在指定时间内访问,那么属于该网站的Cookie数据会在请求报文中发送过来。 
      2.没有指定过期时间,存储在浏览器内存中。

应用场景

 登录页面有一个下次自动登陆、几天内免登陆等。可以通过Cookie记录用户已经登录,这样用户不需要每次都输入凭据。

会话技术—Cookie_第2张图片

 购物车,添加购物信息。

会话技术—Cookie_第3张图片

例如要开始博主选拔了,让大家投票,可以将Cookile作为一个Boolean值,用来指示用户是否已经投票,这样用户就无法第二次进行投票。

.net中cookie的使用

1.Cookie创建与基本属性
 //创建Cookile
 Response.Cookies["fjx"].Value = "itcast";
 //给创建的Cookile指定过期时间
 Response.Cookies["fjx"].Expires = DateTime.Now.AddDays(1);



2.删除Cookile,给他赋值一个过期的时间
Response.Cookies["fjx"].Expires = DateTime.Now.AddDays(-1);



3.Cookie跨域(域名):Domain属性
//创建Cookile
 Response.Cookies["fjx"].Value = "itcast";
 //设置主域
 Response.Cookies["fjx"].Domain= "xxx.com";


4.有的时候用户通常禁用Cookie,所以我们需要判断用户是否禁用
protected void Page_Load(object sender, EventArgs e)
{
    string redirect = Request.QueryString["redirect"];
    string acceptsCookies;
    if(Request.Cookies["TestCookie"] ==null)
        acceptsCookies = "no";
    else
    {
        acceptsCookies = "yes";
        // Delete test cookie.
        Response.Cookies["TestCookie"].Expires =DateTime.Now.AddDays(-1); 
            
    }
    Response.Redirect(redirect + "?AcceptsCookies=" + acceptsCookies,true);
}



5. Cookie的特点和作用
	1. cookie存储数据在客户端浏览器
	2. 浏览器对于单个cookie 的大小有限制(4kb) 以及 对同一个域名下的总cookie数量也有限制(20个)

	* 作用:
		1. cookie一般用于存出少量的不太敏感的数据
		2. 在不登录的情况下,完成服务器对客户端的身份识别

例子:

 

//需求分析:登陆时,默认记住账号和密码

 public partial class WebForm1 : System.Web.UI.Page
    {
        public string LoginUserName { get; set; }
        protected void Page_Load(object sender, EventArgs e)
        {   
            if(IsPostBack)
            {  //如果是post请求
                string userName = Request.Form["txtName"];//接收用户输入的信息
                Response.Cookies["userName"].Value = Server.UrlEncode(userName);//创建一个Cookile,如果存取的中文,需要进行一下编码
                Response.Cookies["userName"].Expires = DateTime.Now.AddDays(7);//设置Cookile中数据保存时间为一周
            }
            else
            {
                //此时为Get请求,需要读取Cookile
                if (Response.Cookies["userName"] != null) 
                {
                    string name = Server.UrlDecode(Response.Cookies["userName"].Value) ;//接收用户输入的信息(进行反编码)
                    LoginUserName = name;                
                    Response.Cookies["userName"].Expires = DateTime.Now.AddDays(7);//获取用户数据后,再次保存7天
                }
            }
        }
    }
  
用户名:
密码:

Java中的Cookie的使用

* 使用步骤:
		1. 创建Cookie对象,绑定数据
			* new Cookie(String name, String value) 
		2. 发送Cookie对象
			* response.addCookie(Cookie cookie) 
		3. 获取Cookie,拿到数据
			* Cookie[]  request.getCookies()  
@WebServlet("/cookieDemo1")
public class CookieDemo1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.创建Cookie对象
        Cookie c = new Cookie("fjx","itcast");
        //2.发送Cookie
        response.addCookie(c);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}



@WebServlet("/cookieDemo2")
public class CookieDemo2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       //3. 获取Cookie
        Cookie[] cs = request.getCookies();
        //获取数据,遍历Cookies
        if(cs != null){
            for (Cookie c : cs) {
                String name = c.getName();
                String value = c.getValue();
                System.out.println(name+":"+value);
            }
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

 客户端发送请求,服务器将信息放在响应头里面,即 set-Cookie:fjx=itcast ,返回给浏览器,保存在本地

 客户端再次发送请求时,就会携带保存在本地数据,通过请求头发送给服务器,即Cookie:fjx=itcast

  注意:   如下图红框中所示,我们创建了一个名为fjx,值为itcast的Cookile,过期时间为2019年1月18日凌晨三点多,之所以差八个小时,使我们所处的时区不同,我们是东八区。差八个小时。

会话技术—Cookie_第4张图片

cookie小知识

1. 一次可不可以发送多个cookie?
		* 可以
		* 可以创建多个Cookie对象,使用response调用多次addCookie方法发送cookie即可。




@WebServlet("/cookieDemo")
public class CookieDemo extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.创建Cookie对象
        Cookie c1 = new Cookie("fjx","itcast");
        Cookie c2 = new Cookie("name","zhe");
        //2.发送Cookie
        response.addCookie(c1);
        response.addCookie(c2);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}
	
2. cookie在浏览器中保存多长时间?
		
  1. 默认情况下,当浏览器关闭后,Cookie数据被销毁
   
  2. 持久化存储:		
      * setMaxAge(int seconds)
        1. 正数:将Cookie数据写到硬盘的文件中。并指定cookie存活时间,时间到后,cookie文件自动失效
	    2. 负数:默认值
	    3. 零:删除cookie信息



@WebServlet("/cookieDemo")
public class CookieDemo extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.创建Cookie对象
        Cookie c1 = new Cookie("msg","setMaxAge");
        //2.设置cookie的存活时间
        //c1.setMaxAge(30);//将cookie持久化到硬盘,30秒后会自动删除cookie文件
        //c1.setMaxAge(-1);//默认值
        //c1.setMaxAge(300);
        c1.setMaxAge(0);//删除Cookie
        //3.发送Cookie
        response.addCookie(c1);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}
3. cookie能不能存中文?
		* 在tomcat 8 之前 cookie中不能直接存储中文数据。
			* 需要将中文数据转码---一般采用URL编码(%E3)
		* 在tomcat8之后,cookie支持中文数据。特殊字符还是不支持,建议使用URL编码存储,URL解码解析
	

@WebServlet("/cookieDemo")
public class CookieDemo extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.创建Cookie对象
        Cookie c1 = new Cookie("msg","能存中文");
      
        //2.发送Cookie
        response.addCookie(c1);         
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
4. cookie共享问题?

1. 假设在一个tomcat服务器中,部署了多个web项目,那么在这些web项目中cookie能不能共享?
	* 默认情况下cookie不能共享

	* setPath(String path):设置cookie的获取范围。默认情况下,设置当前的虚拟目录
		* 如果要共享,则可以将path设置为"/"

		
2. 不同的tomcat服务器间cookie共享问题?
	* setDomain(String path):如果设置一级域名相同,那么多个服务器之间cookie可以共享
	* setDomain(".baidu.com"),那么tieba.baidu.com和news.baidu.com中cookie可以共享


@WebServlet("/cookieDemo")
public class CookieDemo extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.创建Cookie对象
        Cookie c1 = new Cookie("msg","能存中文");
        //设置path,让当前服务器下部署的所有项目共享Cookie信息
        c1.setPath("/");
        //3.发送Cookie
        response.addCookie(c1);         
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

关于Cookie的分享就先到这里。

你可能感兴趣的:(-----【ASP.NET】,▶Java)