因为http协议是无状态的,也就是说每个客户端访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术识别客户端状态。会话技术是帮助服务器记住客户端状态的。

一次会话的开始是通过浏览器访问某个站点,结束是关闭这个浏览器的过程。会话技术就是记录这次会话中客户端的状态哦与数据的。会话技术分为两种,分别是cookie和session。

  1. cookie:数据存储到客户端本地,减少了服务器的存储压力,但安全性不好,客户端可以手动清除cookie
  2. session:将数据存储到服务器,安全性相对较好,但与此同时增加了服务器自身的压力。

创建cookie:Cookie cookie = new Cookie("username","lisi");

将cookie发送到浏览器:response.addCookie(cookie);

cookie没有无参构造方法,且参数不能是中文。参数类型都是String,第一次设置cookie请求中不能看到,以后可以看到已设置的cookie,只要浏览器不关闭cookie依旧存在。

为cookie设置持久化时间:cookie信息在硬盘上保留的时间

cookie.setMaxAge(int seconds);例如:cookie.setMaxAge(10*60);设置时间为10分钟。

为cookie设置携带的路径:cookie.setPath("/web/sendCookie");当访问sendCookie 时才携带这个cookie。Cookie.setPath("/");访问服务器下的所有资源都携带这个cookie。

创建并发送cookie
//1.创建cookie对象
Cookie cookie=new Cookie("name","tian"); //2.携带这个cookie的资源路径
cookie.setPath("/cookie&session/sendServlet"); //3.设置cookie对象持久化时间1分钟
cookie.setMaxAge(60); //4,将cookie信息增加到客户端
response.addCookie(cookie);//name:"tian"

注意:如果不设置携带路径那么这个cookie信息会在访问产生该cookie的web 资源所在的路径都携带cookie信息。

删除客户端携带的cookie:

如果想删除客户端已存储的cookie信息那么就使用同名同路径的持久化时间为0的cookie进行覆盖即可。

删除指定的cookie

//1.找到同名的这个cookie,值可以不填
Cookie cookie=newCookie("name","");
//2.找到同路径下的cookie
cookie.setPath("/web/sendCookie/");
//3.将持久化时间设置0,删除成功
cookie.setMaxAge(0);

用cookie提示客户端上次访问的时间

在此遇到了一个异常:

java.lang.IllegalArgumentException: An invalid character [32] was present in the Cookie value

在Tomcat9.0运行出现的异常,解决方法:

Date date=new Date();

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd-hh:mm:ss");

中间()内的时间格式不能含有空格,将空格去掉就行。

response.setContentType("text/html;charset=UTF-8");
Datedate=new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd-hh:mm:ss");
String lastTime = format.format(date); //1.第一次访问创建cookie
Cookie cookie=new Cookie("lastAccessTime",lastTime);
cookie.setMaxAge(60*100);//100minutes
response.addCookie(cookie);//添加到客户端 //2,要找到这个cookie并判断他的值是否为空,若为空显示这是第一次访问,若不为空显示上次访问时间
Cookie[] cookies = request.getCookies();
String lastAccessTime = null;
if(cookies!=null){
for(Cookie coo : cookies){
if(coo.getName().equals("lastAccessTime")){
lastAccessTime=coo.getValue();
}
}
} if(lastAccessTime!=null){
//不是第一次访问
response.getWriter().write("您上次访问的时间是:"+lastAccessTime);
}else{
response.getWriter().write("您是第一次访问这个页面!");
}

Session技术是将数据存储在服务器端的技术,会为每个客户端都创建一块内存空间    存储客户的数据,但客户端需要每次都携带一个标识ID去服务器中寻找属于自己的内   存空间。所以说Session的实现是基于Cookie,Session需要借助于Cookie存储客    户的唯一性标识JSESSIONID。

1. 获得Session对象

    HttpSession session = request.getSession();

