1 会话技术

1.1 会话管理概述

1.1.1 什么是会话

会话:浏览器和服务器之间的多次请求和响应

为了实现一些功能,浏览器和服务器之间可能会产生多次的请求和响应,从浏览器访问服务器开始,到访问服务器结束(关闭浏览器,到了过期时间)。这期间产生的多次请求和响应加在一起就称之为浏览器和服务器的一次会话。

会话中产生的一些数据,可以通过会话技术(Cookie和Session)保存

Cookie介绍

  把要共享的数据保存到客户端

  每次请求时,把会话信息带到服务器端,从而实现多次请求的数据共享!

作用:可以保存客户端访问网站的相关内容,从而保证每次访问时先从本地缓存中获取,以此提高效率

Cookie属性

属性名称 属性作用 是否重要
name cookie的名称 必要属性
value cookie的值(不能是中文) 必要属性
path cookie的路径 重要
domain cookie的域名 重要
maxAge cookie的生存时间。 重要
version cookie的版本号。 不重要
comment cookie的说明。 不重要

Cookie方法

方法名                                                              作用

Cookie(String namg,String value)            构造方法创建对象

属性对应的set和get方法           赋值和获取值

Cookie添加和获取

添加:HttpSerletResponse

返回值                                   方法名                                                说明 

void           addCookie(Cookie cookie)   向客户端添加Cookie

获取:HttpServletRequest

返回值                                   方法名                                                说明

Cookie[]        getCookies()           获取所有的Cookie

Cookie的使用

需求说明

  通过Cookie记录最后访问时间,并在浏览器上显示出来

最终目的

  掌握Cookie的基本使用,从创建到添加客户端,再到从服务器端获取

实现步骤:

  1.通过响应对象写出一个提示信息

  2.创建Cookie对象,指定name和value

  3.设置Cookie最大存活时间

  4.通过响应对象将Cookie对象添加到客户端

  5.通过请求对象获取Cookie对象

  6.将Cookie对象中的访问时间写出

package com.itheima.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date; /*
* Cookie的使用
* */
@WebServlet("/servletDemo01")
public class ServletDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//  1.通过响应对象写出一个提示信息
resp.setContentType("text/html;charset=utf-8");
PrintWriter pw=resp.getWriter();
pw.write("欢迎访问本网站,您的最后访问时间为:<br>");
//  2.创建Cookie对象,指定name和value
Cookie cookie=new Cookie("time",System.currentTimeMillis()+"");
//  3.设置Cookie最大存活时间
cookie.setMaxAge(3600);//一个小时
//  4.通过响应对象将Cookie对象添加到客户端
resp.addCookie(cookie);
//  5.通过请求对象获取Cookie对象
Cookie[] arr = req.getCookies();
for(Cookie c:arr){
if ("time".equals(c.getName())){
//  6.将Cookie对象中的访问时间写出
String value=c.getValue();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
pw.write(sdf.format(new Date(Long.parseLong(value))));
}
} } @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}

  

细节

数量限制

Cookie有大小,个数限制。每个网站最多只能存20个cookie,且大小不能超过4kb。同时,所有网站的cookie总数不超过300个。

名称限制

Cookie的名称只能包含ASCCI码表中的字母,数字字符。不能包含逗号,分号,空格,不能以$开头

存活时间限制setMaxAge()方法接收数字

负整数:当前会话有效,浏览器关闭则清除

0:立即清除

正整数:以秒为单位设置存活时间

访问路径限制

取自第一次访问的资源路径前缀

只要以这个前缀为开头(包括子级路径)。获取到

反之获取不到

设置路径:setPath()方法设置指定路径

Session

HttpSession介绍

HttpSession:服务器端会话管理技术

本质也是采用客户端会话管理技术

只不过在客户端保存的时一个特殊标识,而共享的数据保存到了服务器端的内存对象中。

每次请求时,会将特殊标识带到服务器端,根据这个标识来找到对应的内存空间,从而实现数据共享!

是Servlet规范中四大域对象之一的会话域对象

作用:可以实现数据共享

域对象                          功能                                 作用

ServletContext          应用域                   在整个应用之间实现数据共享

ServletRequest         请求域                    在当前的请求或请求转发之间实现数据共享

HttpSession               会话域                    在当前会话范围之间实现数据共享

HttpSession常用方法

返回值                               方法名                                    说明

void       setAttribute(String name,Object value)    设置共享数据

Object      getAttribute(String name)          获取共享数据

void        remove(String name)           移除共享数据

String       getId()                获取唯一表标识名称

void        Invalidate()                让session立即失效

HttpSession获取

HttpSession实现类对象是通过HttpServletRequest对象来获取。

返回值                               方法名                                 说明

HttpSession      getSession()    获取HttpSession对象

