Cookie小结以及Cookie的小应用

来源:互联网 发布:java soa 开源框架 编辑:程序博客网 时间:2024/05/16 05:37

Cookie小结以及Cookie的小应用

(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份Session通过在服务器端记录信息确定用户身份

产生原因:

在程序中,会话跟踪是很重要的事情。WEB服务器端程序要能从大量的请求消息中区分出哪些请求消息属于同一个会话,即能识别出来自同一个浏览器的访问请求,这需要浏览器对其发出的每个请求消息都进行标识:属于同一个会话中的请求消息都附带同样的标识号,而属于不同会话的请求消息总是附带不同的标识号,这个标识号就称之为会话ID(SessionID

理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。例如,用户A在超市购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买的,这都是属于同一个会话的,不能放入用户B或用户C的购物车内,这不属于同一个会话。

但是Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了。要跟踪该会话,必须引入一种机制。

Cookie就是这样的一种机制。它可以弥补HTTP协议无状态的不足。在Session出现之前,基本上所有的网站都采用Cookie来跟踪会话。

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。

以下是cookie传送过程的示意图

在Servlet程序中使用Cookie

•Servlet API中提供了一个javax.servlet.http.Cookie类来封装Cookie信息,它包含有生成Cookie信息和提取Cookie信息的各个属性的方法。
•Cookie类的方法:
构造方法: publicCookie(Stringname,Stringvalue)
getName方法
setValue与getValue方法
setMaxAgegetMaxAge方法
setPath与getPath方法
•HttpServletResponse接口中定义了一个addCookie方法,它用于在发送给浏览器的HTTP响应消息中增加一个Set-Cookie响应头字段。
•HttpServletRequest接口中定义了一个getCookies方法,它用于从HTTP请求消息的Cookie请求头字段中读取所有的Cookie项。

就拿2个小程序来说明cookie的用法

1.自动登陆页面:

–不需要填写用户名和密码等信息,可以自动登录到系统
先写一个简单的jsp页面:
<formaction ="index.jsp"method="post">name :<inputtype="text"name="name"/><inputtype="submit"value="Submit"/><pre name="code" class="java"></form>

效果图大概是这样的
    随便输入一个name,点击登陆之后,页面能够在一定时间内无需输入name即可登陆。
那么,index.jsp代码又应该怎么写呢?
<%//得到传入的name属性的值String value =request.getParameter("name");//判断不为空if(value !=null&&!value.trim().equals("")){//用"name"和该值创建一个cookie实例化对象需要传进一个键值对。//key=name;value=valueCookie cookie =new Cookie("name",value);//该方法设置cookie存在的时间,表示存在30Scookie.setMaxAge(30);//将该cookie插入HTTP响应报头中。response.addCookie(cookie);}else{//后续访问,就可以得到请求中的cookiesCookie [] cookies =request.getCookies();if(cookies!=null &&cookies.length>0){//遍历cookies数组,因为可能包含很多个不同的cookie信息//需要从中找出key=name对应的value.for(Cookie cookie:cookies){String cookieName =cookie.getName();if("name".equals(cookieName)){String value2 =cookie.getValue();value =value2;}}}}//如果名字存在,将登陆信息直接打印出来if(value !=null&&!value.trim().equals("")){out.println("Hello:"+value);}else {//否则调用重定向,将页面回到初始页面response.sendRedirect("login.jsp");}%>

然后就可以用了。
还有一个小程序:

显示最近浏览的5本事的title

有一个books.jsp和一个book.jsp。一个页面负责显示所有的图书。一个写了某一本图书的具体介绍。点击books.jsp的某一本书,进入相应的book.jsp页面,然后返回后在books.jsp页面下方能显示最近浏览的书的title。
初始的books.jsp:
<H4>Book  Page</H4><ahref="book.jsp?book=javaweb">javaweb</a><br><br><ahref="book.jsp?book=java">java</a><br><br><ahref="book.jsp?book=oracle">oracle</a><br><br><ahref="book.jsp?book=Ajax">Ajax</a><br><br><ahref="book.jsp?book=spring">spring</a><br><br><ahref="book.jsp?book=jdbc">jdbc</a><br><br><ahref="book.jsp?book=mvc">mvc</a><br><br><br><br>
book.jsp:
<h4>Book Detail Page</h4>Book :<%=request.getParameter("book") %><br><br><a href="books.jsp">Return </a><%String book=request.getParameter("book");//确定要删除的cookieCookie [] cookies=request.getCookies();//保存所有的book开头的cookieArrayList<Cookie> bookCookies =new ArrayList();Cookie tempCookie =null;if(cookies!=null &&cookies.length>=0){for(Cookie c:cookies){String  cookName =c.getName();if(cookName.startsWith("BOOK")){bookCookies.add(c);if(c.getValue().equals(book)){tempCookie=c;}}}}if(bookCookies.size()>=5 &&tempCookie == null){tempCookie=bookCookies.get(0);}if(tempCookie != null){tempCookie.setMaxAge(0);response.addCookie(tempCookie);}//把book.jsp传入的book作为一个Cookie返回Cookie cookie =new Cookie("BOOK"+book,book);response.addCookie(cookie);%>
然后需要在books.jsp页面下方显示最近的浏览记录,所以在boos.jsp加入以下代码:
<% //显示最近浏览的5本书//获取所有的cookieCookie [] cookies=request.getCookies();//筛选出book的cookie,如果cookiename为atguigu的开头即符合条件if(cookies!=null &&cookies.length>=0){for(Cookie c:cookies){String  cookName =c.getName();if(cookName.startsWith("BOOK")){out.println(c.getValue());}}}%>
以上即完成了一个小程序,能显示最近浏览的5本书的记录。当然还有很多需要完善的地方。


 







0 0