此方法会获得专属于当前会话的Session对象,如果服务器端没有该会话的Session    对象会创建一个新的Session返回,如果已经有了属于该会话的Session直接将已有    的Session返回(实质就是根据JSESSIONID判断该客户端是否在服务器上已经存在    session了)

  2. 怎样向session中存取数据(session也是一个域对象)

Session也是存储数据的区域对象,所以session对象也具有如下三个方法:

  1. session.setAttribute(String name,Object obj);
  2. session.getAttribute(String name);
  3. session.removeAttribute(String name);

3.Session对象的生命周期

创建:第一次执行request.getSession()时创建

销毁:

  1. 服务器(非正常)关闭时
  2. session过期/失效(默认30分钟)
  3. 手动销毁session  session.invalidate();

问题:时间的起算点 从何时开始计算30分钟?

从不操作服务器端的资源开始计时,如果中间时间进行了操作那么就要重新计时

可以在工程的web.xml中进行配置

<session-config>

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

</session-config>

session.invalidate();

作用范围:

默认在一次会话中,也就是说在,一次会话中任何资源公用一个session对象

session的持久化,例如当我们创建一个servlet1,在servlet1中新见一个session,设置属性名和对应的值

session.setAttribute("name","jerry");
再建一个servlet2,在2中获取这个session对应的name值Jerry,当然是先访问1再访问2,当关闭浏览器时,再次打开访问2,得到的数据是null,因为session是基于cookie的,每次创建一个session会话,会得到一个jsessionid,客户端拿着这个id去找对应的session内存区域,但存储JSESSIONID的这个cookie默认是会话级别并没有设置持久化,所以当我们再次访问2的时候没有找到session内存区域,得到name对应的值是null,因此想要关闭浏览器后再次打开访问2得到值,可以将session持久化,方式如下:
@WebServlet("/sessionServlet1")
public class sessionServlet1 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 { HttpSession session = request.getSession();
String id = session.getId();
//将session持久化
Cookie cookie = new Cookie("JSESSIONID",id);
cookie.setPath("/cookie&session/");
cookie.setMaxAge(60*10);//设置时间10分钟
response.addCookie(cookie); response.getWriter().println(id);
session.setAttribute("name","jerry"); }
} @WebServlet("/sessionServlet2")
public class sessionServlet2 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 {
HttpSession session = request.getSession();
String name = (String) session.getAttribute("name");
response.getWriter().println("name: "+name); }
}

cookie和session会话技术的更多相关文章

  1. Cookie与Session会话技术

    Cookie与Session会话技术 一.什么是会话 会话:当用户打开浏览器,访问多个WEB资源,然后关闭浏览器的过程,称之为一个会话,选项卡,弹出页面都属于这个会话,且共享同一个session. 二 ...

  2. Java开发系列-Cookie与Session会话技术

    概述 会话技术:当用户打开浏览器的时候,访问不同的资源,直到用户将浏览器关闭,可以认为这是一次会话.会话技术产生是由于Http请求是一个无状态的协议,它不会记录上次访问的内容,用户在访过程中难免产生一 ...

  3. 6.19-response(响应),session(会话技术,服务器端技术) 内置对象,application(内置对象),pageContext (内置对象),cookie(客户端技术)

    一.response(响应) 页面重定向 response.sendRedirect(""); 转发: request.getRequestDispatcher("&qu ...

  4. java web Session会话技术(原理图解+功能+与Cookie的区别+基本使用)

    java web Session会话技术(原理图解+功能+与Cookie的区别+基本使用) 这是我关于会话技术的第二篇文章,对 Cookie有不了解的兄弟可以点击下方的Cookie跳转 Cookie链 ...

  5. SESSION会话技术

    以下对session会话技术详解: 要了解点http协议理解更佳--->http请求头和http相应头 在session_start的时候,浏览器会向服务器发出请求 在请求的同时,如果是第一次a ...

  6. 16)用了session会话技术

    为什么用session会话技术? 因为假如你进入后台,不可能随意进入,即使你的验证通过了,那么还需要一个变量来存一个标志,假如标志的值是yes,那么我们可以直接进入后台的首页,无需验证,但是,标志是n ...

  7. Cookie&Session会话技术

    一.会话技术简介 1.存储客户端的状态 由一个问题引出今天的内容,例如网站的购物系统,用户将购买的商品信息存储到哪里?因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并不知道该客 ...

  8. springbootDay03 cookie和session 购物车技术

    一.会话技术 1. 什么是会话 在计算机术语中,会话指的是客户端和服务器交互通讯的过程.简单的理解,大家可以看成是两个普通的人在打电话.一次电话从通话开始到挂断,可以看成是会话. 会话的特征 会话能够 ...

  9. java 浅谈web系统当中的cookie和session会话机制

    一 Cookie: 1. Cookie翻译为小甜饼,有一种特殊的味道.cookie主要用来在(浏览器)客户端做记号用的.Cookie不属于java,Cookie是一种通用的机制,属于HTTP协议的一部 ...

