servlet--Cookie浏览器缓存

本文详细介绍了Java Web开发中Cookie的应用,包括其基本概念、生命周期管理、跨域设置、安全性配置及中文处理等内容,并提供了实例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 简介:

    Cookie,是客户端在访问web服务器时,服务器在客户端的机器上存放的信息。
    服务器将Cookie保存在客户机器上的原因是为了跟踪客户的状态。这主要用于特殊的场合如电子商务。
    JavaServletApi为Cookie提供了简单实现,javax.servlet.http.Cookie类表示Cookie。

  • 切记:

    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中文保存
    一般情况key值不建议使用中文。value值可以使用中文,但必须要经过编码才可以保存,否则保存时会抛出异常。
    当然,读取经过编码的值时,必须要再解码。

        String str="aaa中华";
        str = URLEncoder.encode(str,"utf-8");//urlencode编码
        Cookie cookie2=new Cookie("str",str);
 //解析的时候
  Cookie cs[]=request.getCookies();
        if(cs!=null){
            for(Cookie c:cs){
                String name=c.getName();
                String value=c.getValue();
                name= URLDecoder.decode(name,"utf-8");
                value= URLDecoder.decode(value,"utf-8");
                out.println(name+"="+value+"<br/>");
            }
        }
  • 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
        Random r=new Random();
        int n=r.nextInt(100);
        Cookie cookie=new Cookie("name"+n,"Jack"+n);
//        System.out.println(request.getContextPath());
        cookie.setPath(request.getContextPath());
        cookie.setMaxAge(60*60);//设置缓存时间,秒是单位
        response.addCookie(cookie);
  • Cookie的访问权限:
    Cookie机制中,是通过path来控制权限。只有和该path相同或是它的子路径的servlet才能够访问该cookie。
    如果把一个cookie的path设为项目根目录即ContextPath(),那么该项目下的所有servlet都能够访问到它。
    路径设为“/”时,整个Tomcat下的项目都能访问到该cookie
    path不一样,那么cookie是不对的对象,即不会覆盖上次的

  • Cookie的增加修改和删除操作:
    演示对Cookie的CRUD
    如果没有Cookie就创建一个新的Cookie(name,tom)
    如果存在名为tom的Cookie就修改为jack
    如果存在名为jack的Cookie就删除他

 Cookie cs[]=request.getCookies();
        for(Cookie c:cs){
            if(c.getName().equals("name")){
                //删除cookie
                c.setPath( request.getContextPath() );//删除时是通过这一句来判断权限的,必须和原来设的路径完全一样,否则不能删除
                c.setMaxAge(0);//到期时间设为0,即是删除--此处只是设置删除标记
                response.addCookie(c);//把代表删除的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记录上次访问的时间:
index.jsp

<%--
  Created by IntelliJ IDEA.
  User: jan
  Date: 2016/7/25
  Time: 23:35
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>演示cookie技术</title>
  </head>
  <body>
    <a href="LoginServlet">利用Cookie显示用户上次登录的时间</a><br/>
  </body>
</html>

LoginServlet

package cn.hncu.servlets;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Created by jan on 2016/7/26.
 */
@WebServlet(name = "LoginServlet",value = "/LoginServlet")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");

        Cookie cs[]=request.getCookies();
        boolean boo=false;
        if(cs!=null){
            for(Cookie c:cs){
                if(c.getName().equals("dateTime")){
                    long l=Long.parseLong(c.getValue());
                    DateFormat df=new SimpleDateFormat("yyyy-MM-dd :HH:mm:ss");
                    String dt=df.format(new Date(l));
                    response.getWriter().println("你上次登录时间是:"+dt);
                    boo=true;
                    break;
                }
            }
        }
        if(!boo){
            response.getWriter().print("你最近一个月是第一次访问....");
        }
        //无论是新旧用户,都会以最近的时间来创建一个cookie,写到客户端。原来有的,就是更新
        Cookie c=new Cookie("dateTime",""+new Date().getTime());
        c.setMaxAge(60*60*24*30);
        c.setPath(request.getContextPath());
        response.addCookie(c);
        response.getWriter().flush();
    }
}

  • Javascript对cookie的操作
script type="text/javascript">
        //1 创建/修改一个cookie
        function create() {
            date=new Date();
            date.setTime(date.getTime()+1000*60*60);//毫秒为单位
//            var nm="JJJJJJ";
            var nm="张三";
            nm=encodeURI(nm);//中文编码。后台采用了URIDecode()解码,得用这个方法编码
            document.cookie = "class" + "=" + nm + "; expires=" + date.toGMTString()+";path=/";
        }
        create();
        //2 删除一个cookie---声明一个名字相同的过期时间的cookie
        function DelCookie(){
            var date = new Date(1970,1,1);
            date.setTime( date.getTime());
            var nm="张三";
//            nm=encodeURI(nm);
            document.cookie = "class" + "="+nm+"; expires="+date.toGMTString()+";path=/";
//            document.cookie = "class67" + "=JJJJJJ"+"; expires=Fri, 31 Dec 1999 23:59:59 GMT;path=/";
        }
        DelCookie( );
        //3 遍历cookie
        function visit(){
            var cs = document.cookie.split(";");
            for(var x=0;x<cs.length;x++){
                cs[x] = decodeURI(cs[x]);//中文解码
                var d1 = document.getElementById("div1");
                d1.innerHTML +="<br/>"+cs[x];//js中,id对象可以直接通过“id名”访问

                var str = cs[x].split("=");
                var div2 = document.getElementById("div2");
                div2.innerHTML +="<br/>"+str[1];
            }
        }
        visit();
    </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值