本文源码:GitHub·点这里 || GitEE·点这里

一、会话跟踪

1、场景描述

比如登录某个购物网站,身份识别成功后,在网站下单,支付 等操作,这些操作中当前登录用户信息必须是共享的,这样这些操作结果才能和登录用户做关联。

2、概念简介

可以把会话理解为客户端与服务器之间的一次交互,在一次交互中可能会包含多次请求和响应。在JavaWeb中,从客户端向服务器发出第一个请求开始,会话就开始了,直到客户端关闭浏览器会话结束。在一个会话的多个请求中共享数据,这就是会话跟踪技术。

二、Cookie用法详解

1、Cookie简介

Cookie在HTTP中通常是用来辨别用户身份,进行会话跟踪而储存在用户本地终端上的数据,一般会加密处理,由用户客户端计算机暂时或永久保存的信息。其结构就是一个键和一个值构成的。随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器。

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

2、Cookie用法

  • 创建Cookie

JavaWeb中,可以基于Servlet创建Cookie,并设置属性。

public class CookieServletOne extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
// 创建Cookie
Cookie cookie = new Cookie("author","cicada");
// 设置生命周期 1小时
cookie.setMaxAge(60*60);
response.addCookie(cookie) ;
response.getWriter().print("Hello:Cookie");
}
}

访问:http://localhost:6002/cookieServletOne

查看响应头:

Response Header
Set-Cookie: author=cicada; Max-Age=3600;

这样,服务器创建的Cookie在客户端就拿到了。

  • 获取Cookie
public class CookieServletOne extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("doPost...");
Cookie[] cookies = request.getCookies() ;
for (Cookie cookie:cookies){
System.out.println("Name:"+cookie.getName());
System.out.println("Value:"+cookie.getValue());
}
response.setContentType("text/html;charset=utf-8");
String userName = request.getParameter("userName") ;
response.getWriter().print("Hello:"+userName);
}
}

通过测试,控制台输出:Name:author;Value:cicada

  • 更新Cookie

更新就是指Cookie的覆盖,如果服务器端发送重复的Cookie那么会覆盖原有的Cookie。

public class CookieServletTwo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
// 创建Cookie
Cookie cookie = new Cookie("author","smile");
// 设置生命周期 2小时
cookie.setMaxAge(60*60*2);
response.addCookie(cookie) ;
response.getWriter().print("Hello:Cookie");
}
}

可以通过上面方法测试Cookie的获取结果。

  • 删除Cookie

cookie.setMaxAge(0):生命等于0是一个特殊的值,它表示cookie被作废。

public class CookieServletTwo extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
Cookie[] cookies = request.getCookies() ;
for (Cookie cookie:cookies){
if (cookie.getName().equals("author")){
cookie.setMaxAge(0);
response.addCookie(cookie);
}
}
String userName = request.getParameter("userName") ;
response.getWriter().print("Hello:"+userName);
}
}

这样再测试Cookie的获取方法,发现上面删除的Cookie就没有了。

3、Cookie相关API

  • setMaxAge()

设置 cookie 过期的时间,秒为单位。默认情况cookie 只会在当前 session 会话中有效。

  • getMaxAge()

获取 cookie 的最大生存周期。

  • getName()

获取 cookie 的名称。名称在创建后不能改变。

  • getValue()

获取与 cookie 关联的值。

  • setValue(String value)

设置与cookie关联的value值。相同的name多次设置会覆盖。

三、Session 跟踪

1、Session简介

会话管理,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。Servlet中可以把一个会话内需要共享的数据保存到HttSession对象中。四大域对象:PageContext、ServletRequest、HttpSession、ServletContext。

2、Session运行原理

  • 首次使用

首次使用session时,服务器端要创建session,session是保存在服务器端,数据是保存在session中,sessionId通过Cookie发送给客户端,且只在浏览器本次会话中存在,也就是说如果用户关闭了浏览器,那么这个Cookie就丢失。

  • 客户端访问

客户端再次访问服务器时,在请求中会带上sessionId,服务器会通过sessionId找到对应的session,而无需再创建新的session。

  • 时效性

当一个session长时间没人使用的话,服务器会把session删除了,这个时长在Tomcat中配置是30分钟,可以在${CATALANA}/conf/web.xml找到这个配置,也可以在的web.xml中覆盖这个配置!

<session-config>
<session-timeout>30</session-timeout>
</session-config>

3、相关API用法

  • getSesssion()

当前会话已经存在session对象那么直接返回,如果当前会话还不存在,创建session对象并返回 。

  • getAttribute(String name)

返回该 session 会话中具有指定名称的对象 。

  • getId()

分配给该 session 会话的唯一标识符的字符串。

  • setAttribute(String name,Object value)

使用指定的名称绑定一个对象到该 session 会话。

  • removeAttribute(String name)

从该 session 会话移除指定名称的对象。

4、应用案例

在网站中,经常可见的一个功能就是上次登录时间,这个功能基于Session可以很便捷的实现。

