IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> Java之Session&Cookie -> 正文阅读

[网络协议]Java之Session&Cookie

Java之Session&Cookie

1、会话管理

1.1 什么是会话管理?

将浏览器与Web服务器之间多次交互(一次请求与响应)当做一个整体来处理,并且将多次交互所产生的数据(即状态)保存下来。

1.2 为什么使用会话管理?

客户端和服务器之间进行数据通讯遵循的是HTTP协议,而此协议属于无状态协议(一次请求对应一次响应,响应完则断开连接),服务器是无法跟踪客户端请求的,但是某些具体的业务是需要服务器能够识别客户端的,,会话管理相关知识就是解决此问题。


1.3 如何进行状态/会话管理?

  • a)方式一:将状态保存在浏览器端(客户端)
    • 通常使用Cookie技术
  • b)方式二:将状态保存在服务器端
    • 通常使用Session技术

通过Cookie技术可以让服务器给客户端添加一个标示, 响应完之后,客户端之后每次发请求都会带着这个标示,从而能够让服务器识别此客户端,,但是这种方案数据是保存在客户端的,存在被篡改的风险。而Session的出现就是为了安全性的问题, 因为使用Session数据是保存在服务器端,不存在被篡改的可能,但是关闭浏览器session中的所有数据都会被清除。




2、Cookie

2.1 什么是Cookie?

服务器临时存放在浏览器端的少量数据(最大4KB),用于跟踪用户的状态

当浏览器访问服务器时,服务器会将少量数据以set-cookie消息
头的方式发送给浏览器,浏览器会将这些数据保存下来。
当浏览器再次访问服务器时,会捋这些数据以 cookie消息头的方式发送给服务器

2.2 Cookie运作流程

在这里插入图片描述

2.3 如何使用Cookie?

//添加Cookie
Cookie c = new Cookie(String name, String value);
//设置Cookie在客户端存储的时长
c.setMaxAge(60*60*24*30*12*10);//十年之期,后面详细介绍
// 将Cookie下发给客户端浏览器
response.addCookie(c);

2.4 如何使用Cookie?

在servlet中使用Cookie

