HTTP 协议

Web 浏览器Web 服务器之间的一问一答的交互过程必须遵守一定的规则,这样的规则就是 HTTP 协议。

HTTPhypertext transfer protocol(超文本传输协议)的简写,它是 TCP/IP 协议之上的一个应用层的协议,用于定义 Web 浏览器与 Web 服务器之间交互数据的过程以及数据本身的格式。

  • 特点:无状态,默认端口 80

HTTP 协议到底约束了什么?

  1. 约束了浏览器以何种格式向服务端发送数据
  2. 约束了服务器应该以何种格式接收客户端发送的数据
  3. 约束了服务器应该以何种格式反馈数据给浏览器
  4. 约束了浏览器应该以何种格式接收服务器的反馈数据
  • 总结:

    浏览器给服务器发送数据:一次请求

    服务器给浏览器反馈数据:一次响应

HTTP 无状态协议

HTTP 是一个无状态的协议,也就是没有记忆力,这意味着每一次的请求都是独立的,缺少状态意味着如果后续处理需要前面的信息,则它必须要重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就很快。

HTTP 的这种特性有优点也有缺点:

  • 优点:解放了服务器,每一次的请求“点到为止”,不会造成不必要的连接占用。
  • 缺点:每次请求会传输大量重复的内容信息,并且,在请求之间无法实现数据的共享。

主要问题:请求之间无法实现数据的共享

  • 解决方案:

    1.使用参数传递机制:

    将参数拼接在请求的 URL 后面,实现数据的传递(GET方式),例如:/param/list?username=wmyskxz

    问题:可以解决数据共享的问题,但是这种方式一不安全,二数据允许传输量只有1kb

    2.使用Cookie技术

    3.使用Session技术

Cookie 技术

  • 特点:客户端的技术,将共享数据保存在客户端(浏览器)中

英文直接翻译过来就是小甜品,Cookie 的作用呢,通俗的说就是当一个用户通过 HTTP 访问一个服务器时,这个服务器会将一些 Key/Value 键值对返回给客户端浏览器,并给这些数据加上一些限制条件,在条件符合时这个用户下次访问这个服务器时,数据又被完整地带回给服务器。

这个作用就像是你去超市购物时,第一次给你办了一张购物卡,在这个购物卡里存放了一些你的个人信息,下次你再来这个超市的时候,你就只需要带上你的购物卡,直接购物就好了。

Cookie 操作

  1. 创建 Cookie 对象,设置共享数据
Cookie c = new Cookie(String name,String value);  // 相当于办卡
  • 注意:一个Cookie只能存储一个字符串类型的数据,不能存储其他类型的数据
  1. 将 Cookie 响应给浏览器
response对象.addCookie(cookie对象)                // 相当于把卡交给用户
  1. 获取请求中的 Cookie 信息
Cookie[] cs = request对象.getCookies();
for(Cookie c : cs){
if(“username”.equals(c.getName())){
String value = c.getValue();
}
}
  1. 修改 Cookie 中的共享数据

    1.重新创建一个新的 Cookie,名称要和要修改的数据一致

    2.现获取到要修改的 Cookie 对象,再调用 setValue(String newValue) 重新设置
  • 注意:修改 Cookie 中的数据,需要再次发送给浏览器(第2点)
  1. 操作 Cookie 的生命周期
  • 默认:在关闭浏览器的时候销毁 Cookie 对象
  • 语法:void setMaxAge(int expiry)

    expiry > 0:设置 Cookie 对象能够存活 expiry 秒,即使关闭浏览器,也不影响 Cookie 中的共享数据,比如设置一个月:setMaxAge(60*60*24*30);

    expiry = 0:立即删除当前的 Cookie 信息

    expiry < 0:关闭浏览器时销毁
  1. 删除 Cookie 中的共享数据

    通过setMaxAge(0)来实现

  2. Cookie 中的 key 和 value 不支持中文

    设置 Cookie 时需要对中文字符串进行编码:

    Cookie c = new Cookie("username", URLEncoder.encode(username,"UTF-8"));

    在获取 Cookie 数据的时候再进行解码:

    username = URLDecoder.decode(value, "UTF-8");
  3. 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 的作用其实就是一种会话跟踪技术,但存在一些缺陷:

  1. 获取 Cookie 信息比较麻烦
  2. Cookie 不支持中文
  3. 一个 Cookie 只能存储一个字符串类型的数据
  4. Cookie 在浏览器中有大小和数量上的限制(不同浏览器存在不同的限制,例如FireFox一个站点最多存储50个 Cookie ,浏览器最多存储 4097个字大小的 Cookie)
  5. 共享数据时保存在浏览器中,容易造成数据的泄露,不安全
  • 最好的解决方案:将数据保存在服务端(session)

Session 技术

Session:会话,从浏览器打开开始,直到浏览器关闭结束,无论在这个网站中访问了多少页面,点击了多少链接,都属于同一个会话。Session 也可以称为会话 Cookie

  • 特点:服务端技术,将数据保存在服务器

理解 Session

前面已经介绍了 Cookie 可以让服务端程序跟踪每个客户端的访问,但是每次客户端的访问都必须传回这些 Cookie,如果 Cookie 很多,则无形增加了客户端与服务端的数据传输量,而 Session 的出现正是为了解决这个问题。

同一个客户端每次和服务端交互时,不需要每次都传回所有的 Cookie 值,而是只要传回一个 ID,这个 ID 就是客户端第一次访问服务器生成的,而且每个客户端是唯一的。这样每个客户端就有了一个唯一的 ID,客户端只要传回这个 ID 就行了,这个 ID 通常是 NAME 为 JSESIONID 的一个 Cookie。