HttpSession      getSession(boolean create)  获取HttpSession对象,未获取到是否自动创建

服务器端内存空间   【001】

客户端-------getSession()------查看是否携带Jsessionid的值------带了001----根据该值在服务器端查找是否有HttpSession对象

||

   ||       没有

创建新的HttpSession对象  分配唯一标志Jsessionid

客户端-------getSession()------查看是否携带Jsessionid的值

  ||

   ||       没有

创建新的HttpSession对象  分配唯一标志Jsessionid 将唯一标识发送给客户端

HttpSession的使用

需求说明:

  通过第一个Servlet设置共享数据用户名,并在第二个Servlet获取到在显示出来

最终目的:

  掌握HttpSession的基本使用,如何获取和使用

实现步骤:

1.在第一个Servlet中获取请求的用户名

2.获取HttpSession对象

3.将用户名设置到共享数据中

4.在第二个Servlet中获取HttpSession对象

5.获取共享数据用户名

6.将获取到用户名响应给客户端浏览器

servletDemo01

package com.itheima.servlet;

import javax.servlet.ServletException;
import javax.servlet.SessionCookieConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException; /*
*
*Session的基本使用
*
* */
@WebServlet("/servletDemo01")
public class ServletDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取到请求的用户名信息
String username = req.getParameter("username"); //获取到HttpSession的对象
HttpSession session = req.getSession();
System.out.println(session);
System.out.println(session.getId()); //将用户名信息添加到共享数据中
session.setAttribute("username",username); } @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}

  

ServletDemo02

package com.itheima.servlet;

import javax.jws.soap.SOAPBinding;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException; /*
*
*Session的基本使用
*
* */
@WebServlet("/servletDemo02")
public class ServletDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取到HttpSession 对象
HttpSession session = req.getSession(); //获取到共享数据
Object username = session.getAttribute("username");
System.out.println(session);
System.out.println(session.getId()); //将数据响应给浏览器
resp.getWriter().write(username+""); } @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}

 

 

HttpSession的细节

1.3.2 HttpSession的入门案例

1)需求说明

在请求HttpSessionDemo1这个Servlet时,携带用户名信息,并且把信息保存到会话域中,然后从HttpSessionDemo2这个Servlet中获取登录信息。

2)案例目的

通过本案例的讲解,同学们可以清楚的认识到会话域的作用,即多次请求间的数据共享。因为是两次请求,请求域肯定不一样了,所以不能用请求域实现。

最终掌握HttpSession对象的获取和使用。

3)原理分析

HttpSession,它虽然是服务端会话管理技术的对象,但它本质仍是一个Cookie。是一个由服务器自动创建的特殊的Cookie,Cookie的名称就是JSESSIONID,Cookie的值是服务器分配的一个唯一的标识。

当我们使用HttpSession时,浏览器在没有禁用Cookie的情况下,都会把这个Cookie带到服务器端,然后根据唯一标识去查找对应的HttpSession对象,找到了,我们就可以直接使用了。下图就是我们入门案例中,HttpSession分配的唯一标识,同学们可以看到两次请求的JSESSIONID的值是一样的:

HttpSession的细节

浏览器禁用Cookie

方式一:通过提示信息告知用户,大部分网站采用的解决方式。(推荐)

方式二:访问时拼接jsessionid标识,通过encode URL()方法重写地址(了解)

钝化和活化

什么是钝化和活化

  钝化:序列化。把长时间不用,但还不到过期时间的HttpSession进行序列化,写到磁盘上

  活化:相反的状态

什么时候使用持久化

第一种情况:当访问量很大时,服务器会根据getLastAccessTime来进行排序,对长时间不用,但是还没到过期时间的HttpSession进行序列化。

第二种情况:当服务器进行重启的时候,为了保持客户HttpSession中的数据,也要对HttpSession进行序列化

注意

HttpSession的持久化由服务器来负责管理,我们不用关心。

只有实现了序列化接口的类才能被序列化,否则不行。

------------恢复内容结束------------