public class SessionServletOne extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
HttpSession session = request.getSession(true) ;
Date createTime = new Date(session.getCreationTime());
Date lastAccessTime = new Date(session.getLastAccessedTime());
session.setAttribute("author","cicada");
response.getWriter().print(
"SessionId:" + session.getId() + "<br/>"+
"User Author:" + session.getAttribute("author")+"<br/>"+
"Create Time:" + dateFormat.format(createTime)+"<br/>"+
"Last Access Time:"+dateFormat.format(lastAccessTime));
}
}

访问http://localhost:6002/sessionServletOne

页面打印,多次访问,查看效果。

SessionId:40C12C367CBFA7469D57E72C5C091300
User Author:cicada
Create Time:2019-12-14 15:34:10
Last Access Time:2019-12-14 15:35:13

四、源代码地址

GitHub·地址
https://github.com/cicadasmile/java-base-parent
GitEE·地址
https://gitee.com/cicadasmile/java-base-parent

JavaEE基础(04):会话跟踪技术,Session和Cookie详解的更多相关文章

  1. Session和Cookie详解(1)

    面试常问的有关session和cookie的问题: 1.session在分布式环境下怎么解决 2.集群下如何保证session踩中 3.cookie的大小 4.服务器怎么识别一个用户的 5.sessi ...

  2. 【转】session和cookie详解

    会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...

  3. session及cookie详解(七)

    前言 文章说明 在每整理一个技术点的时候,都要清楚,为什么去记录它.是为了工作上项目的需要?还是为了搭建技术基石,为学习更高深的技术做铺垫? 让每一篇文章都不是泛泛而谈,复制粘贴,都有它对自己技术提升 ...

  4. 会话跟踪技术——Session

    一.什么是Session Session从用户访问页面开始,到断开与网站连接为止,形成一个会话的生命周期.在会话期间,分配客户唯一的一个SessionID,用来标识当前用户,与其他用户进行区分. Se ...

  5. session和cookie详解2

    http 之session和cookie http://www.cnblogs.com/ForEverKissing/archive/2008/05/23/1205503.html Session简介 ...

  6. session与cookie详解

    session与cookie是什么? session与cookie属于一种会话控制技术.常用在身份识别,登录验证,数据传输等.举个例子,就像我们去超市买东西结账的时候,我们要拿出我们的会员卡才会获取优 ...

  7. session和cookie详解

    摘要:虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本质,以至不能正确的应用这一 技术.本文将详细讨论session的工作机制并且对在Java ...

  8. Session、Cookie详解(2)

    session是web开发里一个重要的概念,在大多数web应用里session都是被当做现成的东西,拿来就直接用,但是一些复杂的web应用里能拿来用的session已经满足不了实际的需求,当碰到这样的 ...

  9. 简述会话跟踪技术——Cookie和Session

    简述会话跟踪技术--Cookie和Session 本篇文章将会简单介绍Cookie和Session的概念和用法 会话跟踪技术 首先我们需要搞清楚会话和会话跟踪的概念: 会话:用户打开浏览器,访问Web ...

随机推荐

  1. IDEA中WEB项目本地调试和发布的配置分开配置

    一个Web项目,开发的时候设置了一些本地内容,比如IP地址,还有本地目录等.开发完成后,要发布到服务器上时,这些本地相关的配置,就需要配置成服务器上IP或目录. 原先的做法就是部署打包的时候,把相关的 ...

  2. SqlServer2005 查询 第六讲 null

    今天们来讲sql命令中的这个null参数 null null: 可以理解成[没有值,空值]的意思 注意以下几点 --1.零和null是不一样的,null表示空值,而零表示的一个确定的值 --2.nul ...

  3. 微信web协议,群成员唯一uin,获取群成员唯一标识

    群成员唯一标识获取接口 全网最新,支持调试测试.觉得OK再付款! 800元出售源码 不讲价 联系QQ:2052404477

  4. pat 1006 Sign In and Sign Out(25 分)

    1006 Sign In and Sign Out(25 分) At the beginning of every day, the first person who signs in the com ...

  5. hdu 2554 最短路 (dijkstra)

    最短路Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...

  6. shell——数组

    默认从0开始索引:也可以单独(像字典一样)pid[35420]=httpd -k ssl, 只能是一维的 bash4.0增加了关联数组 数组赋值: declare -a myarray声明数组 一次一 ...

  7. GitHub上优秀的开源项目(转载)

    转载出处:https://github.com/Trinea/android-open-project 第一部分 个性化控件(View) 主要介绍那些不错个性化的 View,包括 ListView.A ...

  8. pdf 在线预览之 pdfobject插件

    支持到ie9 可以不用安装  如果安装 npm i pdfobject 第一步:引入pdfObject包 申明一个变量 const { PDFObject } = require("../. ...

  9. pycham永久激活及conda环境部署

    1.pycham安装 一般不选择最新版本,我用的是2018.3,选择 Professional专业版 1.1 官网地址: https://www.jetbrains.com/pycharm/downl ...

  10. 打算写一个《重学Node.js》系列,希望大家多多支持

    先放上链接吧,项目已经开始2周了:https://github.com/hellozhangran/happy-egg-server 想法 现在是2019年11月24日,还有人要开始学习Node.js ...