博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Servlet--Cookie原理及API使用详解
阅读量:2443 次
发布时间:2019-05-10

本文共 4022 字,大约阅读时间需要 13 分钟。

会话的概述

在日常生活中,从拨通电话到挂断电话之前的一连串的你问我答的过程就是一个会话。Web应用中的会话过程类似于生活中的打电话过程,它指的是一个客户端(浏览器)与Web服务器之间连续发生的一系列请求和响应过程,例如,一个用户在某网站上的整个购物过程就是一个会话。

在打电话过程中,通话双方会有童话内容,同样,在客户端与服务器端交互的过程中,也会产生一些数据,例如,用户甲和乙分别登录了购物网站,甲购买了一个Nokia手机,乙购买了一个Ipad,当这两个用户结账时,Web服务器需要对用户甲和乙的身份进行保存。虽然HttpServletRequest对象和ServletContext对象可以对数据进行保存,但是这两个对象都不可行,具体原因如下:

  • 客户端请求Web服务器时,针对每次HTTP请求,Web服务器都会创建一个HttpServletRequest对象,该对象只能保存本次请求所传递的数据。由于购买和结账是两个不同的请求,因此,在发送结账请求时,之前购买请求中的数据将会丢失。
  • 使用ServletContext对象保存数据时,由于同一个Web应用共享的是同一个ServletContext对象,因此,当用户在发送结账请求时,由于无法区分哪些商品是哪个用户所购买的,而会将该购物网站中所有用户购买的商品进行结算,这显然也是不可行的。
  • 为了保存会话过程中产生的数据,在Servlet技术中,提供了两个用于保存会话数据的对象,分别是CookieSession

在这里插入图片描述

Cookie概述

在现实生活中,当顾客在购物时,商城经常会赠送顾客一张会员卡,卡上记录用户的个人信息(姓名,手机号码等)、消费额度和积分额度等。顾客一旦接收了会话,以后每次光临该商场时,都可以使用这张会员卡,商场也将根据会员卡上的消费记录计算会员的优惠额度和累加积分。在Web应用中,Cookie的功能类似于这张会员卡。

当用户通过浏览器访问Web服务器时,服务器会给客户端发送一些信息,这些信息都保存在Cookie中。这样,当浏览器再次范文服务器时,都会在请求头中将Cookie发送给服务器,方便服务器对浏览器做出正确的响应。
服务器向客户端发送Cookie时,会在HTTP响应头字段中增加Set-Cookie响应头字段。Set-Cookie头字段中设置的Cookie遵循一定的语法格式,具体如下:

Set-Cookie: user=zhang; Path=/;

user表示Cookie的名称,zhang表示Cookie的值,Path表示Cookie的属性。需要注意的是,Cookie必须以键值对的形式存在,其属性可以有多个,但这些属性之间必须用分号;和空格分割。

Cookie在浏览器和服务器之间的传输过程:

在这里插入图片描述

在上图中,当用户第一次访问服务器时,服务器会在响应消息中增加Set-Cookie头字段,将用户信息以Cookie的形式发送给浏览器。一旦用户浏览器接受了服务器发送的Cookie信息,就会将它保存在浏览器的缓冲区中,这样,当浏览器后续访问服务器时,都会在请求消息中将用户信息以Cookie的形式发送给Web服务器,从而使服务器端分辨出当前请求是由哪个用户发出的。

在这里插入图片描述

Cookie的基本使用

Cookie将用户的信息保存到客户端浏览器的一个技术,当下次访问的时候,浏览器会自动携带Cookie的信息过来到服务器

创建Cookie new Cookie(name, value), javax.servlet.http.Cookie
将Cookie发送给浏览器 HttpServletResponse.addCookie(javax.servlet.http.Cookie)
接收浏览器携带的所有Cookie HttpServletRequest.getCookies()

案例分析

流程分析:

在这里插入图片描述

步骤分析:

  1. 获得从客户端带过来的所有Cookie
  2. 从所有Cookie中查找指定名称的Cookie
  3. 判断是否是第一次访问:
    • 是第一次:现实欢迎
    • 不是第一次:现实欢迎,同时现实上次访问的时间
  4. 记录当前的时间,并且例用Cookie将时间回写到浏览器端

