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. restful设计风格

    restful是一种软件设计风格,并不是标准,它只是提供了一组设计原则和约束条件. ① restful 提倡面向资源编程,url接口尽量要使用名词,不要使用动词 ② 在url中可以体现版本号 ③可以根 ...

  2. 学习C#第一天

    学习C#第一天 先是了解了VS 2019编辑器的基本使用 安装Visual Studio https://mp.weixin.qq.com/s?__biz=MzU0MTg5NDkzNA==&m ...

  3. 第四单元总结&期末总结

    OO第四单元总结&期末总结 一.第四单元总结 第一次作业 在第四单元的作业中,我的架构是逐步演进的.设计第一次作业的架构时并没有考虑到后续作业会增加新的图,所以直接把类图的实现放在UmlInt ...

  4. 学习笔记-cordova 限制app横屏

    禁止手机app横竖屏幕转换,只需在根目录下的 config.xml 中添加如下内容 <preference name="orientation" value="po ...

  5. java正则匹配${xxx} 排除单引号双引号内的内容,前提引号必须成对出现

    public static void main(String[] a) { String wpp = "select 1, ${mark} '``this is, `/message22` ...

  6. Class类文件结构--访问标志

    访问标志的位置:在常量池结束之后的两个字节(16位)表示访问标志access_flags. 访问标志的作用:用于标识类或者接口层次的访问信息:比如该Class是类还是接口,是否为public类型.是否 ...

  7. 带你全面认识CMMI V2.0(五)——改进

    改进(Improving)涉及开发.管理和改进过程及其相关资产,其主要重点是提高组织绩效.保持习惯和持久性可确保过程在整个组织中是持久.习惯性地执行和维持,并有助于有效地实现业务绩效目标.治理(GOV ...

  8. 蒙特卡洛——使用CDF反函数生成非均匀随机数

    均匀随机数生成   先来说说均匀随机数生成,这是非均匀随机数的生成基础.   例如,我们现在有drand()函数,可以随机生成[0,1]范围内的均匀随机数. 要求一个drand2()函数,能够生成[0 ...

  9. python基础(补充):python三大器之装饰器

    函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. 我们来实现一个可变参数的求和.通常情况下,求和的函数是这样定义的: def calc_sum(*args): i = ...

  10. 源码编译安装MySQL8.0.20

    1 概述 本文章主要讲述了如何从源码编译安装MySQL社区版8.0.20,首先会介绍一些编译安装的相关知识,然后开始编译安装 2 源码编译安装的相关知识 2.1 make与configure make ...