//获取所有的Cookie
Cookie[] cookies = request.getCookies();//注意:这个方法有可能取出null值
if(cookies != null) {
	//遍历
	for (Cookie cookie : cookies) {
		String name = cookie.getName();
		if("username".equals(name)) {
		//找到了,显示该cookie的值
		out.println(cookie.getValue());
		//获取到的value可以放在页面……
	}
}

在Vue框架中使用Cookie

//得到Cookie里面保存的用户名和密码 ,并显示到页面中
    let cookie = document.cookie;
    //cookie保存形式:username=admin;password=123456
    let cookieArr = cookie.split(";");
    //for of 相当于java中的foreach
    for (let c of cookieArr) {
        let arr = c.split("=");
        let key = arr[0].trim();
        let value = arr[1];
        /*
            判断出用户名和密码把值给到VUE中的变量,由于页面内容和此变量进行了双向绑定
            页面会自动发生改变
         */
        if (key == "username") {//为什么不使用equals比较,因为这是JavaScript的代码,可以直接用==来判断
            v.username = value;
        }
        if (key == "password") {
            v.password = value;
        }
    }

2.5 Cookie的生存时间

  • 默认情况下,浏览器会将cookie保存在内存中,浏览器只要关闭,cookie就会被删除
  • 但可以调用setMaxAge方法来设置cookie的生存时间
    cookie.setMaxAge(int seconds);
    注:
    	1、seconds单位为秒
    	2、当seconds>0,浏览器会将cookie保存在硬盘上,到超过设定的事件,浏览器会将cookie删除
    	3、当seconds<0,浏览器会将cookie保存在内存当中
    	4、当seconds=0,删除cookie
    		比如,要删除一个名称为username的cookie,代码如下:
    		Cookie c = new Cookie("username","");
    		c.setMaxAge(0);
    		response.addCookie(c);
    

2.6 Cookie的编码问题(了解)

  • 什么是cookie的编码问题?
    Cookie只能存放合法的ASCII字符,如果要存放中文,需要将中文转换成合法的ASCII字符的形式。
    
  • 如何处理这个问题?
    在实际开发中,对添加成为cookie的数据统一使用encode方法来编码,然后使用时进行decode解码
    //存入中文时编码
    String URLEncoder.encode(String str, String charset);//这个方法会将中文根据编码转换成%开头的16进制数,这段16进制数是合法的ASCII字符
    //取出时解码
    String URLEncoder.decode(String str, String charset);//将%开头的16进制数根据编码转成原来的数据
    
    具体使用
    	String  city = URLEncoder.encode("北京","utf-8");//转成加上%的16进制,如下图
    	Cookie c = new Cookie("city",city);
    	response.addCookie(c);
    
    在这里插入图片描述
    //servlet,读取浏览器发送过来的cookie
    	Cookie[] cookies = request.getCookies();
    	if(cookies != null) {
    		for (Cookie cookie : cookies) {
    			String name = cookie.getName();
    			String value = URLDecoder.decode(cookie.getValue(),"utf-8");
    			out.println(name+":"+value+"<br/>");
    		}
    	}else {
    		out.println("没有Cookie");
    	}
    
    在这里插入图片描述

2.7 Cookie的路径问题(了解)

  • 什么是Cookie的路径问题?

    当浏览器访问服务器时,会比较请求地址是否与cookie的路径匹配,只有匹配的cookie才会被发送
    如下:
    在哪里添加的cookie,那个cookie就会存在哪个文件夹下。我在webapp>biz01下使用的addCookie.jsp创建了一个cookie,那么这个cookie会被存放在哪呢?
    在这里插入图片描述
    在这里插入图片描述

  • cookie的默认路径

    cookie的默认路径等于添加改cookie的web组件到的路径,比如AddCookieServlet(/day06/addCookie)添加了一个cookie,
    则该cookie的默认路径是“/day06”
    举个实际例子
    例如在day06包下创建一个biz01文件夹,文件夹下新建一个addCookie.jsp
    在这里插入图片描述
    在这里插入图片描述
    部署运行addCookie.jsp后的浏览器中这个添加的cookie信息如下
    在这里插入图片描述

  • cookie路径的匹配规则

    请求地址要么是等于cookie的路径,要么是cookie的子路径,只有符合该条件的cookie,浏览器才会发出去

  • 修改cookie路径

    cookie.setPath(String path);
    在添加cookie的时候使用
    注:path就是路径


2.8 Cookie的限制

  • cookie可以被用户禁止
  • cookie不安全(对于敏感数据,一定要加密)
  • cookie只能保存少量数据(大约4k左右)
  • cookie的数量也有限制(大约是几百个)
  • cookie只能保存字符串




3、Session

3.1 session是什么?

务端为了保存状态而创建的一个特殊的对象
当浏览器访问服务器时,服务器端创建一个特殊的对象(该对象一般称之为 session对象,该对象有一个唯一的id,一般称之为 sessionId)。服务器会将session以 cookie的方式发送给浏览器。当浏览器再次访问服务器时,会将 sessionId发送过来,服务器端可以依据 sessionId找到对应的 session对象。

3.2 如何获取session对象?

Httpsession s = request getsession(boolean flag);
注:
a. Httpsession是一个接口。
b. 如果fag为true:先查看请求当中是否有 sessionid,如果没有,则创建一个 session对象;如果有 sessionId则依据 sessionid查找对应的 session对象,如果找到了,则返回该对象,找不到,则创建一个新的session对象。
c. 如果flag为false:先查看请求当中是否有 sessionid,如果没有,返回null;如果有 sessionid,则依据 sessionid查找对应的 session对象,如果找到了,则返回该对象,找不到,返回null。
在这里插入图片描述


3.3 session对象的常用方法

  • a)session.setAttribute(String name, object obj);绑定数据,以name作为key,以obj作为vaue,将数据存放到了
    一个Map对象里面。

  • b)Object session.getAttribute(String name);依据绑定名获取绑定值,如果绑定值不存在则返回null

  • c)session.removeAttribute(String name);解除绑定


3.4 session超时

  • 什么是session超时?

    服务器会将空闲时间过长的 session对象删除掉。
    注:缺省的超时时间长度一般是30分钟。

  • 如何修改超时时间长度?(一般来说不用改)

    方式一:
    修改web.xml配置文件,(注意这个配置文件一旦修改,所有部署到这个服务器上的项目都会受到影响),如果不想这样可以找到一个单独项目的web.xml文件将添加进去就可以了,这样只有这个项目的session会受影响
    在这里插入图片描述
    在这里插入图片描述
    方式二:
    session.setMaxInactiveInterval(int seconds)
    设置两次请求之间的最大间隔时间,如果超过了该时间,则session对象会被删除


3.5 删除session

session.invalidate();
作用是将session设置为失效,一般在退出效果时使用
会话失效有2种情况:会话超时和主动杀会话
一般在做退出效果时候,推荐主动杀死会话,如果退出时不清会话,用户点击浏览器后退,依然无需登录可以正常访问站点。




4、Cookie和Session的区别

  • Cookie:类似于打孔式的会员卡, 数据保存在客户端

    • 保存时间: 默认保存在浏览器的内存中, 会话结束时浏览器会清除掉, 可以修改成任意时间,如果修改了保存时间,数据会保存到磁盘中,时间到了之后才会清除.
    • 使用Cookie只能保存字符串类型的数据
    • 应用场景:记住用户名和密码
  • Session: 类似于银行卡, id保存在客户端, 数据保存在服务器

    • 保存时间: 数据是保存在服务器的内存中,默认保存半个小时左右时间, 而且重启程序或关闭程序都会清除.
    • Session可以保存任意对象类型的数据.
    • 应用场景:记住登录状态
  • Session相对于Cookie优点是

    • 更安全,因为session把数据保存在服务器端
    • 可以保存更多的数据
    • 支持更丰富的数据类型
    • 缺点是需要占用服务器端的内存空间

学习记录,请大神斧正

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-09-12 13:30:30  更:2021-09-12 13:30:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/29 10:33:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计