Servlet之Cookie技术

前言:我们可以知道,由于Http的无状态性,也就是说当用户发送一次请求给服务器之后,服务器响应客户端的请求,当同一个客户端再次发送请求给服务器时,服务器并不知道这个请求是同一个客户端发送的。由此产生了Session追踪技术来保持状态,总共四个保持状态的方法:网址重写(URL传参),隐藏域(表单提交),cookie技术,session技术。今天来提一下第三种cookie技术。

一、cookie简介

  cookie是自动地在Web服务器和客户端之间传递的一小块信息,并存放在客户端所在的硬盘上,适用于需要跨越许多页面的信息,每个服务器最多可以支持20个cookie。

  由于cookie的传递是作为HTTP表头嵌入的,因此传输它的过程有HTTP协议处理,Servlet通过HttpServletRequest的getCookie()方法得到HTTP标头中cookies,通过HttpServletResponse的addCookie()方法返回带有cookie的HTTP标头保存在客户端。

二、cookie的用处

  cookie有个明显的缺点,就是数据是保存在客户端本地的,用户可以禁用或删除本地保存的cookie,并且安全性低。

  但是,我们可以利用cookie实现以下功能:

  能够跟踪特定访问者的访问次数、最后访问时间。

  能够提供给用户一定时间保存登陆的账号密码。

三、创建并存入cookie

1         Cookie cookie = new Cookie("testName","testValue");
2         cookie.setMaxAge(60*60);  //存活时间为一天
3         response.addCookie(cookie);

  调用javax.servlet.http.Cookie类,利用其构造方法(name,value)的键值对创建cookie对象。cookie对象的setMaxAge方法设定cookie存活的时间,当参数为-1时,表示cookie存放在浏览器缓存中,当浏览器关闭时消亡;当参数为0时,cookie从客户端删除;当为正值时,表示cookie的存活时间,单位为秒。这里谈一下其另外一个方法:getPath(),表示当前创建cookie的资源路径,如http://localhost:8080/FirstWebDemo/servlet/CookieDemo中写的cookie,那么path为/servlet/CookieDemo。为了将一个cookie发送给客户端,需要调用HttpServletResponse的addCookie方法将cookie保存在HTTP标头中响应给客户端。

  以下为cookie对象的所有方法:

类型 方法名 方法解释
String getComment() 返回cookie中注释,如果没有注释的话将返回空值.
String getDomain() 返回cookie中Cookie适用的域名. 使用getDomain() 方法可以指示浏览器把Cookie返回给同 一域内的其他服务器,而通常Cookie只返回给与发送它的服务器名字完全相同的服务器。注意域名必须以点开始(例如.yesky.com)
int getMaxAge() 返回Cookie过期之前的最大时间,以秒计算。
String getName() 返回Cookie的名字。名字和值是我们始终关心的两个部分,笔者会在后面详细介绍 getName/setName。
String getPath() 返回Cookie适用的路径。如果不指定路径,Cookie将返回给当前页面所在目录及其子目录下 的所有页面。
boolean getSecure() 如果浏览器通过安全协议发送cookies将返回true值,如果浏览器使用标准协议则返回false值。
String getValue() 返回Cookie的值。笔者也将在后面详细介绍getValue/setValue。
int getVersion() 返回Cookie所遵从的协议版本。
void setComment(String purpose) 设置cookie中注释。
void setDomain(String pattern) 设置cookie中Cookie适用的域名
void setMaxAge(int expiry) 以秒计算,设置Cookie过期时间。
void setPath(String uri) 指定Cookie适用的路径。
void setSecure(boolean flag) 指出浏览器使用的安全协议,例如HTTPS或SSL。
void setValue(String newValue) cookie创建后设置一个新的值。
void setVersion(int v) 设置Cookie所遵从的协议版本。   

四、读取客户端cookie

        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie c : cookies) {
                System.out.println(c.getName() + " " + c.getValue() + " " + c.getMaxAge());
            }
        }

  要访问客户端发出的cookie,可以使用HttpServletRequest的getCookies方法获取标头中的cookie,返回的是一个包含所有cookie的数组。

五、删除客户端的cookie

        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie c : cookies) {
                if (c.getName().equals("testName")) {  //删除cookie中Name值为testName的cookie
                    c.setMaxAge(0);   //设置存活时间为0
                    response.addCookie(c);  //覆盖原cookie,即为删除cookie
                }
            }
        }

  cookie对象没有提供直接删除cookie的方法,只能如上所示来删除cookie,除了 如上的方法,还可以新建一个与要删除cookie对象同名的cookie对象,再将其存活时间设置为0再返回给客户端。

六、注意事项:

  1. cookie的值不能为特殊符号,如空格,方括号,圆括号,等于号(=),逗号,双引号,斜杠,问号,@符号,冒号,分号。

  2. 见以下代码,这是我第一次学碰到的问题,直到我了解cookie的传递和工作过程后得以解决。

        Cookie cookie = new Cookie("testName","testValue");
        cookie.setMaxAge(60*60);
        response.addCookie(cookie);   //注意:这里是封装在HttpServletResponse里返回,必须得响应后再重新发送请求给web服务器,此时getCookie才能得到上一次创建并添加的cookie值,后面第一次是遍历不出此处添加的cookie值的。
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie c : cookies) {
                System.out.println(c.getName() + " " + c.getValue() + " " + c.getMaxAge());  //没有输出值为testValue的cookie,这里我在不了解工作过程之前一直郁闷为什么不输出上文添加的cookie值。
            }
        }