Session 基本操作

  1. 获取 Session 对象

    request对象.getSession()

    和参数为true的一样

    request对象.getSession(true)

    获取Session对象,如果没有Session对象,直接创建一个新的返回,缺省值

    request对象.getSession(false)

    获取Session对象,如果没有返回null
  2. 设置共享数据
Session对象.setAttribute(String name, Object value)
  • 注意:Session 可以存储任何类型的数据,比如登陆用户的信息,可以封装到User对象中
  1. 修改共享数据

    重新设置一个同名的共享数据

  2. 获取共享数据

Object value = Session对象.getAttribute(String name);
  1. 删除 Session 中的共享数据
Session对象.removeAttribute(String name);
  1. 销毁 Session
void invalidate()
  1. 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学习的更多相关文章

  1. Java Web Application使Session永不失效(利用cookie隐藏登录)

    在做 Web Application 时,因为 Web Project 有 session 自动失效的问题,所以如何让用户登录一次系统就能长时间运行三个月,就是个问题. 后来,看到 session 失 ...

  2. 初学Java Web(6)——JSP学习总结

    为什么要学习 JSP Servlet 的短板: Servlet 的出现,是为了解决动态输出网页的问题. 虽然这样做目的能达到,但是存在一些缺陷: 在 Servlet 输出网页片段非常恶心 (可读性差, ...

  3. 初学Java Web(4)——Servlet学习总结

    经过一段时间的学习,对于Servlet有了新的不一样的见解,在这里做一下总结,将近来学习到的知识总结一下. Servlet 的请求流程 浏览器发出请求:http://localhost:80/xxx1 ...

  4. Java Web之Cookie、Session

    讲Cookie和Seesion之前,先讲一下HTTP连接其实是无序的,服务器不知道是谁在访问它.现在我们来实现一个简单的邮箱功能. 要求: 1.登录页面登录之后看到收件箱和欢迎我 2.点击收件箱看到几 ...

  5. 初学 Java Web 开发,请远离各种框架,从 Servlet 开发

    Web框架是开发者在使用某种语言编写Web应用服务端时关于架构的最佳实践.很多Web框架是从实际的Web项目抽取出来的,仅和Web的请求和响应处 理有关,形成一个基础,在开发别的应用项目的时候则可以从 ...

  6. 初学Java web(转)

    转自 http://www.oschina.net/question/12_52027 OSCHINA 软件库有一个分类——Web框架,该分类中包含多种编程语言的将近500个项目. Web框架是开发者 ...

  7. 初学 Java Web 开发,从 Servlet 开发

    1. 基本要求:Java 编程基础 有良好的 Java 语言编程基础,这是必须的,在讨论 Web 开发技术时提了一个 Java 编程基础的问题会被鄙视的. 2. 环境准备 (Eclipse + Tom ...

  8. java web 整合开发王者归来学习总结

    第一章java web开发概述 胖客户端CS,瘦客户端BS(Browser) 网址请求---服务器处理响应-----返回结果-----浏览器显示 CGI可以动态生成页面,但是每个进程都要启动一个CGI ...

  9. 初学Java Web(9)——学生管理系统(简易版)总结

    项目开始时间:2018年4月8日14:37:47 项目完成时间:2018年4月9日10:03:30 技术准备 这个项目是自己用于巩固 J2EE 相关知识的练手项目,非常简单,但是相关的功能却非常实用, ...

随机推荐

  1. 图片资源的加密和cocos2d-x中的解密

    主要处理png图片,其他格式图片也是一样的原理.阅读前可以简略了解一下png格式图片的Data trunck. 首先使用python脚本去掉png的PNG SIG(8 bytes) 以及末尾的PNGI ...

  2. JS存取Cookie值

    一:存Cookie //存Cookie document.cookie = "id=" + escape(value); 二:取Cookie //提取Cookie值 functio ...

  3. Oracle的AWR报告分析

    * 定义:awr报告是oracle 10g下提供的一种性能收集和分析工具,它能提供一个时间段内整个系统资源使用情况的报告,通过这个报告,我们就可以了解一个系统的整个运行情况,这就像一个人全面的体检报告 ...

  4. ACM: 强化训练-海贼王之伟大航路-dfs-枝减

    海贼王之伟大航路 Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Descriptio ...

  5. java 利用注解实现BaseDao 增删查改

    第一步,编写两个注解类,用于表明实体类对应的表名及字段. TableInfo.java 此注解用于标注表名及主键名 import static java.lang.annotation.Element ...

  6. Intrusion Detection of Specific Area Based on Video

  7. Best Time to Buy and Sell Stock I II III

    Best Time to Buy and Sell Stock Say you have an array for which the ith element is the price of a gi ...

  8. HDU 5652 India and China Origins

    二分答案+验证,注意一开始就不连通的话输出0 #include<cstdio> #include<cstring> #include<cmath> #include ...

  9. Centos6.8 安装dlib库时出错【升级gcc 到4.9.0以上】

    在centos6.8上安装dlib库时出现错误: 1.CMake must be installed to build the following extensions: dlib 没有安装CMake ...

  10. 【Codeforces 1132C】Painting the Fence

    Codeforces 1132 C 题意:给一些区间\([l_i,r_i]\),从中删掉两个,求剩下的区间最多能够覆盖的格子数量. 思路:首先枚举第一个删掉的区间,然后我们可以通过差分来求出每个格子被 ...