Day 10 Cookie

来源:互联网 发布:淘宝网店详情页制作 编辑:程序博客网 时间:2024/06/05 04:55

一.会话和会话状态

1.WEB应用中的会话是指一个客户端浏览器与WEB服务器之间连续发生的一系列请求和响应过程。
2.WEB应用的会话状态是指WEB服务器与浏览器在会话过程中产生的状态信息,借助会话状态,WEB服务器能够把属于同一会话中的一系列的请求和响应过程关联起来。 

3.WEB服务器端程序要能从大量的请求消息中区分出哪些请求消息属于同一个会话,即能识别出来自同一个浏览器的访问请求,这需要浏览器对其发出的每个请求消息都进行标识:属于同一个会话中的请求消息都附带同样的标识号,而属于不同会话的请求消息总是附带不同的标识号,这个标识号就称之为会话ID(SessionID)。 
4.在 Servlet 规范中,常用以下两种机制完成会话跟踪:
Cookie 
Session 


二.cookie

1.Cookie机制 

  • cookie机制采用的是在客户端保持 HTTP 状态信息的方案 
  • Cookie是在浏览器访问WEB服务器的某个资源时,由WEB服务器在HTTP响应消息头中附带传送给浏览器的一个小文本文件。 
  • 一旦WEB浏览器保存了某个Cookie,那么它在以后每次访问该WEB服务器时,都会在HTTP请求头中将这个Cookie回传给WEB服务器。
  • 底层的实现原理: WEB服务器通过在HTTP响应消息中增加Set-Cookie响应头字段将Cookie信息发送给浏览器,浏览器则通过在HTTP请求消息中增加Cookie请求头字段将Cookie回传给WEB服务器。
  • 一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。 
  • 一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。
  • 浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
2.

         


3.Cookie相关的API 

(向客户浏览器写入Cookie)

1).创建Cookie对象

Cookie cookie=new Cookie("cookiepath","cookiepathvalue");


2).设置最大时效:如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie; 存储在浏览器的内存中,用户退出浏览器之后被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。

        cookie.setMaxAge(30)
3).将Cookie放入到HTTP响应报头:

发送cookie需要使用HttpServletResponse的addCookie方法,将cookie插入到一个 Set-Cookie HTTP响应报头中。由于这个方法并不修改任何之前指定的Set-Cookie报头,而是创建新的报头,因此将这个方法称为是addCookie,而非setCookie。


        response.addCookie(cookie);

4)Cookie的作用范围: cookie.setPath(request.getContextPath())


5).Cookie的读取(从浏览器读取Cookie到服务器) 

     1).调用request.getCookies
    要获取浏览器发送来的cookie,需要调用HttpServletRequest的getCookies方法,这个调用返回Cookie对象的数组,对应由HTTP请求中Cookie报头输入的值。
     2)对数组进行循环,调用每个cookie的getName方法,直到找到感兴趣的cookie为止


5.例1

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8" session="false"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body>  <%    //获取Cookie    Cookie[] cookies=request.getCookies();    if(cookies!=null&&cookies.length>0){    for(Cookie cookie:cookies){    //获取Cookie的name和value    out.print(cookie.getName()+":"+cookie.getValue());    out.print("<br>");    }    }else{    out.print("没有cookie");    //创建一个Cookie对象    Cookie cookie=new Cookie("name","atguigu");    //setMaxAge:设置Cookie的最大时效,以秒为单位.若为0,表示立即删除该Cookie    //若为负数,表示不存储Cookie.若为正数,表示该Cookie的存储时间    cookie.setMaxAge(30);    //调用response的一个方法把Cookie传给客户端    response.addCookie(cookie);        }  %></body></html>

例2:自动登录:
不需要填写用户名和密码等信息,可以自动登录到系统

    若可以获取到请求参数 loginName, 则打印出欢迎信息。把登录信息存储到 Cookie 中,并设置 Cookie 的最大时效为 30S
    从 Cookie 中读取用户信息,若存在则打印欢迎信息
    若既没有请求参数,也没有 Cookie,则重定向到 login.jsp

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body> <%
              //若可以获取到请求参数 loginName, 则打印出欢迎信息。把登录信息存储到 Cookie 中,并设置 Cookie 的最大时效为 30S
 String name=request.getParameter("name"); if(name !=null&&!name.trim().equals("")){ Cookie cookie=new Cookie("name",name); cookie.setMaxAge(30); response.addCookie(cookie); }else{
              //    从 Cookie 中读取用户信息,若存在则打印欢迎信息
 Cookie [] cookies=request.getCookies(); if(cookies !=null&&cookies.length>0){  for(Cookie cookie :cookies){  String cookieName=cookie.getName();  if("name".equals(cookieName)){  String val=cookie.getValue();  name=val;  }  } } }
 if(name !=null&&!name.trim().equals("")){ out.print("Hello"+name); }else{
             
             //   若既没有请求参数,也没有 Cookie,则重定向到 login.jsp
response.sendRedirect("login.jsp"); } %></body></html>

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body><form action="index.jsp" method="post">登录名:<input type="text" name="name"><input type="submit" value="submit"></form></body></html>

例3:显示最近浏览(显示五个,第六个顶出去)

books.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body><h4>Books page</h4><a href="book.jsp?book=javaweb">javaweb</a><br><br><a href="book.jsp?book=java">java</a><br><br><a href="book.jsp?book=ajax">ajax</a><br><br><a href="book.jsp?book=js">js</a><br><br><a href="book.jsp?book=android">android</a><br><br><a href="book.jsp?book=jquery">jquery</a><br><br><a href="book.jsp?book=aaa">aaa</a><br><br><a href="book.jsp?book=bbb">bbb</a><br><br><br><br><%//显示最近浏览的5本书//获取所有的Cookie Cookie cookies[]=request.getCookies();//从中筛选出Book的Cookie,如果cookie Name为A_开头的及符合条件//显示cookieValueif(cookies !=null&&cookies.length>0){ for(Cookie cookie:cookies){ String Cname=cookie.getName(); if(Cname.startsWith("A_")){out.print(cookie.getValue());out.print("<br>"); } } } %></body></html>

book.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><%@ page import="java.util.ArrayList" %><%@ page import="java.util.List" %><title>Insert title here</title></head><body><h4>book detil page</h4>Book:<%=request.getParameter("book") %><br><br><a href="books.jsp">Return</a><%  String book=request.getParameter("book"); //把书的信息以Cookie方式传回给浏览器,删除一个Cookie //1.确定要被删除的Cookie //(以A_开头的Cookie的数量大于或等于五) Cookie cookies[]=request.getCookies(); //保存所有的A_开头的CookieList<Cookie> bookCookies=new ArrayList<Cookie>();//用来保存和book.jsp传入的book匹配的那个CookieCookie tempC=null; if(cookies !=null&&cookies.length>0){ for(Cookie cookie:cookies){ String Cname=cookie.getName(); if(Cname.startsWith("A_")){bookCookies.add(cookie);if(cookie.getValue().equals(book)){tempC=cookie;}  } } }   //若从books.jsp页面传入的book不在A_的Cookie中则删除较早的那个Cookie //(A_数组的第一个Cookie) if(bookCookies.size()>=5&&tempC==null){ tempC=bookCookies.get(0); } //若在其中,则删除该Cookie if(tempC!=null){ tempC.setMaxAge(0); response.addCookie(tempC); } //2.把从book.jsp传入的book作为一个Cookie返回      Cookie cookie=new Cookie("A_"+book,book);  response.addCookie(cookie);%></body></html>

                                             
0 0
原创粉丝点击