原文地址:https://www.cnblogs.com/chenloveslife/p/8988061.html

时间: 2024-08-26 08:09:45

Servlet之Cookie技术的相关文章

黑马day05 Cookie技术入门&记录上次访问的时间

1.Cookie技术: 客户端技术 Cookie是基于set-Cookie响应头和Cookie请求头工作的,服务器可以发送set-Cookie请求头命令浏览器保存一个cookie信息,浏览器会在访问服务器时以Cookie请求头的方式带回之前保存的信息 request.getCookies(); response.addCookie(Cookie c); new  Cookie(String name,String value)//Cookie在构造的时候就需要设定好cookie的名字和值 get

会话管理之Cookie技术

会话管理是web开发中比较重要的环节,这一节主要总结下会话管理中的cookie技术. 1. 何为会话 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称为一个会话. 1.1 会话过程中要解决的问题 1)每个用户在使用浏览器与服务器进行会话的过程中,不可避免会各自产生一些数据,程序要想办法为每个用户保存这些数据.        2)如:用户点击超链接通过一个servlet购买了一个商品,程序应该想办法保存用户购买的商品,以便于用于点结账serv

Cookie技术

u  常用的API 创建Cookie对象 Cookie(String name, String value)    ->以指定数据创建Cookie对象 设置Cookie对象 void setMaxAge(int expiry)                ->设置Cookie的最大有效时间 void setPath(String uri)                             ->设置Cookie的有效路径 void setDomain(String pattern)

JavaWeb之Servlet:Cookie 和 Session

会话 现实生活中我们会用手机跟对方对话,拿起手机,拨号,然后对面接听,跟着互相通话,最后会话结束. 这个过程也可以用我们的B/S模式来描述: 打开浏览器—>输入地址->发出请求->服务器收到请求->向浏览器发出响应->..重复.->关闭浏览器 这样的过程我们用 “会话” 来描述,上面就一次会话的例子. 会话管理 知道会话的概念后,我们在平时上网是否可以看到一些网页有这样的操作:当你是第一次登入这个网站,网站会发出:”欢迎来到本网站”. 然而,当你第二次登入该网站,它就会

JavaWeb案例:上次访问时间 Cookie技术

1 package cn.itcast.access; 2 3 import javax.servlet.ServletException; 4 import javax.servlet.annotation.WebServlet; 5 import javax.servlet.http.Cookie; 6 import javax.servlet.http.HttpServlet; 7 import javax.servlet.http.HttpServletRequest; 8 import

【学习】013 Servlet、Cookie、Session的简述

Servlet核心内容 Sevlet的生命周期(重点) Servlet重要的四个生命周期方法 构造方法: 创建servlet对象的时候调用.默认情况下,第一次访问servlet的时候创建servlet对象只调用1次.证明servlet对象在tomcat是单实例的. init方法: 创建完servlet对象的时候调用.只调用1次. service方法: 每次发出请求时调用.调用n次. destroy方法: 销毁servlet对象的时候调用.停止服务器或者重新部署web应用时销毁servlet对象.

网页浏览历史纪录(Cookie技术)

一.实现原理: 首先创建一个Cookie用于记录访问网页的编号:或者商品的编号 每次访问完就往这个Cookie中更新新的数据(新建Cookie重新添加,主要用于访问的页面在原有历史纪录中已经存在,需要删除原有纪录重新添加) 在需要显示的历史纪录的数据准备页面进行获取,然后转发给显示JSP页面,进行显示. 二.DEMO 图书数据准备页面:ShowBookList (Servlet) package com.heima.demo1; import java.io.IOException; impor

servlet中cookie和session操作

1.1 软件中的会话 一次会话: 打开浏览器 -> 访问一些服务器内容 -> 关闭浏览器 登录场景: 打开浏览器 -> 浏览到登陆页面 -> 输入用户名和密码 -> 访问到用户主页(显示用户名) 修改密码(输入原密码) 修改收货地址 ....... 问题:在此处登录会话过程中产生的数据(用户会话数据)如何保存下来呢? 购物场景: 打开浏览器 -> 浏览商品列表  -> 加入购物车(把商品信息保存下来)  -> 关闭浏览器 打开浏览器->  直接进入购物

cookie技术核心! 就是四个类的应用 搞懂这个基本上就把这个搞定了!

他就是一个保存用户登录浏览器的一个保存数据的东西,客户浏览信息不回保存到数据库,会保存到这里 一: 构造Cookie对象 Cookie(java.lang.String name,java.lang.String value) 二设置cookie void setPath(java.lang.String uri) : 设置cookie的有效访问路径 void setMaxAge(int expiry); 设置cookie的有效时间 void setValue(java.lang.String