javaEE:day10-Cookie技术

Cookie简介

Cookie,是客户端在访问web服务器时,服务器在客户端的机器上存放的信息。
服务器将Cookie保存在客户机器上的原因是为了跟踪客户的状态。这主要用于特殊的场合如电子商务。
JavaServletApi为Cookie提供了简单实现,javax.servlet.http.Cookie类表示Cookie。
Cookie保存客户端的硬盘上,通过key和value值来保存信息,类似于Map。Cookie的key和value不能使用中文。如果要保存中文,必须使进行编码。
一般情况key值不建议使用中文。value值可以使用中文,但必须要经过编码才可以保存,否则保存时会抛出异常。
当然,读取经过编码的值时,必须要再解码。

切记:
Cookie保存的时间通过设置setMaxAge来设置 (默认值为-1)
如果大于0,就表示在客户机的硬盘上保存N秒。
如果小于0,就表示不将Cookie保存到客户机的硬盘上,当浏览器关闭时,Cookie当即消失。
如果等于0,就表示删除保存在客户机上的Cookie。

Cookie的方法

cookie.setMaxAge(60);在客户端保存的有效时间,以秒为单位。
cookie.setPath(“/”);设置Cookie的有效使用域。默认为当前Servlet所在的目录。
设置为/则整个tomcat有效。
设置为/myProj即,整个myProj项目有效。
setDomain(“.hncu.cn”);//设置对使用了hncu.cn一级域名的所有二级域名有效。应该配合setPath(“/”);共同使用。
setSecure(true|false);默认值为false,是否只支持https。

setHttpOnly(true|false):首先由MS推出此属性,后来被各浏览器支持。已经纳入servlet3.0规范。

Cookie的读写

向客户机保存一个Cookie:

Cookie c = new Cookie(“name”,”value”); //声明Cookie
c.setMaxAge(60);设置时间,否则不会保存到本地文件中
httpServletresponse.addCookie(c); //保存Cookie

通过以下方法读取所有Cookie

Cookie[] cs = request.getCookies();

默认情况下,只有相同目录下的应用访问有效。
如果仅希望某个应用共享Cookie可以设置
Cookie.setPath(“/项目名称”);

Cookie的路径

Cookie通过设置路径来控制权限。子路径能访问上级目录,上级目录不能访问子路径,兄弟目录不能相互访问。
在项目主页的保存的Cookie的路径为项目目录下,所以,所有页面都可以读取该值。
如在/day12/index.jsp下保存的cookie默认路径为day12/即项目目录。
只要是此项目下的所有jsp\Serlvet都可以读取此Cookie的值。
而如果是day12/jsps/a.jsp下保存的cookie则默认为jsps/目录下,只有jsps目录下的jsp\Servlet才可以读取此值。
在任意页面上可以通过
setPath(“/day12”);的方式让Cookie可以在项目中的任意位置读取。
通过httpServletResponse.addCookie()保存Cookie到客户端的机器上。
保存以后Cookie一般放到C:\Documents and Settings\Administrator\cookies目录下。

Cookie的细节

一个cookie只能表示简单的信息,且
不能直接保存中文字符。它使用name和value的形式保存数据。
W3c规定浏览器只允许存放300个Cookie,一个站点最多可以存放20个Cookie,每个cookie的容量最大为4K.
由于各个浏览器厂商对Cookie的限制有所变化,所以保存多少个要看浏览器的支持。目前一般支持保存50-80个Cookie.每个Cookie大小为8K.可以使用IE测试。
如果创建了一个Cookie,它的生命周期默认为-1,即maxAge为-1,当关闭浏览器时,cookie即消失。可以通过setMaxAge修改它的生命周期,以秒为单位。如果设置成0,则通知浏览器删除Cookie.

利用cookie技术显示上次登录信息

无论是新旧用户,都会以最近的时间来创建一个cookie,写到客户端。原来有的,就是更新。
去读cookie的key为loginTime的cookie对象,从这个对象中取出时间(即上一此登录的时间)。如果是cookie中没有这个key-value 则输出 out.print("你最近一个月是第一次登录"); 将此时创建的cookie对象写到客户端。

利用cookie技术显示最近浏览的图片

Cookie[] cs = request.getCookies();
        boolean boo = false;
        if(cs!=null){
            for(Cookie cc : cs){
                String nm = cc.getName();
                if(nm.equals("imgs")){
                    String imgStrs = cc.getValue();//cookie中的值
                    if(imgStrs.split(",").length>0){
                        String[] nameOfImgs  = imgStrs.split(",");
                        for(String nameOfImg:nameOfImgs){
                            if(nameOfImg.equals(strImg)){
                                return;
                            }
                        }
                    }
                    imgStrs = strImg+","+imgStrs;
                    if(imgStrs.split(",").length>3){
                        imgStrs = imgStrs.substring(0, imgStrs.lastIndexOf(","));
                    }
                    cc.setValue(imgStrs);
                    cc.setMaxAge(60*60*24);
                    cc.setPath("/");
                    response.addCookie(cc);
                    boo=true;
                    break;
                }
            }
        }
        if(boo==false){//首次访问(浏览器中没有图片浏览的cookie)
            Cookie c = new Cookie("imgs", strImg);
            c.setMaxAge(60*60*24);
            c.setPath("/");
            response.addCookie(c);
        }

