博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Cookie
阅读量:5290 次
发布时间:2019-06-14

本文共 3275 字,大约阅读时间需要 10 分钟。

Cookie

 

Cookie的作用

  Cookie的英文原意是“点心”,它是用户访问Web服务器时,服务器在用户硬盘上存放的信息,好像是服务器送给客户的“点心”。

  服务器可以根据Cookie来跟踪用户,这对于需要区别用户的场合(如电子商务)特别有用。

  通常访问论坛时,如果勾选“保存用户名和密码”,服务器就会在你的硬盘上存放一个Cookie;再次访问时,服务器就会利用这个Cookie中存的上次访问的用户名和密码,实现自动登录。

  浏览器为了安全考虑,只允许服务器访问自己存放的Cookie,即A服务器存的Cookie,B服务器是访问不到的,禁止跨域访问。

  并且Cookie存放时都是加密的,不是直接存明文的。

 

Cookie的具体形式

  一个Cookie包含一对Key/Value,下面的代码生成一个Cookie并将它写到用户的硬盘上:

Cookie theCookie = new Cookie("cookieName", "cookieValue");             response.addCookie(theCookie);

 

Cookie类

  Cookie的类定义可以查看Java EE的javax.servlet.http.Cookie类文档:

  一个cookie是一个量很小的信息,是servlet发送给浏览器的,浏览器会存储在客户端,之后用到的时候会返回给服务器。

  因为cookie的值可以唯一地确定(或者说认证)一个客户端,所以cookie通常是用来进行session管理的。

  Cookie有一个name,一个value,还有一些其他的附加属性,比如comment,path,domain qualifiers,最大年龄(max age),版本号等。

  但是注意有的浏览器在处理Cookie的附加属性的时候可能会有bug,所以为了兼容性着想,要保守地使用附加属性。

 

Cookie的发送和返回

  servlet向浏览器发送cookies是通过:HttpServletResponse#addCookie方法,它是将字段加在HTTP response的headers里面来发送cookies的,这个方法每次只能加一条cookie,可以多次调用,增加多个不同的cookie对象。

  The browser is expected to support 20 cookies for each Web server, 300 cookies total, and may limit cookie size to 4 KB each.

  浏览器向servlet返回cookies,是通过将字段加在HTTP request的headers里面。使用HttpServletRequest#getCookies方法可以获取请求中的Cookies。

  一些Cookies可能有相同的名字但是不同的path属性。

 

Cookie的Max Age

  查看Cookie类的setMaxAge(int expiry)方法说明:

  这个类用于给Cookie设置最大的年龄,以秒为单位。

  expiry - an integer specifying the maximum age of the cookie in seconds; if negative, means the cookie is not stored; if zero, deletes the cookie.

  如果这个方法的参数给的是正值,表明cookie在超过指定的年龄时间后会消亡。

  负值意味着cookie不是永久性存储的,在浏览器关闭的时候将会被删除。

  这个方法的参数如果是零值将会导致cookie被删除。

 

测试程序Servlet

package com.mengdd.servlet;import java.io.IOException;import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class CookieServlet extends HttpServlet { private int counter1; private int counter2; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Cookie cookie = new Cookie("cookieName" + counter1++, "cookieValue" + counter2++); cookie.setMaxAge(10);// 设置Cookie的最大存活时间为10秒钟 resp.addCookie(cookie);// 将cookie增加在响应对象上 // 从请求中获取客户端的Cookie Cookie[] cookies = req.getCookies(); if (null == cookies) { // 如果没有cookie,返回的是null,而不是空数组 return; } for (Cookie c : cookies) { System.out.println("Cookie name: " + c.getName() + ", Cookie value: " + c.getValue()); } } }

 

  启动Tomcat测试,可以看到旧的Cookie会随着时间的流逝而消失(根据编号判断)。

 

测试程序JSP

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %>     My JSP 'jspCookie.jsp' starting page 
<%!int count1 = 0; int count2 = 0;%> <% Cookie cookie = new Cookie("cookieName" + count1++, "cookieValue" + count2++); cookie.setMaxAge(10); response.addCookie(cookie); %> <% Cookie[] cookies = request.getCookies(); if (null == cookies) { return; } for (Cookie c : cookies) { %>

cookie name: <%=c.getName()%>

cookie value: <%=c.getValue()%>

<% } %>

 

参考资料

  圣思园张龙老师Java Web教学视频33-34集。

转载于:https://www.cnblogs.com/liu-Gray/p/4868691.html

你可能感兴趣的文章
《CSS3秘籍》(第三版)-读书笔记(2)
查看>>
Chrome使用记录
查看>>
[LeetCode] Move Zeroes
查看>>
SharePoint添加列表
查看>>
update 两表更新(mysql)
查看>>
C# Math类详细说明
查看>>
【转】使用TCP协议连续传输大量数据时,是否会丢包,应如何避免?
查看>>
阿姆达尔定律
查看>>
HDU1115--Lifting the Stone(求凸多边形的重心)
查看>>
快速导航
查看>>
怎样快速导入数据到oracle数据库中
查看>>
hihoCoder 1388 Periodic Signal(FFT)
查看>>
第五周工作总结
查看>>
FileChannel的基本使用
查看>>
第三章上机实践报告
查看>>
INTERVAL YEAR TO MONTH数据类型
查看>>
Sprint总结
查看>>
LeetCode : Repeated Substring Pattern
查看>>
LeetCode : Ugly Number
查看>>
android学习笔记三
查看>>