cookie是服务器发送给浏览器的信息,以便用户登录,服务器获取相应信息
当浏览器第一次访问一个网站时,无cookie发送,此时服务器会默认发送一个JSESSIONID=32位16进制数
当浏览器再次访问该站点时,会将本地保存的未过期的cookie信息发送给服务器
一:cookie的创建:
cookie由javax.servlet.http.Cookie类提供构造方法
cookie是一组key=value值
new Cookie(key,value)即可造出对象
cookie方法:
cookie.setMaxAge(int);在客户端保存的有效时间,以秒为单位。
Cookie保存的时间通过设置setMaxAge来设置 (默认值为-1)
如果大于0,就表示在客户机的硬盘上保存N秒。
如果小于0,就表示不将Cookie保存到客户机的硬盘上,当浏览器关闭时,Cookie当即消失。
如果 等于 0 ,就表示删除保存在客户机上的 Cookie 。(对于cookie,服务器只是设置标记,浏览器会根据标记处理)cookie.setPath(“/”);设置Cookie的有效使用域。默认为当前,"/"表示tomcat所有servlet都可访问
path是设置cookie的访问权限,每一个servlet在web.xml都有地址映射,而cookie的path理论是相当于命名空间的合法字符串即可,但是由于
servlet地址映射,servlet只能访问地址映射的本身或父级目录空间的cookie
例如:servlet的映射地址为/aa/bb/cc,那么cookie的path需要设置在/(tomcat下) /request.getContextpath(项目下) /aa或者/aa/bb或者
/aa/bb/cc,此时servlet才能访问到,path可能设/dd/ee//ff之类的合法字符串,但是servlet却无法访问,这样的cookie创建又有何用呢?
cookie中文问题:
cookie的使用代码:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//向客户端写cookie
Random r = new Random();
int n = r.nextInt(100);
String name = "Jack";//cookie的格式:key=value
//Cookie c = new Cookie("name"+n,name+n);
Cookie c = new Cookie("name",name+n);
c.setMaxAge(60*60);//过期时间,以秒为单位
c.setPath( request.getContextPath() );//该路径是:cookieSessionWeb/
// Cookie机制中,是通过path来控制权限。只有<url-pattern>和该path相同或是它的子路径的servlet才能够访问该cookie。
//如果把一个cookie的path设为项目根目录即ContextPath(),那么该项目下的所有servlet都能够访问到它。
response.addCookie(c);
//这一段演示cookie中带中文
String str="aa中文";
str = URLEncoder.encode(str,"utf-8");//urlencode编码
Cookie cStr = new Cookie("str",str);
cStr.setPath("/");//路径设为“/”时,整个Tomcat下的项目都能访问到该cookie
response.addCookie(cStr);
//读取客户端发来的cookie
Cookie cs[] = request.getCookies();//读取cookie
if(cs!=null){
for(Cookie cc:cs){
String nm = cc.getName();
String val = cc.getValue();
val =URLDecoder.decode(val, "utf-8");//中文就解码,ascii码则是原样
out.println(nm+"="+val+"<br/>");
}
}
out.println("Cookie保存成功!");
}
cookie删除:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
Cookie cs[] = request.getCookies();
if(cs!=null){
for(Cookie c:cs){//要想遍历到“name”这个cookie,当前servlet必须要有读权限,即servlet的url-pattern必须是该cookie所设路径的相同路径或子路径
if(c.getName().equals("name")){
//删除cookie
c.setPath( request.getContextPath() );//删除时是通过这一句来判断权限的,必须和原来设的路径完全一样,否则不能删除
c.setMaxAge(0);//到期时间设为0,即是删除--此处只是设置删除标记
response.addCookie(c);//把代表删除的cookie发送给客户端,就可以执行删除了!
}
}
}
}