首页 > 其他分享 >Servlet Cookie对象详解

Servlet Cookie对象详解

时间:2023-10-24 13:05:15浏览次数:30  
标签:cookie String res void 详解 Cookie allCookies Servlet

Cookie是服务器发送给浏览器的体积很小的纯文本信息,用户以后访问同一个Web服务器时浏览器会把它们原样发送给服务器。cookie一般用于在线交易过程中标识用户身份、安全要求不高的场合避免用户重复输入名字和密码、门户网站的主页定制、有针对性地投放广告等等。 Servlet中可以同时创建多个cookie,但是每个站点最多只能保存20个cookie。

原理

Servlet Cookie对象详解_数组


1. 服务器脚本向浏览器发送一组 Cookies。例如:姓名、年龄或识别号码等。
2. 浏览器将这些信息存储在本地计算机上,以备将来使用。
3. 当下一次浏览器向 Web 服务器发送任何请求时,浏览器会把这些 Cookies 信息发送到服务器,服务器将使用这些信息来识别用户。

Servlet Cookie方法

序号

方法 & 描述

1

public void setDomain(String pattern)

该方法设置 cookie 适用的域,例如 w3cschool.cc。

2

public String getDomain()

该方法获取 cookie 适用的域,例如 w3cschool.cc。

3

public void setMaxAge(int expiry)

该方法设置 cookie 过期的时间(以秒为单位)。如果不这样设置,cookie 只会在当前 session 会话中持续有效。

4

public int getMaxAge()

该方法返回 cookie 的最大生存周期(以秒为单位),默认情况下,-1 表示 cookie 将持续下去,直到浏览器关闭。

5

public String getName()

该方法返回 cookie 的名称。名称在创建后不能改变。

6

public void setValue(String newValue)

该方法设置与 cookie 关联的值。

7

public String getValue()

该方法获取与 cookie 关联的值。

8

public void setPath(String uri)

该方法设置 cookie 适用的路径。如果您不指定路径,与当前页面相同目录下的(包括子目录下的)所有 URL 都会返回 cookie。

9

public String getPath()

该方法获取 cookie 适用的路径。

10

public void setSecure(boolean flag)

该方法设置布尔值,表示 cookie 是否应该只在加密的(即 SSL)连接上发送。

11

public void setComment(String purpose)

该方法规定了描述 cookie 目的的注释。该注释在浏览器向用户呈现 cookie 时非常有用。

12

public String getComment()

该方法返回了描述 cookie 目的的注释,如果 cookie 没有注释则返回 null。

Servlet设置Cookie

1. 创建一个 Cookie 对象

Cookie cookie = new Cookie("key","value");

无论是名字还是值,都不应该包含空格或以下任何字符:[ ] ( ) = , " / ? @ : ;

2. 设置最大生存周期

cookie.setMaxAge(60*60*24);  //设置一个最长有效期为 24 小时的 cookie。

3. 保存Cookie

response.addCookie(cookie);

使用response.addCookie来添加HTTP响应头中的Cookies,保存到客户端。

读取删除Cookie

1. 通过Servlet读取Cookies

要读取 Cookies,您需要通过调用 HttpServletRequest 的 getCookies( ) 方法创建一个 javax.servlet.http.Cookie 对象的数组。然后循环遍历数组,并使用 getName() 和 getValue() 方法来访问每个 cookie 和关联的值。

2. 通过Servlet删除Cookies

a. 读取一个现有的 cookie,并把它存储在 Cookie 对象中。
b. 使用 setMaxAge() 方法设置 cookie 的年龄为零,来删除现有的 cookie。
c. 把这个 cookie 添加到响应头。

例子

//创建cookie
public void doGet(HttpServletRequest req, HttpServletResponse res) {
    try {
        res.setContentType("text/html;charset=gbk");
        PrintWriter pw = res.getWriter();
        //当用户访问该servlet时, 就将信息创建到该用户的cookie中  
        //1. 现在服务器端创建一个cookie  
        Cookie myCookie = new Cookie("color1", "red");

        //2. 该cookie存在的时间 以秒为单位  
        myCookie.setMaxAge(30000);
        //如果你不设置存在时间,那么该cookie将不会保存  
        //3. 将该cookie写回到客户端  
        res.addCookie(myCookie);

        pw.println("已经创建了cookie");
    } catch(Exception ex) {

        ex.printStackTrace();
    }
}
//读取cookie
public void doGet(HttpServletRequest req, HttpServletResponse res) {
    try {
        res.setContentType("text/html;charset=gbk");
        PrintWriter pw = res.getWriter();
        //从客户端得到所有cookie信息  
        Cookie[] allCookies = req.getCookies();
        int i = 0;
        //如果allCookies不为空...  
        if (allCookies != null) {
            //从中取出cookie  
            for (i = 0; i < allCookies.length; i++) {
                //依次取出  
                Cookie temp = allCookies[i];
                if (temp.getName().equals("color1")) {
                    //得到cookie的值  
                    String val = temp.getValue();
                    pw.println("color1=" + val);
                    break;
                }
            }
            if (allCookies.length == i) {
                pw.println("cookie 过期");
            }
        } else {
            pw.println("不存在color1这个cookie/或是过期了!");
        }
    } catch(Exception ex) {
        ex.printStackTrace();
    }
}


