Cookie&Session-授课
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-授课的更多相关文章
- cookie,session,sessionid
cookie,session,sessionid http协议是无状态的,意思是每次请求的状态不会保存.因此,产生了cookie,session之类保存会话状态的机制.1.什么是cookiecooki ...
- Servlet学习笔记(1)--第一个servlet&&三种状态对象(cookie,session,application)&&Servlet的生命周期
servlet的404错误困扰了两天,各种方法都试过了,翻书逛论坛终于把问题解决了,写此博客来纪念自己的第一个servlet经历. 下面我会将自己的编写第一个servlet的详细过程提供给初学者,大神 ...
- 在IE浏览器中iframe跨域访问cookie/session丢失的解决办法
单点登录需要在需要进入的子系统B中添加一个类,用于接收A系统传过来的参数: @Action(value = "outerLogin", results = { @Result(na ...
- 会话Cookie及session的关系(Cookie & Session)
会话Cookie及session的关系(Cookie & Session) 在通常的使用中,我们只知道session信息是存放在服务器端,而cookie是存放在客户端.但服务器如何使用sess ...
- cookie,session,token的定义及区别
参考了很多文章总结的. 1.cookie(储存在用户本地终端上的数据) 服务器生成,发送给浏览器,浏览器保存,下次请求同一网站再发送给服务器. 2.session(会话) a.代表服务器与浏览器的一次 ...
- Java web学习 Cookie&&Session
cookie&&session 会话技术 从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话.会 话技术就是记录这次会话中客户端的状态与数据的. 会话技术分为Coo ...
- Cookie&Session(会话技术)
一.Cookie技术 从打开一个游览器访问某个站点,到关闭这个游览器的整个过程成为一次会话 会话技术分为Cookie和Session Cookie:数据存储在客服端本地,减少对服务端的存储的压力,安全 ...
- Cookie Session和自定义分页
cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...
- python Cookie Session 相关用法
Cookie一.前言1.http协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响 应情况直接影响,也不会直接影响后面的请 ...
- django - 总结 - cookie|session
Cookie是通过HTTP请求和响应头在客户端和服务器端传递的. 在Web开发中,使用session来完成会话跟踪,session底层依赖Cookie技术. --------------------- ...
随机推荐
- certutil绕过
一般进内网过后我都会使用certutil下载文件,但在最近打一台内网机子的时候出现了certutil拒绝访问的情况,在本地搭建了一个环境尝试绕过certutil下载文件. 安装杀软更新到最新版本,开启 ...
- Python基础之告警定义与告警抑制
技术背景 在前面一篇博客中我们介绍了在python中自定义异常以及异常的捕获.这里我们要介绍另外一种形式的用户提醒:告警.我们这里就不给出一些过于官方或者技术的定义了,在实际项目中的使用场景主要有这么 ...
- PAT (Advanced Level) Practice 1008 Elevator (20 分) 凌宸1642
PAT (Advanced Level) Practice 1008 Elevator (20 分) 凌宸1642 题目描述: The highest building in our city has ...
- NameError: name 'foo' is not defined Python常见错误
1.变量或者函数名拼写错误 2.在一个定义新变量中使用增值操作符 没有定义的变量被引用时候会出现此错误
- java面试-JVM调优和参数配置,如何查看JVM系统参数默认值
一.JVM的参数类型: 1.标配参数: java -version java -help 2.X参数: -Xmixed 混合模式(先编译后执行) -Xint 解释执行 -Xcomp 第一次使用就编译 ...
- 如何获取canvas当前的缩放值
项目中一直有一个问题困扰着我,我们的画布可以缩放平移旋转,支持拖拽生成图形,生成手写笔迹,如果用户选择的线条粗细为5像素,那么即使画布缩放过绘制出的线条粗细也应该是视觉上的5px,所以再绘制时赋值给c ...
- Spring Cloud微服务如何实现熔断降级?
熔断限流概述 在基于Spring Cloud的微服务架构体系下,按照系统功能边界的不同划分,原先大而全的系统会被拆分为多个不同的微服务,而相应的微服务会提供一组功能关联的服务接口,并向系统中的其他微服 ...
- Flowable与springBoot项目整合及出现的问题
Flowable与springBoot项目整合及出现的问题 单纯地将Flowable和springBoot整合,使用mysql作为数据库,整合中踩了两个坑,见文末. 在pom中添加依赖 <?xm ...
- Horovod in Docker
https://horovod.readthedocs.io/en/stable/docker.html Step1 构建镜像 GPU $ mkdir horovod-docker-gpu $ wge ...
- day10.闭包函数与装饰器
一.闭包函数 1.闭函数:被封闭起来的函数==>定义在函数内部的函数,特点是只能在函数内调用 2.包函数:该函数引用了一个名字,该名字来自于E这一层 总结:闭包函数指的是定义在函数内部的函数引用 ...