后台(13)——Cookie

简介: 探索Android软键盘的疑难杂症 深入探讨Android异步精髓Handler 详解Android主流框架不可或缺的基石 站在源码的肩膀上全解Scroller工作机制Android多分...

探索Android软键盘的疑难杂症
深入探讨Android异步精髓Handler
详解Android主流框架不可或缺的基石
站在源码的肩膀上全解Scroller工作机制


Android多分辨率适配框架(1)— 核心基础
Android多分辨率适配框架(2)— 原理剖析
Android多分辨率适配框架(3)— 使用指南


自定义View系列教程00–推翻自己和过往,重学自定义View
自定义View系列教程01–常用工具介绍
自定义View系列教程02–onMeasure源码详尽分析
自定义View系列教程03–onLayout源码详尽分析
自定义View系列教程04–Draw源码分析及其实践
自定义View系列教程05–示例分析
自定义View系列教程06–详解View的Touch事件处理
自定义View系列教程07–详解ViewGroup分发Touch事件
自定义View系列教程08–滑动冲突的产生及其处理


版权声明


在之前学习HTTP时我们说:标准HTTP协议既有优点也有缺点,优点在于极大地减轻了服务器的压力,每一次请求不会造成不必要连接占用;缺点在于繁复地建立连接和断开连接,请求会传输大量重复的信息,所以随后出现了Keep-Alive、Cookie、HttpSession在某些程度上弥补了标准HTTP的缺点。从今天起,我们就开始学习Cookie和HttpSession

会话

在正式进入Cookie和HttpSession的学习之前,我们先来了解一个术语:会话。

简单地说:用户打开一个浏览器后点击网页中的多个超链接访问多个web资源,访问完毕后关闭浏览器。这个过程就称之为一个会话。在会话过程中会产生一些和用户操作密切相关的数据,所以客户端或者服务端需要为每个用户保存这些数据。例如:用户点击超链接通过一个Servlet购买了几件商品,客户端或者服务端应保存这些商品信息以便于用户点结帐Servlet时,结帐Servlet得到这些已购买的商品信息从而正确地结算。

那么客户端和服务端应该怎么样保存这些用户信息呢?通常地讲,有两种方式:Cookie和HttpSession

  • Cookie

    Cookie属于客户端技术。服务端把每个用户的数据以cookie的形式返回到用户的浏览器的缓存中。当用户使用浏览器再去访问服务器里的web资源时,就会将这些Cookie携带给服务端

  • HttpSession

    Session属于服务器端技术。服务端为每个用户创建一个其独享的HttpSession对象,用户在访问服务器的web资源时可把不同用户的数据放在各自对应的session中

    嗯哼,在了解了关于会话的基础知识之后,我们开始进入Cookie的学习

Cookie简介

Cookie是Servlet发送浏览器的少量信息,这些信息由浏览器保存,当浏览器访问Web资源时再将其发送回服务器。一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和值(VALUE)并且名称和值都是String类型的;除此以外,它还有一些其它信息:比如注释、路径和域限定符、最大生存时间maxAge和版本号。Cookie的值可以唯一地标识客户端,因此Cookie常用于会话管理。

Servlet可通过httpServletResponse.addCookie()将字段添加到HTTP 响应头以便将Cookie发送到浏览器。浏览器支持每台Web服务器20个Cookie,合计300个,并且将每个Cookie的大小限定为4KB.

浏览器通过向HTTP请求头添加字段将Cookie返回给Servlet。服务端可用HttpServletRequest.getCookies()从请求中获取Cookie.

一个服务端可以给同一个WEB浏览器发送多个Cookie,此时,如果有两个Cookie的name一样那么后者会覆盖前者。同一个WEB浏览器也可以存储多个不同服务端提供的Cookie。请注意,发送到浏览器的Cookie在默认情况下它是一个会话级别的cookie(即Cookie被存储在浏览器的内存中)当用户退出浏览器之后即被删除。若希望浏览器将该Cookie存储在磁盘上,则需要设置Cookie的maxAge.


Cookie入门示例

请看如下示例:

