初学Java Web(5)——cookie-session学习
HTTP 协议
Web 浏览器与 Web 服务器之间的一问一答的交互过程必须遵守一定的规则,这样的规则就是 HTTP 协议。
HTTP 是 hypertext transfer protocol(超文本传输协议)的简写,它是 TCP/IP 协议之上的一个应用层的协议,用于定义 Web 浏览器与 Web 服务器之间交互数据的过程以及数据本身的格式。
- 特点:无状态,默认端口 80
HTTP 协议到底约束了什么?
- 约束了浏览器以何种格式向服务端发送数据
- 约束了服务器应该以何种格式来接收客户端发送的数据
- 约束了服务器应该以何种格式来反馈数据给浏览器
- 约束了浏览器应该以何种格式来接收服务器的反馈数据
- 总结:
浏览器给服务器发送数据:一次请求
服务器给浏览器反馈数据:一次响应
HTTP 无状态协议
HTTP 是一个无状态的协议,也就是没有记忆力,这意味着每一次的请求都是独立的,缺少状态意味着如果后续处理需要前面的信息,则它必须要重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就很快。
HTTP 的这种特性有优点也有缺点:
- 优点:解放了服务器,每一次的请求“点到为止”,不会造成不必要的连接占用。
- 缺点:每次请求会传输大量重复的内容信息,并且,在请求之间无法实现数据的共享。
主要问题:请求之间无法实现数据的共享
- 解决方案:
1.使用参数传递机制:
将参数拼接在请求的 URL 后面,实现数据的传递(GET方式),例如:/param/list?username=wmyskxz
问题:可以解决数据共享的问题,但是这种方式一不安全,二数据允许传输量只有1kb
2.使用Cookie技术
3.使用Session技术
Cookie 技术
- 特点:客户端的技术,将共享数据保存在客户端(浏览器)中
英文直接翻译过来就是小甜品,Cookie 的作用呢,通俗的说就是当一个用户通过 HTTP 访问一个服务器时,这个服务器会将一些 Key/Value 键值对返回给客户端浏览器,并给这些数据加上一些限制条件,在条件符合时这个用户下次访问这个服务器时,数据又被完整地带回给服务器。
这个作用就像是你去超市购物时,第一次给你办了一张购物卡,在这个购物卡里存放了一些你的个人信息,下次你再来这个超市的时候,你就只需要带上你的购物卡,直接购物就好了。
Cookie 操作
- 创建 Cookie 对象,设置共享数据
Cookie c = new Cookie(String name,String value); // 相当于办卡
- 注意:一个Cookie只能存储一个字符串类型的数据,不能存储其他类型的数据
- 将 Cookie 响应给浏览器
response对象.addCookie(cookie对象) // 相当于把卡交给用户
- 获取请求中的 Cookie 信息
Cookie[] cs = request对象.getCookies();
for(Cookie c : cs){
if(“username”.equals(c.getName())){
String value = c.getValue();
}
}
- 修改 Cookie 中的共享数据
1.重新创建一个新的 Cookie,名称要和要修改的数据一致
2.现获取到要修改的 Cookie 对象,再调用setValue(String newValue)
重新设置
- 注意:修改 Cookie 中的数据,需要再次发送给浏览器(第2点)
- 操作 Cookie 的生命周期
- 默认:在关闭浏览器的时候销毁 Cookie 对象
- 语法:
void setMaxAge(int expiry)
expiry > 0:设置 Cookie 对象能够存活 expiry 秒,即使关闭浏览器,也不影响 Cookie 中的共享数据,比如设置一个月:setMaxAge(60*60*24*30);
expiry = 0:立即删除当前的 Cookie 信息
expiry < 0:关闭浏览器时销毁
删除 Cookie 中的共享数据
通过setMaxAge(0)
来实现Cookie 中的 key 和 value 不支持中文
设置 Cookie 时需要对中文字符串进行编码:Cookie c = new Cookie("username", URLEncoder.encode(username,"UTF-8"));
在获取 Cookie 数据的时候再进行解码:
username = URLDecoder.decode(value, "UTF-8");
Cookie 的路径和域范围
- Cookie 的路径
Cookie 在创建的时候,会根据当前的Servlet的相对路径来设置自己的路径,比如 Servlet 的url-pattern
为 /cookie/login,相对路径则为:/cookie/- 出现的问题:
只有在访问路径为 /cookie/ 下面的资源的时候,才会将该 Cookie 发送到服务器 - 解决方案:
设置 Cookie 的路径:void setPath(String uri)
Cookie对象.setPath("/");
表示当前应用中的所有的资源都能够共享该Cookie信息
- 出现的问题:
- 域范围:(了解)
在多个应用之间实现数据的共享,那么就需要设置域范围,比如:
www.baidu.com / news.baidu.com / map.baidu.com
- 语法:
Cookie对象.setDomain("baidu.com");
Cookie 的缺陷
Cookie 的作用其实就是一种会话跟踪技术,但存在一些缺陷:
- 获取 Cookie 信息比较麻烦
- Cookie 不支持中文
- 一个 Cookie 只能存储一个字符串类型的数据
- Cookie 在浏览器中有大小和数量上的限制(不同浏览器存在不同的限制,例如FireFox一个站点最多存储50个 Cookie ,浏览器最多存储 4097个字大小的 Cookie)
- 共享数据时保存在浏览器中,容易造成数据的泄露,不安全
- 最好的解决方案:将数据保存在服务端(session)
Session 技术
Session:会话,从浏览器打开开始,直到浏览器关闭结束,无论在这个网站中访问了多少页面,点击了多少链接,都属于同一个会话。Session 也可以称为会话 Cookie
- 特点:服务端技术,将数据保存在服务器
理解 Session
前面已经介绍了 Cookie 可以让服务端程序跟踪每个客户端的访问,但是每次客户端的访问都必须传回这些 Cookie,如果 Cookie 很多,则无形增加了客户端与服务端的数据传输量,而 Session 的出现正是为了解决这个问题。
同一个客户端每次和服务端交互时,不需要每次都传回所有的 Cookie 值,而是只要传回一个 ID,这个 ID 就是客户端第一次访问服务器生成的,而且每个客户端是唯一的。这样每个客户端就有了一个唯一的 ID,客户端只要传回这个 ID 就行了,这个 ID 通常是 NAME 为 JSESIONID 的一个 Cookie。
Session 基本操作
- 获取 Session 对象
request对象.getSession()
和参数为true的一样
request对象.getSession(true)
获取Session对象,如果没有Session对象,直接创建一个新的返回,缺省值
request对象.getSession(false)
获取Session对象,如果没有返回null - 设置共享数据
Session对象.setAttribute(String name, Object value)
- 注意:Session 可以存储任何类型的数据,比如登陆用户的信息,可以封装到User对象中
修改共享数据
重新设置一个同名的共享数据获取共享数据
Object value = Session对象.getAttribute(String name);
- 删除 Session 中的共享数据
Session对象.removeAttribute(String name);
- 销毁 Session
void invalidate()
- Session 的超时管理
- 超时:在访问当前的资源的过程中,不和网页进行任何的交互,超过设定的时间就是超时
在 Tomcat 服务器中有默认的配置为30分钟,一般不需要去修改 - 语法:
void setMaxInactiveInterval(int interval)
Session 扩展
- Seesion 中的共享数据的属性名的命名规范:
通常为:XXX_IN_SESSION,例如:Session对象.setAttribute(“USER_IN_SESSION”,user)
- 序列化与反序列化:
Session 中存储的对象通常需要实现序列化接口,因为在网络之间传输的数据格式为二进制数据:- 序列化:将对象转换成二进制数据
- 反序列化:将二进制数据转换成对象
- URL 重写
出现的问题:
当浏览器禁用Cookie之后,那么我们的jsessionid就不能在浏览器中保存,那么后面的请求中就不会将 jsessionid 发送到服务器,服务器这面就找不到数据
解决方案:
1.在url后手动的拼接上 jsessionid
传递格式如/path/Servlet;jsessionid=sessionid
2.使用响应对象中的encodeURL(String path)实现 jsessionid 的自动拼接
String path = resp.encodeURL("path/Servlet");
- 推荐方式:②
欢迎转载,转载请注明出处!
简书ID:@我没有三颗心脏
github:wmyskxz
欢迎关注公众微信号:wmyskxz_javaweb
分享自己的Java Web学习之路以及各种Java学习资料
初学Java Web(5)——cookie-session学习的更多相关文章
- Java Web Application使Session永不失效(利用cookie隐藏登录)
在做 Web Application 时,因为 Web Project 有 session 自动失效的问题,所以如何让用户登录一次系统就能长时间运行三个月,就是个问题. 后来,看到 session 失 ...
- 初学Java Web(6)——JSP学习总结
为什么要学习 JSP Servlet 的短板: Servlet 的出现,是为了解决动态输出网页的问题. 虽然这样做目的能达到,但是存在一些缺陷: 在 Servlet 输出网页片段非常恶心 (可读性差, ...
- 初学Java Web(4)——Servlet学习总结
经过一段时间的学习,对于Servlet有了新的不一样的见解,在这里做一下总结,将近来学习到的知识总结一下. Servlet 的请求流程 浏览器发出请求:http://localhost:80/xxx1 ...
- Java Web之Cookie、Session
讲Cookie和Seesion之前,先讲一下HTTP连接其实是无序的,服务器不知道是谁在访问它.现在我们来实现一个简单的邮箱功能. 要求: 1.登录页面登录之后看到收件箱和欢迎我 2.点击收件箱看到几 ...
- 初学 Java Web 开发,请远离各种框架,从 Servlet 开发
Web框架是开发者在使用某种语言编写Web应用服务端时关于架构的最佳实践.很多Web框架是从实际的Web项目抽取出来的,仅和Web的请求和响应处 理有关,形成一个基础,在开发别的应用项目的时候则可以从 ...
- 初学Java web(转)
转自 http://www.oschina.net/question/12_52027 OSCHINA 软件库有一个分类——Web框架,该分类中包含多种编程语言的将近500个项目. Web框架是开发者 ...
- 初学 Java Web 开发,从 Servlet 开发
1. 基本要求:Java 编程基础 有良好的 Java 语言编程基础,这是必须的,在讨论 Web 开发技术时提了一个 Java 编程基础的问题会被鄙视的. 2. 环境准备 (Eclipse + Tom ...
- java web 整合开发王者归来学习总结
第一章java web开发概述 胖客户端CS,瘦客户端BS(Browser) 网址请求---服务器处理响应-----返回结果-----浏览器显示 CGI可以动态生成页面,但是每个进程都要启动一个CGI ...
- 初学Java Web(9)——学生管理系统(简易版)总结
项目开始时间:2018年4月8日14:37:47 项目完成时间:2018年4月9日10:03:30 技术准备 这个项目是自己用于巩固 J2EE 相关知识的练手项目,非常简单,但是相关的功能却非常实用, ...
随机推荐
- MyBatis3系列__05查询补充&resultMap与resultType区别
1.查询补充 当你查询一条记录并且是简单查询时,情况相对简单,可以参考以下的例子: public Employee getEmpById(Integer id); 对应的xml文件中: <sel ...
- BZOJ1386 : [Baltic2000]Stickers
显然每一位的限制独立,对于每一位求出仅限制该位下的最大数,然后求最小值即可. 假设当前要求数字$d$的答案: 考虑填数字的过程,可以看作依次考虑一个序列中的每个数,当前缀和$<0$时退出. 设$ ...
- BZOJ2681 : 玩游戏2
首先若存在多个连通块,那么答案显然是$+\infty$. 否则以$m$为根,每棵子树的根节点都最多只能放一个金币,且这些子树之间互不干扰. 对于一棵父亲为$m$的子树,最优方案下一定可以将子树剖分成若 ...
- TypeScript 函数-Lambads 和 this 关键字的使用
let people = { name:["a","b","c","d"], /* getName:function() ...
- NOIP-螺旋矩阵
题目描述 一个 n 行 n 列的螺旋矩阵可由如下方法生成: 从矩阵的左上角(第 1 行第 1 列)出发,初始时向右移动:如果前方是未曾经过的格子,则继续前进,否则右转:重复上述操作直至经过矩阵中所有格 ...
- 编译部署 Mysql 5.7
1.环境准备 RHEL7.4(最小化安装) 64bit 2G 内存 (1G 内存编译将近一个小时) 磁盘空间 15G 以上. 配置为本地yum 源 从MySQL5.7版本开始,安装MySQL需要 ...
- CDN(Content Delivery Network)技术原理概要
简介 CDN(Content Delivery Network)即内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡.内容分发.调度等功能,使用户就近获取所需内容,提高用户访问响应速度和 ...
- webpack配置非CMD规范的模块
一.前言 webpack在配置多页面开发的时候 ,发现用 import 导入 Zepto 时,会报 Uncaught TypeError: Cannot read property 'createEl ...
- ora-01033 oracle initialization or
这次出现这个问题是源于错删了 DBF文件. 解决方案如下: 1.打开SQL Plus 最后把你删掉的那个文件的表空间删掉就好了
- QT中foreach的使用
在标准C++中,并没有foreach关键字. 但是在QT中,可以使用这一个关键字,其主要原因是QT自己增加了这一个关键字,就像slots和signals.emit等一样.增加的foreach关键字在编 ...