本文完整代码:

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>
  <body>
      <h1>演示Cookie技术</h1>
      <a href="CookieDemo">Cookie基本用法演示</a><br/><br/>
      <a href="servlet/CookieDemo2">演示Cookie的权限</a><br/><br/>
      <a href="servlet/DelCookieDemo">演示Cookie的删除</a><br/><br/>
      <a href="servlet/ShowCookieDemo">利用Cookie显示上一次访问的时间</a><br/><br/>
      <a href="jsps/show.jsp">利用Cookie显示用户最近浏览的图片</a><br/><br/>


  </body>
</html>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name></display-name>
  <servlet>
    <servlet-name>CookieDemo</servlet-name>
    <servlet-class>cn.hncu.servlet.CookieDemo</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>CookieDemo2</servlet-name>
    <servlet-class>cn.hncu.servlet.CookieDemo2</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>DelCookieDemo</servlet-name>
    <servlet-class>cn.hncu.servlet.DelCookieDemo</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>ShowCookieDemo</servlet-name>
    <servlet-class>cn.hncu.servlet.ShowCookieDemo</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>ShowImg</servlet-name>
    <servlet-class>cn.hncu.servlet.ShowImg</servlet-class>
  </servlet>





  <servlet-mapping>
    <servlet-name>CookieDemo</servlet-name>
    <url-pattern>/CookieDemo</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>CookieDemo2</servlet-name>
    <url-pattern>/servlet/CookieDemo2</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>DelCookieDemo</servlet-name>
    <url-pattern>/servlet/DelCookieDemo</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>ShowCookieDemo</servlet-name>
    <url-pattern>/servlet/ShowCookieDemo</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>ShowImg</servlet-name>
    <url-pattern>/ShowImg</url-pattern>
  </servlet-mapping>    
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

show.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>用户浏览图片</title>
<style type="text/css">
    img{
        border: 1px;
        width: 100px;
        height: 100px;
    }
</style>
</head>
<body>
    <h1>美女图</h1>
    <a href="jsps/show.jsp">利用cookie浏览最近看到美女图</a>
    <h3>最近浏览的美女图</h3>
    <br/>
    <%
        String str = null;
        Cookie[] cs = request.getCookies();
        if(cs!=null){
            for(Cookie c : cs ){
                if(c.getName().equals("imgs")){
                    str = c.getValue();
                    break;
                }
            }
        }
        if(str!=null){
            String[] strImgs = str.split(",");
            for(String strImg:strImgs){
            %>
            <img src="<%=request.getContextPath() %>/imgs/<%=strImg %>" />
            <%
            }
        }
     %>
    <hr />

    <a href="<%=request.getContextPath() %>/ShowImg?img=1.jpg"> <img
        src="<%=request.getContextPath()%>/imgs/1.jpg" /> </a>
    <a href="<%=request.getContextPath() %>/ShowImg?img=2.jpg"> <img
        src="<%=request.getContextPath()%>/imgs/2.jpg" /> </a>
    <a href="<%=request.getContextPath() %>/ShowImg?img=3.jpg"> <img
        src="<%=request.getContextPath()%>/imgs/3.jpg" /> </a>
    <a href="<%=request.getContextPath() %>/ShowImg?img=4.jpg"> <img
        src="<%=request.getContextPath()%>/imgs/4.jpg" /> </a>
    <a href="<%=request.getContextPath() %>/ShowImg?img=5.jpg"> <img
        src="<%=request.getContextPath()%>/imgs/5.jpg" /> </a>
    <a href="<%=request.getContextPath() %>/ShowImg?img=6.jpg"> <img
        src="<%=request.getContextPath()%>/imgs/6.jpg" /> </a>
    <a href="<%=request.getContextPath() %>/ShowImg?img=7.jpg"> <img
        src="<%=request.getContextPath()%>/imgs/7.jpg" /> </a>
    <a href="<%=request.getContextPath() %>/ShowImg?img=8.jpg"> <img
        src="<%=request.getContextPath()%>/imgs/8.jpg" /> </a>
</body>
</html>

CookieDemo

