Cookie小结以及Cookie的小应用
2015-04-22 22:34
218 查看
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方法
setMaxAge与getMaxAge方法
setPath与getPath方法
•HttpServletResponse接口中定义了一个addCookie方法,它用于在发送给浏览器的HTTP响应消息中增加一个Set-Cookie响应头字段。
•HttpServletRequest接口中定义了一个getCookies方法,它用于从HTTP请求消息的Cookie请求头字段中读取所有的Cookie项。
就拿2个小程序来说明cookie的用法
1.自动登陆页面:
–不需要填写用户名和密码等信息,可以自动登录到系统先写一个简单的jsp页面:
<form action ="index.jsp" method="post"> name :<input type="text" name="name"/> <input type="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=value Cookie cookie =new Cookie("name",value); //该方法设置cookie存在的时间,表示存在30S cookie.setMaxAge(30); //将该cookie插入HTTP响应报头中。 response.addCookie(cookie); }else{ //后续访问,就可以得到请求中的cookies Cookie [] 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> <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=oracle">oracle</a><br><br> <a href="book.jsp?book=Ajax">Ajax</a><br><br> <a href="book.jsp?book=spring">spring</a><br><br> <a href="book.jsp?book=jdbc">jdbc</a><br><br> <a href="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"); //确定要删除的cookie Cookie [] cookies=request.getCookies(); //保存所有的book开头的cookie ArrayList<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本书 //获取所有的cookie Cookie [] 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本书的记录。当然还有很多需要完善的地方。
相关文章推荐
- Mybatis之基础应用小结以及IntelliJ IDEA目录结构的一些小问题
- ExtJS的ajax应用以及JS对cookie 的操作 (JS学习引用)
- Cookie、Session,以及在ASP.NET中的应用 推荐
- IO流小结之二:IO流的装饰设计模式、字节流的知识点小结以及转换流的应用
- cookie和session的的区别以及应用场景有哪些?
- session和cookie介绍以及session简单应用
- cookie在web应用中实现上次登录时间以及上次访问时间 小案例理解cookie
- session与cookie技术应用(附详细代码示例以及注释)
- js学习小结(十四)2014.5.23(onpropertychange、oninput、onchange的区别与联系以及正则表达式的应用)
- c++多态性原理及应用 & c++以及cuda 计时技术小结
- Web应用中Cookie和Session的原理以及Session持久化
- Session和Cookie小结以及PHP单点登陆的实现
- 投票系统开发总结struts2,jfreechart,cookie应用,以及前端技术
- 在Excel中怎么筛选唯一值或删除重复值以及对其应用条件格式
- js ajax解决跨域请求,以及requestheader里没有cookie 3ff0
- Memcached 缓存系统的-介绍、安装以及应用
- JavaScript入门篇之Cookie的应用
- jqGrid应用SpringMVC以及分组汇总-不分页
- 合并多个python list以及合并多个 django QuerySet 的方法在用python或者django写一些小工具应用的时候,有可能会遇到合并多个list到一个 list 的情况。单纯从技
- 【OC加强】block数据类型的定义和调用以及传参等应用