一、前言

本系列文章旨在温习计算机网络中心常识,进一步夯实根底,为以后 参与物联网、音视频、直播、即时通讯等范畴的项目做必定的常识储备。

文章列表:

  • 01-计算机网络中心常识|计算机网络通识【计算机网络功能指标、网络协议分层的几种办法、OSI七层模型概念通识】
  • 02-计算机网络中心常识|【树立调试环境、新建Java项目、计算机通信根底、计算机衔接办法、集线器/网桥/交换机/路由器】
  • 03-计算机网络中心常识|【MAC地址、IP地址的组成、IP地址的分类、CIDR、子网掩码、超网】
  • 04-计算机网络中心常识|【 静态路由、动态路由、数据包的传输、ISP、服务器机房、网络分类、家用无线路由器、公网IP、
  • 05-计算机网络中心常识|物理层/数据链路层【模拟信号&&数字信号、数据链路层】
  • 06-计算机网络中心常识|网络层【IP数据包Packet、网络协议、Checksum、源IP地址和目标IP地址、ping】
  • 07-计算机网络协议中心常识|【传输层-UDP】
  • 08-计算机网络协议中心常识|【传输层-TCP之可靠传输】
  • 09-计算机网络中心常识|传输层TCP2【流量操控原理、拥塞操控:slow start、congestion avoidance、快速重传、快速恢复】
  • 10-计算机网络协议中心常识|【传输层-TCP衔接】
  • 11-计算机网络协议中心常识|【 应用层】
  • 12-计算机网络中心常识|【Cookie、Session(概念、生命周期、有用期、浏览器的要求等)、跨域(概念、 同源战略、跨域处理方
  • 13-计算机网络协议中心常识|【 代理/CDN/网络安全】
  • 14-计算机网络协议中心常识|【(非)对称加密/数字签名/证书】
  • 15-计算机网络协议中心常识|【HTTPS】
  • 16-计算机网络中心常识|HTTPS协议【HTTP2、HTTP3】

本文主要重视:
会话(Session)盯梢是Web程序中常用的技能,用来盯梢用户的整个会话。常用的会话盯梢技能是Cookie与Session。Cookie经过在客户端记载信息承认用户身份,Session经过在服务器端记载信息承认用户身份。

二、Cookie

HTTP协议是无状况的协议。一旦数据交换结束,客户端与服务器端的衔接就会关闭,再次交换数据需求树立新的衔接。这就意味着服务器无法从衔接上盯梢会话。即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判别该购买行为是属于用户A的会话仍是用户B的会话了。要盯梢该会话,有必要引入一种机制。

Cookie便是这样的一种机制。它可以弥补HTTP协议无状况的不足。在Session出现之前,根本上一切的网站都选用Cookie来盯梢会话。

1. 什么是Cookie?

因为HTTP是一种无状况的协议,服务器单从网络衔接上无从知道客户身份。怎么办呢?就给客户端们颁布一个通行证吧,每人一个,不管谁拜访都有必要带着自己通行证。这样服务器就能从通行证上承认客户身份了。这便是Cookie的工作原理。

Cookie实际上是一小段的文本信息。客户端恳求服务器,假如服务器需求记载该用户状况,就运用response向客户端浏览器颁布一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再恳求该网站时,浏览器把恳求的网址连同该Cookie一同提交给服务器。服务器查看该Cookie,以此来辨认用户状况。服务器还可以依据需求修正Cookie的内容。

留意:Cookie功用需求浏览器的支撑。假如浏览器不支撑Cookie(如大部分手机中的浏览器)或许把Cookie禁用了,Cookie功用就会失效。不同的浏览器选用不同的办法保存Cookie。

2. 不行跨域名性

许多网站都会运用Cookie。例如,Google会向客户端颁布Cookie,Baidu也会向客户端颁布Cookie。那浏览器拜访Google会不会也带着上Baidu颁布的Cookie呢?或许Google能不能修正Baidu颁布的Cookie呢?

答案是否定的。Cookie具有不行跨域名性。依据Cookie规范,浏览器拜访Google只会带着Google的Cookie,而不会带着Baidu的Cookie。Google也只能操作Google的Cookie,而不能操作Baidu的Cookie。

Cookie在客户端是由浏览器来办理的。浏览器可以确保Google只会操作Google的Cookie而不会操作Baidu的Cookie,从而确保用户的隐私安全。浏览器判别一个网站是否能操作另一个网站Cookie的依据是域名。Google与Baidu的域名不相同,因而Google不能操作Baidu的Cookie。

正常情况下,同一个一级域名下的两个二级域名如www.google.com和images.google.com也不能交互运用Cookie,因为二者的域名并不严厉相同。假如想一切google.com名下的二级域名都可以运用该Cookie,需求设置Cookie的domain参数。


Cookie cookie = new Cookie("time","20200000"); // 新建Cookie
cookie.setDomain(".google.com"); // 设置域名
cookie.setPath("/"); // 设置途径
cookie.setMaxAge(Integer.MAX_VALUE); // 设置有用期
response.addCookie(cookie); // 输出到客户端

domain参数有必要以点(“.”)开始。别的,name相同但domain不同的两个Cookie是两个不同的Cookie。假如想要两个域名彻底不同的网站共有Cookie,可以生成两个Cookie,domain特点分别为两个域名,输出到客户端。

Cookie的值。假如值为Unicode字符,需求为字符编码。假如值为二进制数据,则需求运用BASE64编码。

3. 常用特点

除了name与value之外,Cookie还具有其他几个常用的特点。每个特点对应一个getter办法与一个setter办法。

12-计算机网络核心知识|【Cookie、Session(概念、生命周期、有效期、浏览器的要求等)、跨域(概念、 同源策略、跨域解决方法)】

4. 有用期

Cookie的maxAge决议着Cookie的有用期,单位为秒(Second)。Cookie中经过getMaxAge()办法与setMaxAge(int maxAge)办法来读写maxAge特点。

假如maxAge特点为正数,则表明该Cookie会在maxAge秒之后主动失效。浏览器会将maxAge为正数的Cookie耐久化,即写到对应的Cookie文件中。不管客户关闭了浏览器仍是电脑,只需还在maxAge秒之前,登录网站时该Cookie依然有用。下面代码中的Cookie信息将永久有用。

ini
Cookie cookie = new Cookie("username","helloweenvsfei"); // 新建Cookie
cookie.setMaxAge(Integer.MAX_VALUE); // 设置生命周期为MAX_VALUE
response.addCookie(cookie); // 输出到客户端

假如maxAge为负数,则表明该Cookie仅在本浏览器窗口以及本窗口翻开的子窗口内有用,关闭窗口后该Cookie即失效。maxAge为负数的Cookie,为临时性Cookie,不会被耐久化,不会被写到Cookie文件中。Cookie信息保存在浏览器内存中,因而关闭浏览器该Cookie就消失了。Cookie默许的maxAge值为–1。

假如maxAge为0,则表明删去该Cookie。Cookie机制没有供给删去Cookie的办法,因而经过设置该Cookie即时失效实现删去Cookie的作用。失效的Cookie会被浏览器从Cookie文件或许内存中删去。

留意:从客户端读取Cookie时,包括maxAge在内的其他特点都是不行读的,也不会被提交。浏览器提交Cookie时只会提交name与value特点。maxAge特点只被浏览器用来判别Cookie是否过期。

必定要设置失效时刻,要不然浏览器关闭就消失了。

5. 修正/删去

Cookie并不供给修正、删去操作。假如要删去某个Cookie,只需求新建一个同名的Cookie,并将maxAge设置为0,并添加到response中掩盖本来的Cookie。留意是0而不是负数。负数代表其他的含义。读者可以经过上例的程序进行验证,设置不同的特点。

留意:修正、删去Cookie时,新建的Cookie除value、maxAge之外的一切特点,例如name、path、domain等,都要与原Cookie彻底相同。不然,浏览器将视为两个不同的Cookie不予掩盖,导致修正、删去失败。

6. 途径

标识指定了主机下的哪些途径可以承受Cookie,子途径也会被匹配。

例如,假如只答应/hello/下的程序运用Cookie,可以这么写:


cookie.setPath("/hello/"); // 设置途径

设置为“/”时答应一切途径运用Cookie。path特点需求运用符号“/”结束。name相同但domain相同的两个Cookie也是两个不同的Cookie。

留意:页面只能获取它属于的Path的Cookie。例如/hello/test/a.html不能获取到途径为/hello/abc/的Cookie。

7. 安全

HTTP协议不仅是无状况的,而且是不安全的。运用HTTP协议的数据不经过任何加密就直接在网络上传达,有被截获的或许。运用HTTP协议传输很秘要的内容是一种隐患。假如不希望Cookie在HTTP等非安全协议中传输,可以设置Cookie的secure特点为true。浏览器只会在HTTPS和SSL等安全协议中传输此类Cookie。


cookie.setSecure(true);

secure特点并不能对Cookie内容加密,因而不能确保肯定的安全性。假如需求高安全性,需求在程序中对Cookie内容加密、解密,以防泄密。

三、Session

Session是服务器端运用的一种记载客户端状况的机制,运用上比Cookie简略一些,相应的也增加了服务器的存储压力。

1. 什么是Session?

Session是另一种记载客户状况的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器拜访服务器的时分,服务器把客户端信息以某种方式记载在服务器上。这便是Session。客户端浏览器再次拜访时只需求从该Session中查找该客户的状况就可以了。

假如说Cookie机制是经过查看客户身上的“通行证”来承认客户身份的话,那么Session机制便是经过查看服务器上的“客户明细表”来承认客户身份。Session相当于程序在服务器上树立的一份客户档案,客户来访的时分只需求查询客户档案表就可以了。

Session对应的类为javax.servlet.http.HttpSession类。每个来访者对应一个Session目标,一切该客户的状况信息都保存在这个Session目标里。Session目标是在客户端第一次恳求服务器的时分创立的。Session也是一种key-value的特点对,经过getAttribute(Stringkey)setAttribute(String key,Objectvalue)办法读写客户状况信息。Servlet里经过request.getSession()办法获取该客户的Session。

假如客户端的Session不存在,request.getSession()办法会回来null,而getSession(true)会先创立Session再将Session回来。


HttpSession session = request.getSession(); // 获取Session目标
session.setAttribute("loginTime", new Date()); // 设置Session中的特点
System.out.println("登录时刻为:" +(Date)session.getAttribute("loginTime"));      // 获取Session特点

当多个客户端履行程序时,服务器会保存多个客户端的Session。获取Session的时分也不需求声明获取谁的Session。Session机制决议了当时客户只会获取到自己的Session,而不会获取到他人的Session。各客户的Session也互相独立,互不行见。

Session的运用比Cookie便利,可是过多的Session存储在服务器内存中,会对服务器造成压力。

2. 生命周期

Session保存在服务器端。为了取得更高的存取速度,服务器一般把Session放在内存里。每个用户都会有一个独立的Session。假如Session内容过于杂乱,当大量客户拜访服务器时或许会导致内存溢出。因而,Session里的信息应该尽量精简。

Session在用户第一次拜访服务器的时分主动创立。需求留意只需拜访JSP、Servlet等程序时才会创立Session,只拜访HTML、IMAGE等静态资源并不会创立Session。假如尚未生成Session,也可以运用request.getSession(true)强制生成Session。

Session生成后,只需用户继续拜访,服务器就会更新Session的最终拜访时刻,并维护该Session。用户每拜访服务器一次,不管是否读写Session,服务器都以为该用户的Session“活泼(active)”了一次。

3. 有用期

因为会有越来越多的用户拜访服务器,因而Session也会越来越多。为避免内存溢出,服务器会把长时刻内没有活泼的Session从内存删去。这个时刻便是Session的超时时刻。假如超过了超时时刻没拜访过服务器,Session就主动失效了。

Session的超时时刻为maxInactiveInterval特点,可以经过对应的getMaxInactiveInterval()获取,经过setMaxInactiveInterval(longinterval)修正。

Session的超时时刻也可以在web.xml中修正。别的,经过调用Session的invalidate()办法可以使Session失效。

4. 常用办法

12-计算机网络核心知识|【Cookie、Session(概念、生命周期、有效期、浏览器的要求等)、跨域(概念、 同源策略、跨域解决方法)】

Tomcat中Session的默许超时时刻为20分钟。经过setMaxInactiveInterval(int seconds)修正超时时刻。可以修正web.xml改动Session的默许超时时刻。例如修正为60分钟:

<session-config>
   <!-- 单位:分钟 -->
   <session-timeout>60</session-timeout> 
</session-config>

5. 浏览器的要求

尽管Session保存在服务器,对客户端是通明的,它的正常运行依然需求客户端浏览器的支撑。这是因为Session需求运用Cookie作为辨认标志。HTTP协议是无状况的,Session不能依据HTTP衔接来判别是否为同一客户,因而服务器向客户端浏览器发送一个名为JSESSIONID的Cookie,它的值为该Session的id(也便是HttpSession.getId()的回来值)。Session依据该Cookie来辨认是否为同一用户。

该Cookie为服务器主动生成的,它的maxAge特点一般为–1,表明仅当时浏览器内有用,而且各浏览器窗口间不同享,关闭浏览器就会失效。

因而同一机器的两个浏览器窗口拜访服务器时,会生成两个不同的Session。可是由浏览器窗口内的链接、脚本等翻开的新窗口(也便是说不是双击桌面浏览器图标等翻开的窗口)在外。这类子窗口会同享父窗口的Cookie,因而会同享一个Session。

留意:新开的浏览器窗口会生成新的Session,但子窗口在外。子窗口会共用父窗口的Session。例如,在链接上右击,在弹出的方便菜单中挑选“在新窗口中翻开”时,子窗口便可以拜访父窗口的Session。

假如客户端浏览器将Cookie功用禁用,或许不支撑Cookie怎么办?例如,绝大多数的手机浏览器都不支撑Cookie。Java Web供给了另一种处理方案:URL地址重写。

6. URL地址重写

URL地址重写是对客户端不支撑Cookie的处理方案。URL地址重写的原理是将该用户Session的id信息重写到URL地址中。服务器可以解析重写后的URL获取Session的id。这样即使客户端不支撑Cookie,也可以运用Session来记载用户状况。HttpServletResponse类供给了encodeURL(Stringurl)实现URL地址重写,例如:


<td>
    <a href="<%=response.encodeURL("index.jsp?c=1&wd=Java") %>"> 
    Homepage</a>
</td>

该办法会主动判别客户端是否支撑Cookie。假如客户端支撑Cookie,会将URL原封不动地输出来。假如客户端不支撑Cookie,则会将用户Session的id重写到URL中。重写后的输出或许是这样的:


<td>
    <ahref="index.jsp;jsessionid=0CCD096E7F8D97B0BE608AFDC3E1931E?c=
    1&wd=Java">Homepage</a>
</td>

即在文件名的后面,在URL参数的前面添加了字符串“;jsessionid=XXX”。其中XXX为Session的id。分析一下可以知道,增添的jsessionid字符串既不会影响恳求的文件名,也不会影响提交的地址栏参数。用户单击这个链接的时分会把Session的id经过URL提交到服务器上,服务器经过解析URL地址取得Session的id。

假如是页面重定向(Redirection),URL地址重写可以这样写:


<%
    if(“administrator”.equals(userName)) {
       response.sendRedirect(response.encodeRedirectURL(“administrator.jsp”));
        return;
    }
%>

作用跟response.encodeURL(String url)是相同的:假如客户端支撑Cookie,生成原URL地址,假如不支撑Cookie,传回重写后的带有jsessionid字符串的地址。

关于WAP程序,因为大部分的手机浏览器都不支撑Cookie,WAP程序都会选用URL地址重写来盯梢用户会话。比方用友集团的移动商街等。

留意:TOMCAT判别客户端浏览器是否支撑Cookie的依据是恳求中是否含有Cookie。尽管客户端或许会支撑Cookie,可是因为第一次恳求时不会带着任何Cookie(因为并无任何Cookie可以带着),URL地址重写后的地址中依然会带有jsessionid。当第二次拜访时服务器已经在浏览器中写入Cookie了,因而URL地址重写后的地址中就不会带有jsessionid了。

7. 制止运用Cookie

既然WAP上大部分的客户浏览器都不支撑Cookie,索性制止Session运用Cookie,一致运用URL地址重写会更好一些。Java Web规范支撑经过装备的办法禁用Cookie。下面举例说一下怎样经过装备制止运用Cookie。

翻开项目sessionWeb的WebRoot目录下的META-INF文件夹(跟WEB-INF文件夹同级,假如没有则创立),翻开context.xml(假如没有则创立),编辑内容如下:


<?xml version='1.0' encoding='UTF-8'?>
<Context path="/sessionWeb" cookies="false">
</Context>

或许修正Tomcat全局的conf/context.xml,修正内容如下:


<!-- The contents of this file will be loaded for eachweb application -->
<Context cookies="false">
    <!-- ... 中间代码略 -->
</Context>

部署后TOMCAT便不会主动生成名JSESSIONID的Cookie,Session也不会以Cookie为辨认标志,而仅仅以重写后的URL地址为辨认标志了。

留意:该装备仅仅制止Session运用Cookie作为辨认标志,并不能阻挠其他的Cookie读写。也便是说服务器不会主动维护名为JSESSIONID的Cookie了,可是程序中依然可以读写其他的Cookie。

四、cookie和session的区别

  1. cookie数据存放在客户的浏览器上,session数据放在服务器上。

简略的说,当你登录一个网站的时分,假如web服务器端运用的是session,那么一切的数据都保存在服务器上面,

客户端每次恳求服务器的时分会发送 当时会话的session_id,服务器依据当时session_id判别相应的用户数据标志,以承认用户是否登录,或具有某种权限。

因为数据是存储在服务器 上面,所以你不能假造,可是假如你可以获取某个登录用户的session_id,用特殊的浏览器假造该用户的恳求也是可以成功的。

session_id是服务器和客户端链接时分随机分配的,一般来说是不会有重复,但假如有大量的并发恳求,也不是没有重复的或许性。

Session是由应用服务器维持的一个服务器端的存储空间,用户在衔接服务器时,会由服务器生成一个唯一的SessionID,用该SessionID 为标识符来存取服务器端的Session存储空间。而SessionID这一数据则是保存到客户端,用Cookie保存的,用户提交页面时,会将这一 SessionID提交到服务器端,来存取Session数据。这一过程,是不必开发人员干涉的。所以一旦客户端禁用Cookie,那么Session也会失效。

Session信息是存放在server端,但session id是存放在client cookie的。Cookie是彻底保持在客户端的。

  1. cookie不是很安全,他人可以分析存放在本地的COOKIE并进行COOKIE诈骗考虑到安全应当运用session。尽管cookie不安全,可是可以加密。
  2. 设置cookie时刻可以使cookie过期。可是运用session-destory (),我们将会毁掉会话。
  3. session会在必定时刻内保存在服务器上。当拜访增多,会比较占用你服务器的功能考虑到减轻服务器功能方面,应当运用cookie。
  4. 单个cookie保存的数据不能超过4K,许多浏览器都约束一个站点最多保存20个cookie(Session目标没有对存储的数据量的约束,其中可以保存更为杂乱的数据类型)。
  5. session很容易失效,用户体验很差;

两者最大的区别在于生计周期,一个是IE启动到IE关闭.(浏览器页面一关 ,session就消失了),一个是预先设置的生计周期,或永久的保存于本地的文件。(cookie)。

五、跨域

1. 为什么会出现跨域问题

出于浏览器的同源战略约束。

示例:前端项目部署在服务器A,后端项目部署在服务器B,拜访服务器A的前端页面,页面上点击按钮会拜访服务器B的资源,这时分就会发生跨域。

留意:跨域发送的恳求,服务端是可以正常呼应的,仅仅数据回来到浏览器的时分被浏览器绑架了。

2. 同源战略

同源战略(Same-Origin Policy)是一种约好,它是浏览器最中心也最根本的安全功用,假如缺少了同源战略,则浏览器的正常功用或许都会受到影响。可以说Web是构建在同源战略根底之上的,浏览器仅仅针对同源战略的一种实现。同源战略会阻挠一个域的javascript脚本和别的一个域的内容进行交互。所谓同源(即指在同一个域)便是两个页面具有相同的协议(protocol),主机(host)和端口号(port)

12-计算机网络核心知识|【Cookie、Session(概念、生命周期、有效期、浏览器的要求等)、跨域(概念、 同源策略、跨域解决方法)】

a、img、script、link、iframe、video、audio等标签不受同源战略的约束。

3. 跨域处理办法

CORS是跨域资源共享(Cross-Origin Resource Sharing)的缩写。它是W3C规范,属于跨源AJAX恳求的底子处理办法。

处理办法有以下两种:

  • 一般跨域恳求:只需服务器端设置呼应头Access-Control-Allow-Origin,奉告浏览器这是一个答应跨域拜访的恳求。尽管CORS的实现需求客户端和服务端一起支撑,但现在的浏览器根本都支撑(IE至少是IE10版别)。
  • 带cookie跨域恳求:前后端都需求进行设置

12-计算机网络核心知识|【Cookie、Session(概念、生命周期、有效期、浏览器的要求等)、跨域(概念、 同源策略、跨域解决方法)】

3.1. 前端

依据xhr.withCredentials字段判别是否带有cookie。

  1. 原生ajax

var xhr = new XMLHttpRequest(); // IE8/9需用window.XDomainRequest兼容
// 前端设置是否带cookie
xhr.withCredentials = true;
xhr.open('post', 'http://www.domain2.com:8080/login', true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send('user=admin');
xhr.onreadystatechange = function() {
    if (xhr.readyState == 4 && xhr.status == 200) {
        alert(xhr.responseText);
    }
};
  1. jQuery ajax

$.ajax({
   url: 'http://www.test.com:8080/login',
   type: 'get',
   data: {},
   xhrFields: {
       withCredentials: true    // 前端设置是否带cookie
   },
   crossDomain: true,   // 会让恳求头中包括跨域的额定信息,但不会含cookie
});
  1. vue-resource
ini
Vue.http.options.credentials = true
  1. axios
ini
axios.defaults.withCredentials = true

3.2. 服务端

服务器端关于CORS的支撑,主要是经过设置Access-Control-Allow-Origin来进行的。假如浏览器检测到相应的设置,就可以答应Ajax进行跨域的拜访。


/*
 * 导入包:import javax.servlet.http.HttpServletResponse;
 * 接口参数中界说:HttpServletResponse response
 */
// 答应跨域拜访的域名:若有端口需写全(协议+域名+端口),若没有端口结尾不必加'/'
response.setHeader("Access-Control-Allow-Origin", "http://www.domain1.com"); 
// 答应前端带认证cookie:启用此项后,上面的域名不能为'*',有必要指定具体的域名,不然浏览器会提示
response.setHeader("Access-Control-Allow-Credentials", "true"); 
// 提示OPTIONS预检时,后端需求设置的两个常用自界说头
response.setHeader("Access-Control-Allow-Headers", "Content-Type,X-Requested-With");