package cn.hncu.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;

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 CookieDemo extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        //向客户端写Cookie
        Cookie c = new Cookie("name", "jack");//key,value的格式
        c.setPath(request.getContextPath());//路径,用来设置权限
        c.setMaxAge(60*60);//过期时间,以秒为单位
        // Cookie机制中,是通过path来控制权限。只有<url-pattern>和该path相同或是它的子路径的servlet才能够访问该cookie。
        //如果把一个cookie的path设为项目根目录即ContextPath(),那么该项目下的所有servlet都能够访问到它。
        response.addCookie(c);
        //设置value中带中文
        String str = "你好,这是中文";
        str = URLEncoder.encode(str,"utf-8");
        Cookie cStr = new Cookie("msg", str);
        cStr.setPath(request.getContextPath());
        cStr.setMaxAge(60*60);
        response.addCookie(cStr);

        //读取客户端发送来的Cookie
        Cookie[] cs = request.getCookies();
        if(cs!=null){
            for(Cookie cc : cs){
                String nm = cc.getName();
                String val = cc.getValue();
                val = URLDecoder.decode(val, "utf-8");
                out.println(nm+":"+val+"<br/>");
            }
        }
        out.print("Cookie 保存成功<br/>");
    }


}

CookieDemo2

package cn.hncu.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Random;

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 CookieDemo2 extends HttpServlet {

    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);
        Cookie c = new Cookie("age", ""+n);
        c.setPath(request.getContextPath()+"/servlet/CookieDemo2");//Cookie机制中,是通过path来控制权限
        //由于CookieDemo的url-pattern是项目根目录,不是当前cookie所设路径的子路径,因此访问不到该cookie
        //即CookieDemo中访问不到CookieDemo2中设置的cookie
        //System.out.println(c.getPath());//注意,path不一样,那么cookie是不对的对象,即不会覆盖上次的

        c.setMaxAge(60*60);
        response.addCookie(c);
        //读cookie
        Cookie[] cs = request.getCookies();
        if(cs!=null){
            for(Cookie cc : cs){
                String nm = cc.getName();
                String val = cc.getValue();
                out.println("22222:"+nm+":"+val+"<br/>");
            }
        }
        out.println("cookie保存成功");
    }

}

DelCookieDemo

package cn.hncu.servlet;

import java.io.IOException;
import java.io.PrintWriter;

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 DelCookieDemo extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();

        Cookie[] cs = request.getCookies();
        if(cs!=null){
            for(Cookie cc : cs){
                String nm= cc.getName();
                if(nm.equals("msg")){
                    cc.setMaxAge(0);//到期时间设为0,即是删除--此处只是设置删除标记
                    cc.setPath(request.getContextPath());//删除时是通过这一句来判断权限的,必须和原来设的路径完全一样,否则不能删除
                    response.addCookie(cc);//把代表删除的cookie发送给客户端,就可以执行删除了!
                }
            }
        }
    }

}

ShowCookieDemo

package cn.hncu.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

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 ShowCookieDemo extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
        out.println("<HTML>");
        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
        out.println("  <BODY>");
        Cookie[] cs = request.getCookies();
        boolean boo =false;
        if(cs!=null){
            for(Cookie cc : cs ){
                if(cc.getName().equals("loginTime")){
                    long dt = Long.parseLong(cc.getValue());
                    Date date = new Date(dt);
                    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    String strDate=  format.format(date);
                    out.print("你上次登录的是时间是:"+strDate);
                    boo=true;
                    break;
                }
            }
        }
        if(boo==false){
            out.print("你最近一个月是第一次登录");
        }
        //写Cookie
        Date date= new Date();
        long dt = date.getTime();
        Cookie c = new Cookie("loginTime",""+dt );
        c.setPath(request.getContextPath());
        c.setMaxAge(60*60*24);
        response.addCookie(c);


        out.println("  </BODY>");
        out.println("</HTML>");
        out.flush();
        out.close();
    }

}

ShowImg

package cn.hncu.servlet;

import java.io.IOException;
import java.io.PrintWriter;

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 ShowImg extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
        out.println("<HTML>");
        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
        out.println("  <BODY>");
        String strImg = request.getParameter("img");//传过来的参数
        String htmlStr = "<img src='"+request.getContextPath()+"/imgs/"+strImg+"'/>";
        out.println(htmlStr);
        //采用cookie看已经访问过的信息
        Cookie[] cs = request.getCookies();
        boolean boo = false;
        if(cs!=null){
            for(Cookie cc : cs){
                String nm = cc.getName();
                if(nm.equals("imgs")){
                    String imgStrs = cc.getValue();//cookie中的值
                    if(imgStrs.split(",").length>0){
                        String[] nameOfImgs  = imgStrs.split(",");
                        for(String nameOfImg:nameOfImgs){
                            if(nameOfImg.equals(strImg)){

                                return;
                            }
                        }
                    }
                    imgStrs = strImg+","+imgStrs;
                    if(imgStrs.split(",").length>3){
                        imgStrs = imgStrs.substring(0, imgStrs.lastIndexOf(","));
                    }
                    cc.setValue(imgStrs);
                    cc.setMaxAge(60*60*24);
                    cc.setPath("/");
                    response.addCookie(cc);
                    boo=true;
                    break;
                }
            }
        }
        if(boo==false){
            Cookie c = new Cookie("imgs", strImg);
            c.setMaxAge(60*60*24);
            c.setPath("/");
            response.addCookie(c);
        }

        out.println("  </BODY>");
        out.println("</HTML>");
        out.flush();
        out.close();
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值