/**
 * 本文作者:谷哥的小弟
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
package cn.com;

import java.io.IOException;
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 CookieTest1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        Cookie[] cookies = request.getCookies();
        for(int i=0;cookies!=null&&i<cookies.length;i++){
            Cookie cookie=cookies[i];
            System.out.println(cookie.getName()+" "+cookie.getValue());
        }
        if (cookies == null) {
            Cookie c1 = new Cookie("username", "tom");
            Cookie c2 = new Cookie("password", "123456");
            response.addCookie(c1);
            response.addCookie(c2);
        }

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    }

}

代码解析如下:

  • 生成两个Cookie,请参见代码第26-27行
  • 利用response.addCookie()将Cookie返回给客户端,请参见代码第28-29行
  • 利用request.getCookies()获取到浏览器携带至服务端的所有Cookie,请参见代码第20-24行

输出结果:

username tom
password 123456

我们再去浏览器中看看这些Cookie值,在此以谷歌浏览器为例

这里写图片描述

嗯哼,看到了吧,在此展示了Cookie的相关信息。


Cookie应用详解

cookie使用示例

在实际开发中Cookie有许多实用的地方,在此我们实现一个功能:利用Cookie记录上次访问时间

请看如下示例:

/**
 * 本文作者:谷哥的小弟
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
package cn.com;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
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 CookieTest2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String LAST_ACCESS_TIME="time";
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter writer = response.getWriter();
        Cookie[] cookies = request.getCookies();
        for(int i=0;cookies!=null&&i<cookies.length;i++){
            Cookie cookie=cookies[i];
            if(LAST_ACCESS_TIME.equals(cookie.getName())){
                String time = cookie.getValue();
                writer.println("<h4>"+"上次访问时间:"+time+"</h4>");
                System.out.println("time="+time);
            }
        }

        Calendar calendar = Calendar.getInstance();
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH);
        int date = calendar.get(Calendar.DATE);
        int hour = calendar.get(Calendar.HOUR_OF_DAY);
        int minute = calendar.get(Calendar.MINUTE);
        int second = calendar.get(Calendar.SECOND);
        String time = year+"/"+(month+1)+"/"+date+" " +hour+":"+minute+":"+second;

        Cookie cookie = new Cookie(LAST_ACCESS_TIME, time);
        response.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
    }
}

代码解析如下:

  • 得到所有Cookie,请参见代码第27行
  • 从所有Cookie中筛选出上次访问的时间,请参见代码第28-35行
  • 利用Cookie将最新的访问时间返回给浏览器

运行后效果如下图所示:

这里写图片描述

我们再去浏览器中看看这些Cookie值,在此以谷歌浏览器为例

这里写图片描述

cookie的maxAge

请注意,”过期时间:浏览会话结束时”,也就是说当我们结束了本次通话(关闭浏览器)之后这些Cookie就被删除了。这是为什么呢?之前我们也说过了:Cookie在默认情况下是一个会话级别的cookie,它存在于浏览器的内存中,当用户退出浏览器之后即被删除。现在,我们希望在关闭浏览器之后再次打开浏览器时依然可以显示上次登录的时间,这就需要设置Cookie的maxAge将该Cookie存储在磁盘上。打开API我们可以看到方法cookie.setMaxAge(int expiry),默认情况下expiry的值为-1,即关闭浏览器后Cookie被删除。如果设置expiry的值为0则表示立即删除Cookie;如果设置expiry的值为正数则表示将Cookie保存到硬盘中且在expiry秒后失效。

cookie的path

请注意,”路径:/TestCookie01”,这个路径是不是觉得有点眼熟呢?哇哈,它就是我们通过request.getContextPath();获取到的应用上下文路径!所以,默认情况下通过cookie.getPath()获取到Cookie的路径正是应用的上下文路径,当然你也可以cookie.setPath()为Cookie设置path。这个path有啥用呢?我们打开官方文档看看是怎么说这个path的:在为Cookie设置path(即目录)后,Cookie对于该指定目录中的所有页面及该目录子目录中的所有页面都是可见的。哇哈,看到这里可能还是有点懵;嗯哼,我再换个方式说:如果浏览器访问的资源路径(即URI而非URL)如果是以Cookie的path开头的那么浏览器就会将该Cookie携带至服务端;否则不会携带该Cookie。举个例子:比如Cookie的path是/TestCookie01/hello;浏览器访问的是xxxx/TestCookie01/hello/haha/test.html那么浏览器就会将该Cookie携带至服务端;假如浏览器访问的是xxxx/TestCookie01/abcde/ppha/test.html那么浏览器就不会将该Cookie携带至服务端

相关文章
|
4月前
|
存储 安全 关系型数据库
安全开发-PHP应用&留言板功能&超全局变量&数据库操作&第三方插件引用&后台模块&Session&Cookie&Token&身份验证&唯一性
安全开发-PHP应用&留言板功能&超全局变量&数据库操作&第三方插件引用&后台模块&Session&Cookie&Token&身份验证&唯一性
|
数据采集 JavaScript 前端开发
前后台分离使用cookie判断用户状态以及传递参数
在之前学习servlet的时候,当时做的小网站需要登陆并且判断信息,当时使用session传值,使用fitter过滤判断,当时感觉哇,session咋这么好用,cookie是啥玩意,还不方便。
160 0
|
9天前
|
存储 缓存 数据处理
php学习笔记-php会话控制,cookie,session的使用,cookie自动登录和session 图书上传信息添加和修改例子-day07
本文介绍了PHP会话控制及Web常用的预定义变量,包括`$_REQUEST`、`$_SERVER`、`$_COOKIE`和`$_SESSION`的用法和示例。涵盖了cookie的创建、使用、删除以及session的工作原理和使用,并通过图书上传的例子演示了session在实际应用中的使用。
php学习笔记-php会话控制,cookie,session的使用,cookie自动登录和session 图书上传信息添加和修改例子-day07
|
4月前
|
存储 编解码 应用服务中间件
会话跟踪技术(Session 以及Cookie)
会话跟踪技术(Session 以及Cookie)
|
22天前
|
存储 前端开发 Java
JavaWeb基础7——会话技术Cookie&Session
会话技术、Cookie的发送和获取、存活时间、Session钝化与活化、销毁、用户登录注册“记住我”和“验证码”案例
JavaWeb基础7——会话技术Cookie&Session
|
5天前
|
存储 安全 NoSQL
Cookie、Session、Token 解析
Cookie、Session、Token 解析
16 0
|
10天前
|
存储 JSON 数据安全/隐私保护
Cookie + Session 的时代已经过去了?
在探讨“Cookie + Session”这一经典组合是否已经过时的议题时,我们首先需要理解它们在Web应用认证和会话管理中的历史地位与当前面临的挑战。随着Web技术的飞速发展,特别是无状态服务、OAuth、JWT(JSON Web Tokens)等技术的兴起,这一传统机制确实面临了前所未有的变革压力。但说它“完全过去”或许过于绝对,因为它在特定场景下仍发挥着重要作用。
21 0
|
2月前
|
存储 JavaScript 前端开发
Cookie 反制策略详解:Cookie加解密原理、Cookie和Session机制、Cookie hook、acw_sc__v2、jsl Cookie调试、重定向Cookie
Cookie 反制策略详解:Cookie加解密原理、Cookie和Session机制、Cookie hook、acw_sc__v2、jsl Cookie调试、重定向Cookie
72 1
|
2月前
|
存储 安全 搜索推荐
【JavaWeb 秘籍】Cookie vs Session:揭秘 Web 会话管理的奥秘与实战指南!
【8月更文挑战第24天】本文以问答形式深入探讨了Web开发中关键的会话管理技术——Cookie与Session。首先解释了两者的基本概念及工作原理,随后对比分析了它们在存储位置、安全性及容量上的差异。接着,通过示例代码详细介绍了如何在JavaWeb环境中实现Cookie与Session的操作,包括创建与读取过程。最后,针对不同应用场景提供了选择使用Cookie或Session的指导建议,并提出了保障二者安全性的措施。阅读本文可帮助开发者更好地理解并应用这两种技术。
39 1
|
2月前
|
存储 安全 搜索推荐
深入探讨Session和Cookie的概念、用途以及如何在Java Web开发中有效地使用它们进行用户状态管理。
在Java Web开发中,Session和Cookie是管理用户状态的核心技术。Session存储于服务器端,通过唯一的Session ID识别用户,确保数据安全与隐私;Cookie则存储于客户端,用于记录用户偏好等信息。两者各有优势:Session适合存储敏感数据,但需合理管理避免资源浪费;Cookie便于持久化存储,但在安全性上需谨慎设置。开发者可通过Servlet API轻松操作二者,实现个性化用户体验与应用性能优化。
37 2