Cookie创建-获取-持久化、自动登录、购物记录、作用路径
来源:互联网 发布:安卓息屏录像软件 编辑:程序博客网 时间:2024/06/06 19:06
1、cookie是啥?随手百度了网友的说说
简单的说,Cookie就是服务器暂存放在你计算机上的一笔资料,好让服务器用来辨认你的计算机。当你在浏览网站的时候,Web服务器会先送一小小资料放在你的计算机上,当下次你再光临同一个网站,Web服务器会先看看有没有它上次留下的Cookie资料,有的话,就会依据Cookie里的内容来判断使用者,送出特定的网页内容给你。
2、cookie在哪里?
3、cookie可以删除吗?
4、cookie实现原理
第一次请求浏览器,在浏览器的cookie存储区,没有cookie,
第一次访问不带Cookie,浏览器通过Http请求消息中增加Cookie请求头将Cookie回传给web服务器,浏览器会把Cookie的信息片断以”名/值”对(name-value pairs)的形式储存保存在本地,下次访问,web服务器通过http响应消息中增加Set-Cookie响应头,将Cookie信息发送给浏览器
我们通过实际来看下cookie吧
创建一个cookie.jsp,为了便于观察,设置session=”false”
<%@ 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 cookie = new Cookie("name","wyf"); response.addCookie(cookie);%></body></html>
我们第一次访问cookie.jsp文件,在IE输入http://localhost:8080/day01/cookie.jsp
请求标头中,可以看到首次访问是不携带cookie的
在响应标头中,通过Set-Cookie传回,并且保存在浏览器本地cookie存储区
我们第二次访问cook.jsp文件,看看有没有变化
请求标头中,可以看到再次访问,是从浏览器本地cookie存储区,携带cookie的请求的
如下是响应标头:
我们用一个交互图,来了解下cookie机制:
我们来看下cookie的创建、获取
cookie.jsp中代码意思是:如果请求中,没有cookie,就创建并返回,请求中带cookie的话,就输出cookie键值对(name-value)
<%@ 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[] cookies = request.getCookies(); if(cookies !=null && cookies.length>0){ for(Cookie cookie : cookies){ out.print(cookie.getName()+":"+cookie.getValue()); } }else{ out.print("没有cookie,正在创建,并且返回"); Cookie cookie = new Cookie("name","wyf"); response.addCookie(cookie); }%></body></html>
第一次访问
第二次访问
以上操作是我们需要重新关闭浏览器,在进行调试为什么呢?
因为默认情况下,cookie是一个会话级别的cookie,存储在浏览器的内核中,用户退出浏览器后被删除,若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,单位为秒
我们来看下持久化cookie
<% Cookie[] cookies = request.getCookies(); if(cookies !=null && cookies.length>0){ for(Cookie cookie : cookies){ out.print(cookie.getName()+":"+cookie.getValue()); } }else{ out.print("没有cookie,正在创建,并且返回"); Cookie cookie = new Cookie("name","wyf"); cookie.setMaxAge(30); response.addCookie(cookie); }%>
cookie.setMaxAge(30);设置为30秒,这里就不截图了,说名下即可,第一次访问没有cookie创建cookie,第二次访问输出cookie键值对,关闭浏览器,在30秒内访问,依然提示cookie键值对,而不是之前的提示没有cookie创建cookie
自动登录
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="success.jsp" method="post"> name:<input type="text" name="name"/> <input type="submit" value="sumit"/> </form></body></html>
success.jsp
<%@ 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> <% //若可以获取到参数name,则打印登录信息,将信息存储到cookie中,并设置cookei的时间 String name = request.getParameter("name"); if (name != null && !name.trim().equals("")) { Cookie cookie = new Cookie("nameCookie", name); cookie.setMaxAge(60); response.addCookie(cookie); } else { //如果没有参数,可以用cookie登录,从cookie中读取用户信息,如果存在则打印欢迎信息 Cookie[] cookies = request.getCookies(); if (cookies != null && cookies.length > 0) { for (Cookie cookie : cookies) { String cookieName = cookie.getName(); if ("nameCookie".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>
第一次访问http://localhost:8080/day01/login.jsp输入name参数值,提交,在success.jsp中,首先获取提交过来的参数name值,如果不为null,那么就直接设置一个cookie,保存参数name值,然后页面输出name参数值,第二次访问直接输入http://localhost:8080/day01/success.jsp,
由于这次么有携带参数name值,我们只需要从cookie的value值中获取值,然后显示输出即可
显示最近的购物记录
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> <a href="book.jsp?book=Java">Java</a> <a href="book.jsp?book=Oracle">Oracle</a> <a href="book.jsp?book=Ajax">Ajax</a> <a href="book.jsp?book=JavaScript">JavaScript</a> <a href="book.jsp?book=Android">Android</a> <a href="book.jsp?book=Jbpm">Jbpm</a> <br><br> <% //获取所有的Cookie Cookie[] cookies = request.getCookies(); //从筛选出的Book的Cookie,如果cookieName为ATGUIGU_BOOK_ 开头的即符合条件 if(cookies!=null&&cookies.length>0){ for(Cookie c:cookies){ String cookieName = c.getName(); if(cookieName.startsWith("Safly")){ //显示cookieValue out.println(c.getValue()); out.print("<br>"); } } } %> </body></html>
book.jsp
<%@page import="java.util.ArrayList"%><%@ 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> Book:<%= request.getParameter("book") %> <br><br> <a href="books.jsp">return</a> <% String book = request.getParameter("book"); //确定要被删除的Cookie Cookie[] cookies = request.getCookies(); //保存所有Safly 开头的Cookie ArrayList<Cookie> bookCookies = new ArrayList<Cookie>(); //用来保存和books.jsp 传入的book匹配的那个Cookie Cookie tempCookie = null; if(cookies!=null&&cookies.length>0){ for(Cookie c:cookies){ String cookieName = c.getName(); if(cookieName.startsWith("Safly")){ bookCookies.add(c); //选购5个之后,在选5个中的一个 if(c.getValue().equals(book)){ out.print("c.getValue().equals(book)"); tempCookie = c; } } } } //选购5个选除这5本以外的一本 if(bookCookies.size() >= 5&&tempCookie == null){ tempCookie = bookCookies.get(0); // out.print("tempCookie == null"); } //若在其中则删除bookCookie本身,将列表的重复cookie删掉,并且将其回传 if(tempCookie != null){ tempCookie.setMaxAge(0); response.addCookie(tempCookie); } //把从books.jsp传入的book作为一个Cook返回 Cookie cook = new Cookie("Safly"+book,book); response.addCookie(cook); %></body></html>
说一下逻辑关系:
在Books.jsp中以下是书籍的列表,
JavaWeb
Java
Oracle
Ajax
JavaScript
Android
Jbpm
我随便选择一个链接(比如JavaWeb),去跳转到book.jsp,第一次访问是没有带Cookie的,所以会调用book.jsp如下的方法,创建了一个cookie,在book.jsp页面中,点击return返回到books.jsp就取出cooks.jsp带过来的cookieValue,然后展现选中的书籍列表即可
Cookie cook = new Cookie("Safly"+book,book); response.addCookie(cook);
此刻已经回到books.jsp中,已经选择了JavaWeb一本书,我们在选择一本(假如Java),然后跳转到books.jsp,此刻我们会带着1个cookie(就是第一次选中JavaWeb访问books.jsp时候,给我传过来的),这个cookie的键值就是SaflyJavaWeb–JavaWeb,但是呢?选中第二本书Java是没有带cookie的(没有SaflyJava–Java)
然后就进入到cooks.jsp中
if(cookieName.startsWith("Safly")){ bookCookies.add(c);}
所以也就将SaflyJavaWeb–JavaWeb放入到一bookCookies中(存放选中的书籍列表)然后呢,那个SaflyJava–Java就会创建,在点击renturn时候,反给cookies.jsp
。。。。第3、4、5次选择书时,是一样的过程
如果等books.jsp中选择了5本书时候,在选择这5本书中的某一本时候,怎么处理呢?
c.getValue().equals(book)来获取选中的那本书,我们需要将此cookie删除然后,从新添加进来然后回传给cookies.jsp代码如下:
tempCookie.setMaxAge(0);response.addCookie(tempCookie);
如果等books.jsp中选择了5本书时候,在选择非此5本书的第6本书,怎么处理呢?
我们就tempCookie = bookCookies.get(0); 取出来那5本书的第一本,然后tempCookie.setMaxAge(0);删除调第一本的cookie,然后将第6本书,创建cookie回传给cookies.jsp即可
以下是部分截图:
cookie的作用路径
cookie2.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><% String cookieValue = null; Cookie [] cookies = request.getCookies(); if(cookies!=null&& cookies.length>0){ for(Cookie cookie:cookies){ if("cookiePath".equals(cookie.getName())){ cookieValue = cookie.getValue(); } } } if(cookieValue != null){ out.print(cookieValue); }else{ out.print("没有指定的cookie"); } %></body></html>
writerCookie.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> <% //可以作用当前目录,和当前目录的子目录,但不能作用于当前目录的上一级目录 //可以通过setPath设置cookie的作用范围,/代表站点的根目录 Cookie cookie = new Cookie("cookiePath","CookiePathValue"); cookie.setPath(request.getContextPath()); response.addCookie(cookie); %> <a href="../cookie2.jsp">to cookie2.jsp</a></body></html>
to cookie2.jsp就是访问writerCookie.jsp上级目录的cookie2.jsp
- Cookie创建-获取-持久化、自动登录、购物记录、作用路径
- Cookie创建,回传,携带、Cookie案例(上次登录时间)、Session域值传递、Session持久化(购物例子)
- cookie自动登录,添加到购物车
- C#自动登录_获取Post路径
- 创建Cookie、获取Cookie
- JSP(4)—Cookie创建及简单案例(自动登录)
- 使用selenium自动登录淘宝并获取cookie
- 实现自动登录Cookie
- cookie自动登录认证
- 实现自动登录Cookie
- Servlet cookie自动登录
- cookie自动登录
- Cookie自动登录认证
- cookie自动登录安全性
- cookie自动登录认证
- cookie实现自动登录
- Cookie自动登录小记
- js自动登录cookie
- Content Provider 基础
- Leetcode 96. Unique Binary Search Trees (Medium) (cpp)
- Content Provider 使用
- NPM 使用介绍
- java代码操作zip文件--读取zip文件
- Cookie创建-获取-持久化、自动登录、购物记录、作用路径
- Spring AOP的实现——动态代理机制
- Android自定义ViewGroup(二)之WaterfallLayout
- nginx限制ip访问 nginx访问权限
- VS2010/MFC编程入门之二十八(常用控件:列表视图控件List Control 上)
- 遍历Map
- HDU:5253 连接的管道(最小生成树+变形处理)
- HDU 3065 (AC自动机水题)
- ubuntu下安装libnet、libpcap、libnids等环境