//删除cookie
public void doGet(HttpServletRequest req, HttpServletResponse res) {
    try {
        res.setContentType("text/html;charset=gbk");
        PrintWriter pw = res.getWriter();
        //从客户端得到所有cookie信息  
        Cookie[] allCookies = req.getCookies();
        int i = 0;
        //如果allCookies不为空...  
        if (allCookies != null) {
            //从中取出cookie  
            for (i = 0; i < allCookies.length; i++) {
                //依次取出  
                Cookie temp = allCookies[i];
                if (temp.getName().equals("color")) {
                    //将该cookie删除  
                    temp.setMaxAge(0);
                    pw.println("删除了color这个cookie");
                    break;
                }
            }
        }
    } catch(Exception ex) {
        ex.printStackTrace();
    }
}

总结

1. Cookie的目的就是为用户带来方便,为网站带来增值。虽然有着许多误传,事实上Cookie并不会造成严重的安全威胁。Cookie永远不会以任何方式执行,因此也不会带来病毒或攻击你的系统。另外,由于浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4 KB,因此Cookie不会塞满你的硬盘,更不会被用作“拒绝服务”攻击手段。 

2. Cookie是由服务器创建,然后通过响应发送给客户端的一个键值对。客户端会保存Cookie,并会标注出Cookie的来源(哪个服务器的Cookie)。当客户端向服务器发出请求时会把所有这个服务器Cookie包含在请求中发送给服务器,这样服务器就可以识别客户端了。


3. Servlet先要调用new Cookie(name,value)用合适的名字和值创建一个或多个Cookie,通过cookie.setXXX设置各种属性,通过response.addCookie(cookie)把cookie加入应答头。 
4. Servlet从客户端读入Cookie,应该调用request.getCookies(),getCookies()方法返回一个Cookie对象的数组。在大多数情况下,你只需要用循环访问该数组的各个元素寻找指定名字的Cookie,然后对该Cookie调用getValue方法取得与指定名字关联的值。

标签:cookie,String,res,void,详解,Cookie,allCookies,Servlet
From: https://blog.51cto.com/u_16248220/8002382

相关文章

  • Java中Servlet Filter配置(web.xml详解)
    Java中ServletFilter在web.xml中配置时有2个用于过滤器的元素,分别是filter和filter-mapping。filter元素向系统注册一个过滤对象,filter-mapping元素指定该过滤对象所应用的URL。Filter配置过滤器元素filter元素filter元素位于部署描述符文件(web.xml)的前部,所有filter-mapping、serv......
  • Chromium 消息循环和线程池详解
    Chromium中的多线程机制由base库提供,要理解Chromium中的多线程机制,首先要理解的概念就是 base::MessageLoop 和 base::TaskScheduler ,它们两个是Chromium多线程的基础1. MessageLoop详解base::MessageLoop 代表消息循环,它不会主动创建新的线程,默认情况下它使用当前......
  • Spring MVC入口Servlet详解(HttpServletBean,FrameworkServlet,DispatcherServlet )
    SpringMVC中DispatcherServlet前端控制器是web服务器的入口,那么它是怎么样进行初始化的,是怎么样进行工作?继承关系1.HttpServletBean主要做一些初始化的工作,将web.xml中配置的参数设置到Servlet中。比如servlet标签的子标签init-param标签中配置的参数。2.FrameworkServlet将Serv......
  • DispatcherServlet初始化顺序详解
    1. Web容器启动时将调用HttpServletBean的init方法publicabstractclassHttpServletBeanextendsHttpServletimplementsEnvironmentAware{@Overridepublicfinalvoidinit()throwsServletException{//省略部分代码//1、如下代码的作用是将Serv......
  • ScyllaDB详解
    2ScyllaDB号称下一代NoSQL,C++编写充分利用Linux底层原语优势,利用现代多核、多处理器NUMA服务器硬件,卓越性能,API兼容Cassandra和DynamoDB:支持和Cassandra一样的CQL查询语言和驱动,一样的SSTable存储格式同样支持和DynamoDB一样的JSON-style查询和驱动2.1......
  • 一文详解|支付宝小程序跳转(超详细版)
    开发过程中经常遇到支付宝小程序跳转的问题,这里总结一下支付宝小程序跳转的常见场景和方式,希望可以对大家有所帮助。话不多说,上干货!     支付宝小程序跳转的三种行为支付宝小程序跳转可以拆分为三种行为,即:外部跳转支付宝小程序支付宝小程序内部页面之间跳转......
  • Makefile基础使用和实战详解
    一、基础Makefile其实只是一个指示make程序如何为我们工作的命令文件,我们说Makefile其实是在说make。而对于项目来说,Makefile是指软件项目的编译环境。Makefile的好坏对于项目开发有些什么影响呢?设计得好的Makefile,当我们重新编译时,只需编译那些上次编译成功后修改过的......
  • Go语言代码断行规则详解
    本文深入探讨了Go语言中代码断行的各个方面,从基础概念到实际应用实践。关注【TechLeadCloud】,分享互联网架构、云服务技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业......
  • 什么是cookie和session?
    HTTP/HTTPS请求的特点:无状态的短链接短链接:一次请求响应后会断开浏览器与网站之间的连接如果在发送一次请求,则需要重新建立连接,这时网站已经不知道之前已经建立过连接,只认为他是一个新人发送的请求无状态:不携带以前的状态,默认是全新的请求 什么是cookie和session?为了让......
  • jenkins 原理篇——pipeline流水线 声明式语法详解
    大家好,我是蓝胖子,相信大家平时项目中或多或少都有用到jenkins,它的piepeline模式能够对项目的发布流程进行编排,优化部署效率,减少错误的发生,如何去写一个pipeline脚本呢,今天我们就来简单看看pipeline的语法。先拿一个helloworld的pipeline脚本举例,我们来看看pipeline脚本的组成......