代码实现:

package pers.zhang.servlet;import javax.servlet.ServletException;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.util.Date;/** * @author zhang * @date 2019/9/18 - 23:08 */public class VisitServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8"); //获得客户端的所有Cookie Cookie[] cookies = request.getCookies(); //从cookies的数组中查找指定名称的cookie Cookie temp = null; for (int i = 0; i < cookies.length; i++) {
if(cookies[i].getName().equals("visitTime")){
temp = cookies[i]; break; } } //判断是不是第一次访问 if(temp == null){
//是第一次访问 response.getWriter().println("

欢迎来到本网站!

"); }else{
//不是第一次访问 Long time = Long.parseLong(temp.getValue()); Date date = new Date(time); response.getWriter().println("

欢迎来到本网站:您上次访问时间为" + date.toLocaleString() + "

"); } //记录当前时间,写回到Cookie中 Cookie c = new Cookie("visitTime","" + System.currentTimeMillis()); response.addCookie(c); }}

第一次访问,页面显示:

在这里插入图片描述
第二次访问,页面显示:
在这里插入图片描述

Cookie的分类

  • 会话级别的Cookie:默认的关闭了浏览器Cookie就销毁了

  • 持久级别的Cookie:需要设置有效时长,关闭浏览器也不会销毁的Cookie

    • setMaxAge(int expiry):
      以秒为单位的时间,超过了该时间后Cookie会自动销毁
    • setMaxAge(0):
      手动删除持久性的Cookie。(前提path和那么必须一致)
    • setPath(Stirng uri):
      设置Cookie的有效路径
      例如:
      1)cookie.setPath("/JavaEEDemo/learn/demo");
      表示JavaEEDemo项目下,learn目录下的所有servlet,都可以访问当前cookie
      “/learn"或”/learn/aaa"将不能访问
      2)cookie.setPath("/JavaEEDemo");
      表示JavaEEDemo项目下的所有servlet都可以访问当前cookie
      3)cookie.setPath("/");
      表示tomcat下的所有web项目,都可以访问当前cookie
  • cookie的唯一表示:

    • 唯一表示:domain + path + name (类似Java中 包 + 类名)
    • domain 域名,不同的网站使用的是不同的域名,cookie就不同
    • path 路径,通过cookie.setPath()设置的内容
    • name cookie的名称,通过 new Cookie(name,…)确定的内容
    • 例如:以下表示的是两个Cookie,可以同时存在
      1)/web/a/b/cookieName
      2)/web/acookieName
    • 如果路径和名称一样,两个addCookie()后者将覆盖前者。

Cookie的API

在这里插入图片描述

转载地址:http://ensqb.baihongyu.com/

你可能感兴趣的文章
共享软件中注册部分的简单实现(转)
查看>>
RedHat Linux 9下所有权和许可权限(转)
查看>>
C++程序设计从零开始之语句(转)
查看>>
利用Apache+PHP3+MySQL建立数据库驱动的动态网站(转)
查看>>
C#中实现DataGrid双向排序(转)
查看>>
利用C语言小程序来解决大问题(转)
查看>>
简单方法在C#中取得汉字的拼音的首字母(转)
查看>>
编程秘籍:使C语言高效的四大绝招(转)
查看>>
计算机加锁 把U盘变成打开电脑的钥匙(转)
查看>>
Fedora Core 4 基础教程 (上传完毕)(转)
查看>>
删除MSSQL危险存储过程的代码(转)
查看>>
红旗软件:树立国际的Linux品牌(转)
查看>>
Linux学习要点(转)
查看>>
影响mysqld安全的几个选项(转)
查看>>
最新版本Linux Flash 9 Beta开放发布(转)
查看>>
mysql事务处理(转)
查看>>
Fedora 显示设备配置工具介绍(转)
查看>>
FREEBSD 升级及优化全攻略(转)
查看>>
系统移民须知:Linux操作系统安装要点(转)
查看>>
在redhat系统中使用LVM(转)
查看>>