1 http长连接与短连接
(1)短连接操作步骤是:连接→数据传输→关闭连接;
(2)长连接通常就是:连接→数据传输→保持连接(心跳)→数据传输→保持连接(心跳)→……→关闭连接;
(3)长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况.不论request还是response的header中包 含了值为close的connection,都表明当前正在使用的tcp链接在当前请求处理完毕后会被断掉。以后client再进行新 的请求时就必须创建新的tcp链接了。
(4)而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。
2 消息投送■
(1)HTTP协议永远都是客户端发起请求,服务器回送响应。这样就限制了使用HTTP协议,无法实现在客户端没有发起请求的时候,服务器将消息推送给客户端。
3 HTTP协议的无状态性
(1)无状态是指协议对于事务处理没有记忆能力,也就是每次请求-响应都是独立的。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。
(2)HTTP本身是一个无状态的连接协议,为了支持客户端与服务器之间的交互,我们就需要通过不同的技术为交互存储状态,而这些不同的技术就是Cookie和Session
4 get方法与post方法区别
(0) HTTP请求报文格式分请求头和数据,get与post的请求报文格式有些差别,响应报文则是一致格式的
(1) GET:当客户端要从服务器中读取文档时,使用GET方法。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind。
(2) POST:当客户端给服务器提供信息较多时可以使用POST方法。POST方法将请求参数封装在HTTP请求数据中(将表单内各个字段与其内容放置在HTML HEADER),以名称/值的形式出现,可以传输大量数据,可用来传送文件。
(3) 安全性问题: 当通过get方法提交数据时,用户名和密码将出现在URL上;
(4) 能力问题: get传送的数据量较小,URL会对长度有限制, post传送的数据量较大
(5) 在速度上,Get比Post要快,因为Get请求报文格式的处理比较简单
5 cookie 和 session
(1)Cookie:
Cookie是服务器在本地机器上以key-value形式存储的小段文本,服务器用HTTP响应报文的头向客户端设置和返回cookies,在客户终端,浏览器解析这些cookies并将它们保存为一个本地文件,它会自动将同一服务器的任何请求缚上这些cookies.
Cookie有两类,Session cookies和Persistent cookies,当服务端为cookie设置了确切的过期时间,就意味着是Persistent cookies,否则,默认为Session cookies
(2)session:
session是保存在服务端的一个对象,它可以用来保存会话相关的,key-value形式内容.每个客户端需要持有有一个sessionID与服务端的session对应.
session对象的创建:
是通过HttpServletRequest.getSession()方法,getSession有两种方法,一个有参的、一个是无参的: getSession()与getSession(true)一样,获取request对象关联的session对象,如果没有session,则返回一个新的session, sessionID由服务器自动生成。getSession(false)也是返回一个request对象关联的session对象,但如果没有session,则返回null,并不创建新的session对象
但在Jsp页面提交表单到servlet时,在servlet中调用getSession(false)时却返回了一个session,而不是null。原因是Jsp页面会默认创建session对象,即<@page session="true">,默认是true,如果手动将session设为false,则jsp不会创建session对象,页面也就不可以直接使用session对象。这样提交到servlet,用方法getSession(false)返回的就是null。
(3)保存sessionid的方式可以采用cookie,但由于cookie可以被人为的禁止,可以使用一种叫URL重写的技术,让客户端把sessionid直接附加在URL路径的后面传给服务端,
使用URL重写技术跟踪会话的原理: 当服务器程序调用request.getSession();代码时,其会先看request.getCookies()方法中有没有名为JSESSIONID的cookie带过来,如果没有,就看URL有没有被重
写(即附带JSESSIONID),如果有,则从服务器中找key为JSESSIONID的session对象,如果都没有,则创建一个新的session。如果用户禁用了cookie,则只能通过URL重写方式实现会话跟踪.
HttpServletResponse 接口提供了重写 URL 的方法:public java.lang.String encodeURL(java.lang.String url)
该方法的实现机制为:
先判断当前的 Web 组件是否启用 Session,如果没有启用 Session,直接返回参数 url。再判断客户端浏览器是否支持 Cookie,如果支持 Cookie,直接返回参数 url;如果不支持 Cookie,就在参数 url 中加入 Session ID 信息,然后返回修改后的 url。
我们可以对网页中的链接稍作修改,解决以上问题:
修改前:<a href=“maillogin.jsp“>
修改后:<a href=“<%=response.encodeURL(“maillogin.jsp“)%>“>
(4)在安全性要求较高的场景中,可在服务端为session设置过期时间,并且Cookie类型为Session cookies,由于Cookie保存在浏览器,且不安全,所以建议只保存诸如:id, key 之类的简单数据,需要其它的会话数据时再根据这些id, Key去获取.
(5)xinew的cookie:uid, token, sessionId
session用来保存用户登录的信息;
uid + token 用来验证用户是否已登录 (uid + 服务端的一个密钥计算出 token,以验证token的正确性),因为没登录用户是无法获得到token的;
如果客户端禁掉了cookie,则无法执行登录及其他操作
(6)关于session的替代:
如果不使用Session,那么Cookie就是必需的,可以使用Cookie与Cache相结合做法,自行控制会话数据的保存与加载。具体做法也简单:为每个客户端cookie分配一个key,在服务端用这个Key去访问Cache,以完成保存与加载的逻辑,这时cache可以保存在内存数据库中,以更好地管理对cache的高并发读写
6 断点续传和多线程下载的实现原理
HTTP协议的GET方法,支持只请求某个资源的某一部分:
q 206 Partial Content 部分内容响应;
q Range 请求的资源范围;
q Content-Range 响应的资源范围;
q 在连接断开重连时,客户端 只请求该资源未下载的部分,而不是重新请求整个资源,来实现断点续传。
分块请求资源实例:
Eg1:Range: bytes=306302- :请求这个资源从306302个字节到末尾的部分;
Eg2:Content-Range: bytes 306302-604047/604048:响应中指示携带的是该资源的第306302-604047的字节,该资源共604048个字节;
客户端通过并发的请求相同资源的不同片段,来实现对某个资源的并发分块下载。从而达到快速下载的目 的。目前流行的FlashGet和迅雷基本都是这个原理。
多线程下载的原理:
q 下载工具开启多个发出HTTP请求的线程;
q 每个http请求只请求资源文件的一部分:Content-Range: bytes 20000-40000/47000;
q 合并每个线程下载的文件。
7 https协议原理:
(1)HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL
(2)通信过程:(客户端代号为c,服务端代号为s)
st1: c 向 s 请求https连接,建立连接
st2: s 返回证书(公钥)给 c, c使用对应的根证书对s返回的证书进行验证
st3: c 端产生对称密钥,然后使用公钥加密对称密钥,并把加密后的对称密钥发给 s
st4: s 使用私钥解密对称密钥
st5: 至此,c 与 s 之间可以使用对称密钥进行通信
8 虚拟主机的实现
所谓虚拟主机,也叫“网站空间”就是把一台运行在互联网上的服务器划分成多个“虚拟”的服务器,每 一个虚拟主机都具有独立的域名和完整的Internet服务器(支持WWW、FTP、E-mail等)功能
。一台服务器上的不同虚拟主机是各自独立的,并由用户自行管理。但一台服务器主机只能够支 持一定数量的虚拟主机,当超过这个数量时,用户将会感到性能急剧下降。
虚拟主机是用同一个WEB服务器,为不同域名网站提供服务的技术。Apache、Tomcat等均可通过配置实现这个功能。
相关的HTTP消息 头:Host。
例如:Host: www.baidu.com
客户端发送HTTP请 求的时候,会携带Host头,Host头记录的是客户端输入的域名。这样服务器可以根据Host头确认客户要访问的是哪一个域名。