随机推荐

  1. 图论补档——KM算法+稳定婚姻问题

    突然发现考前复习图论的时候直接把 KM 和 稳定婚姻 给跳了--emmm 结果现在刷训练指南就疯狂补档.QAQ. KM算法--二分图最大带权匹配 提出问题 (不严谨定义,理解即可) 二分图 定义:将点 ...

  2. 题解-CF1437E Make It Increasing

    题面 CF1437E Make It Increasing 给 \(n\) 个数 \(a_i\),固定 \(k\) 个下标 \(b_i\),求只修改不在 \(b_i\) 中的下标的值使 \(a_i\) ...

  3. Acwing 405. 将他们分好队

    大型补档计划 题目链接 看到分成两组,想到二分图判定 + 染色. 二分图的特点是两个有矛盾的点连一条边,考虑在这道题中,如果 \(a, b\) 中有一个人不认识对方(或者两个人互不认识),就不可能分在 ...

  4. SP7022 CPATTERN - Cow Patterns

    本篇题解用于作者本人加深理解,也欢迎大家阅读. 这道题的正解是\(KMP\)加上树状数组,记录每一个位置前几个位置比其小的.相等的.大的数的数量,比较方式便是比较相应的数量,若相等,则匹配成功. 但是 ...

  5. 计算机语言与JAVA的发展

    计算机语言与JAVA的发展 第一代语言 2进制 第二代语言 汇编语言 解决人类无法读懂的问题 指令替代二进制 目前应用 逆向工程 机器人 病毒 第三代语言 摩尔定律 性能提升愈来愈慢 高级语言 面向过 ...

  6. Jmeter(7)参数化csv data set config

    接口测试同一变量或同一组变量不同值时,可通过csv data set config配置数据 1.创建文本文件,写入参数值,一个或一组值为一行,保存为.csv文件 2.创建测试计划,配置元件添加csv ...

  7. Java8的Lambda表达式,你会不?

    目录 理解Lambda 基础语法 函数式接口 常用的函数式接口 消费型接口 供给型接口 断言型接口 函数型接口 方法引用 数组引用 构造器引用 总结 参考阅读 理解Lambda Lambda表达式可以 ...

  8. Vue3源码解析(computed-计算属性)

    作者:秦志英 前言 上一篇文章中我们分析了Vue3响应式的整个流程,本篇文章我们将分析Vue3中的computed计算属性是如何实现的. 在Vue2中我们已经对计算属性了解的很清楚了,在Vue3中提供 ...

  9. curl使用技巧汇总

    1,curl 忽略证书安全验证 curl https://192.168.1.5:8443-insecure -I

  10. Java_day_01

    一.方法的定义 方法的定义在Java中可以使用多种方式,如果在定义的方法名前面加上 public static 关键字,即可直接在主方法(main)中调用 public class Method{ p ...