一、会话跟踪

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中覆盖这个配置!

30

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() + "
"+

"User Author:" + session.getAttribute("author")+"
"+

"Create Time:" + dateFormat.format(createTime)+"
"+

"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

java 会话跟踪技术_JavaEE基础(04):会话跟踪技术,Session和Cookie详解相关推荐

  1. 会话跟踪技术,Session和Cookie详解

    知识的广度来自知识的深度,学习如果不成体系那是多可怕的一件事儿,希望我们在未来的学习道路上坚守初心,不要给自己留下遗憾,以自己喜欢的方式生活,做自己喜欢做的事,宠爱自己,做一个独一无二的自己! 对于文 ...

  2. JavaEE基础(04):会话跟踪技术,Session和Cookie详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.会话跟踪 1.场景描述 比如登录某个购物网站,身份识别成功后,在网站下单,支付 等操作,这些操作中当前登录用户信息必须是共享的,这样这些操 ...

  3. Java基础【之】输出一个菱形(详解)

    Java基础[之]输出一个菱形(详解) 代码示例 <目录:Java渐进式学习> <目录:Java设计模式> <目录:从零手写Tomcat> 代码示例 public ...

  4. 综合模拟试题计算机指南,2018年全国硕士研究生入学统一考试计算机科学与技术学科联考计算机学科专业基础综合历年真题及模拟试题详解...

    2018年全国硕士研究生入学统一考试计算机科学与技术学科联考计算机学科专业基础综合历年真题及模拟试题详解本站小编 辅仁网/2017-06-21 下载地址:http://free.100xuexi.co ...

  5. 从Java程序员进阶到架构师,6大核心技能要领详解

    " java架构师技能将分为如下6大环节:数据结构和算法,Java高级特性,Java web核心,数据库,Java框架与必备工具,系统架构设计. 希望能真正帮助到从程序员进阶到架构师之路的朋 ...

  6. Android基础入门教程——8.3.18 Canvas API详解(Part 3)Matrix和drawBitmapMash

    Android基础入门教程--8.3.18 Canvas API详解(Part 3)Matrix和drawBitmapMash 标签(空格分隔): Android基础入门教程 本节引言: 在Canva ...

  7. Android基础入门教程——2.5.3 AlertDialog(对话框)详解

    Android基础入门教程--2.5.3 AlertDialog(对话框)详解 标签(空格分隔): Android基础入门教程 本节引言: 本节继续给大家带来是显示提示信息的第三个控件AlertDia ...

  8. python 字符串替换_Python基础教程,第四讲,字符串详解

    本节课主要和大家一起学习一下Python中的字符串操作,对字符串的操作在开发工作中的使用频率比较高,所以单独作为一课来讲. 学完此次课程,我能做什么? 学完本次课程后,我们将学会如何创建字符串,以及如 ...

  9. [python opencv 计算机视觉零基础到实战] 四、了解色彩空间及其详解

    一.学习目标 了解什么是色彩空间 了解opencv中色彩空间的转换 目录 [python opencv 计算机视觉零基础到实战] 一.opencv的helloworld [[python opencv ...

最新文章

  1. tensorflow 转张量类型为float_TensorFlow快速入门
  2. 皮一皮:这才是书法的最高境界...
  3. 计算机数字信号原理,计算机网络通信原理数字信号的基带传输.ppt
  4. php url地址 怎么写,php url地址重写
  5. 转-Kafka【第一篇】Kafka集群搭建
  6. 好程序员技术教程分享JavaScript运动框架
  7. python中复选框取消修改_python – 如何在PySide / PyQt中设置“只读复选框”
  8. Linux 进程控制相关函数
  9. 阿里巴巴内部开发手册
  10. 饭团(0):提升效率的开发工具
  11. 阿里云智能开放平台团队何登成:解码云计算的 2B 服务基因 | 问底中国 IT 技术演进...
  12. json日期格式化 java_java_Java Web程序中利用Spring框架返回JSON格式的日期,返回Json时格式化日期Date 第一 - phpStudy...
  13. 计算机网络复习题大全(各种题型)
  14. hbase 预分区_hbase的rowKey设计原则
  15. paip.提升性能------服务器环境及编程语言架构选择
  16. lanswich交换机远程TELNET登录
  17. 阅读笔记-JavaScript学习指南
  18. nsis出错_NSIS错误(NSIS Error)的原因和解决方法总结
  19. c语言链表二路归并排序,链表的二路归并排序 Sort List
  20. 2022电大国家开放大学网上形考任务-简明中国古代史(山东)非免费(非答案)

热门文章

  1. python 数字证书模拟登录_用于生成WebService使用的数字证书及签署证书.python脚本...
  2. airpods pro连接安卓声音小_谁才是最好用的安卓无线耳机,三个方面对比AirPods与荣耀FlyPods...
  3. 推荐一套高效的码字工具
  4. 为什么我们程序员不把软件开发当回事?
  5. 住过一晚两万的ICU后,我还是建议你不要轻易买保险
  6. 给你安利几个牛逼的公众号~
  7. adb实时获取屏幕_实时数仓 | 你需要的是一款合适且强大的OLAP数据库(上)
  8. floyd算法和动态规划
  9. hadoop3伪分布式安装
  10. For each...in / For...in / For...of 的解释与例子