Cookie&Session-授课的更多相关文章

  1. cookie,session,sessionid

    cookie,session,sessionid http协议是无状态的,意思是每次请求的状态不会保存.因此,产生了cookie,session之类保存会话状态的机制.1.什么是cookiecooki ...

  2. Servlet学习笔记(1)--第一个servlet&&三种状态对象(cookie,session,application)&&Servlet的生命周期

    servlet的404错误困扰了两天,各种方法都试过了,翻书逛论坛终于把问题解决了,写此博客来纪念自己的第一个servlet经历. 下面我会将自己的编写第一个servlet的详细过程提供给初学者,大神 ...

  3. 在IE浏览器中iframe跨域访问cookie/session丢失的解决办法

    单点登录需要在需要进入的子系统B中添加一个类,用于接收A系统传过来的参数: @Action(value = "outerLogin", results = { @Result(na ...

  4. 会话Cookie及session的关系(Cookie & Session)

    会话Cookie及session的关系(Cookie & Session) 在通常的使用中,我们只知道session信息是存放在服务器端,而cookie是存放在客户端.但服务器如何使用sess ...

  5. cookie,session,token的定义及区别

    参考了很多文章总结的. 1.cookie(储存在用户本地终端上的数据) 服务器生成,发送给浏览器,浏览器保存,下次请求同一网站再发送给服务器. 2.session(会话) a.代表服务器与浏览器的一次 ...

  6. Java web学习 Cookie&&Session

    cookie&&session 会话技术 从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话.会 话技术就是记录这次会话中客户端的状态与数据的. 会话技术分为Coo ...

  7. Cookie&Session(会话技术)

    一.Cookie技术 从打开一个游览器访问某个站点,到关闭这个游览器的整个过程成为一次会话 会话技术分为Cookie和Session Cookie:数据存储在客服端本地,减少对服务端的存储的压力,安全 ...

  8. Cookie Session和自定义分页

    cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...

  9. python Cookie Session 相关用法

    Cookie一.前言1.http协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响 应情况直接影响,也不会直接影响后面的请 ...

  10. django - 总结 - cookie|session

    Cookie是通过HTTP请求和响应头在客户端和服务器端传递的. 在Web开发中,使用session来完成会话跟踪,session底层依赖Cookie技术. --------------------- ...

随机推荐

  1. 为什么数据库字段要使用NOT NULL?

    最近刚入职新公司,发现数据库设计有点小问题,数据库字段很多没有NOT NULL,对于强迫症晚期患者来说,简直难以忍受,因此有了这篇文章. 基于目前大部分的开发现状来说,我们都会把字段全部设置成NOT ...

  2. 系统编程-网络-tcp客户端服务器编程模型(续)、连接断开、获取连接状态场景

    相关博文: 系统编程-网络-tcp客户端服务器编程模型.socket.htons.inet_ntop等各API详解.使用telnet测试基本服务器功能 接着该上篇博文,咱们继续,首先,为了内容的完整性 ...

  3. python基础(十七):函数

    在正式讲述函数之前,先给大家说明一点:编写函数就是"面向过程"的方式,编写类就是"面向对象"的方式.你如果不知道这是啥意思,至少别人提到这2个词你应该知道是在干 ...

  4. 阿里妈妈Java后端 社招5面(Offer已拿)

    最近由于个人原因, 由于前面两面的时间过去的有点久了,只能根据记忆大概写些记得问题.   阿里妈妈1面 40mins(2021-02-22) 1. 能简单介绍下自己和自己做的项目吗? 2. 关于项目的 ...

  5. OO 第一单元

    OO第一单元总结 前言 第一单元 OO 作业的主题是求导,从最简单的幂函数求导,到添加三角函数求导,再到最后添加嵌套规则.(对熬夜有了新体验,OO 作业比较适合晚上写,OO 博客也是一样 doge) ...

  6. 记一次metasploitable2内网渗透之2049端口NFS漏洞

    0x01.NFS简介 NFS是基于UDP/IP协议的应用,其实现主要是采用远程过程调用RPC机制,RPC提供了一组与机器.操作系统以及低层传送协议无关的存取远程文件的操作.RPC采用了XDR的支持.X ...

  7. Warm_up(HCTF_2018)

    Warm up 考察知识点: 文件包含漏洞 代码审计 解题步骤 首先我们进来看到了一个滑稽的表情,没啥别的东西,先看看源码 源码中发现有注释 source.php 我们访问source.php,得到代 ...

  8. JavaFX+SpringBoot+验证码功能的小型薪酬管理系统

    2020.07.22更新 1 概述 1.1 简介 一个简单的小型薪酬管理系统,前端JavaFX+后端Spring Boot,功能倒没多少,主要精力放在了UI和前端的一些逻辑上面,后端其实做得很简单. ...

  9. 记一次 .NET 某教育系统API 异常崩溃分析

    一:背景 1. 讲故事 这篇文章起源于 搬砖队大佬 的精彩文章 WinDBg定位asp.net mvc项目异常崩溃源码位置 ,写的非常好,不过美中不足的是通览全文之后,总觉得有那么一点不过瘾,就是没有 ...

  10. 源码篇:ThreadLocal的奇思妙想(万字图文)

    前言 ThreadLocal的文章在网上也有不少,但是看了一些后,理解起来总感觉有绕,而且看了ThreadLocal的源码,无论是线程隔离.类环形数组.弱引用结构等等,实在是太有意思了!我必须也要让大 ...