1.OSI网络七层协议:
应用层(HTTP,FTP,SMTP,POP3,TELNET 网络服务与最终用户的一个接口)
↓
表示层 (JPEG,ASCII,DECOIC 数据的表示,安全,压缩 )
↓
会话层(建立,管理,终止会话,对应主机进程,指本地与远程主机正在进行的会话)
↓
传输层(TCP,UDP 定义传输数据的协议端口号,流控,差错校验,数据包一旦离开网卡即进入网络传输层)
↓
网络层(IP,ICMP,IGMP 进行逻辑地址寻址,实现不同网络之间的路径选择)
↓
数据链路层(建立逻辑连接,进行硬件地址寻址,差错校验等)
↓
物理层(建立,维护,断开物理链接)
2.Http协议:
规定客户端和服务器如何进行交互的基于TCP/IP的应用层协议,基于请求响应模型,一次请求对应一次响应,请求只能由客户端发出,服务器只能被动的等待请求做出响应
HTTP协议的版本:HTTP/1.0、HTTP/1.1,其中1.0一次请求发起一次连接,响应过后连接自动断开。1.1里每次请求响应后连接将保持一段时间,这段时间内可以再执行请求响应。
3.Http 请求
请求行 :
GET books/java.html HTTP/1.1
请求方式 请求资源名 遵循的协议
七种请求方式:常用 POST,GET
GET 与POST请求区别在于请求参数在传递的过程中方式不同
GET:请求参数附加在请求url后作为请求地址的一部分带到服务器,可以传输的数据大小不超过1k
POST:请求参数在Http请求的实体内容中进行传输用于HTTP请求中的常用头:
Accept-Charset: ISO-8859-1 客户端接受数据需要使用的字符集编码
Accept-Encoding: gzip,compress 客户端可以接受的数据压缩格式
Accept-Language: en-us,zh-cn 可接受的语言环境
Host: www.it315.org:80 想要访问的虚拟主机名
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT 这是和缓存相关的一个头,带着缓存资源的最后获取时间
Referer: http://www.it315.org/index.jsp 这个头表示当前的请求来自哪个链接,这个头和防盗链的功能相关
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) 客户端的一些基本信息
Cookie 传递给服务器cookie值
Connection: close/Keep-Alive 指定是否继续保持连接
Date: Tue, 11 Jul 2000 18:23:51 GMT 当前时间
4.HTTP响应
状态行
格式: HTTP版本号 状态码 原因叙述
举例:HTTP/1.1 200 OK
状态码用于表示服务器对请求的处理结果,它是一个三位的十进制数。响应状态码分为5类,如下所示:
状态码 | 含义 |
---|---|
100~199 | 成功接受请求,要求客户端继续提交下一次请求才能完成整个处理过程 |
200~299 | 表示成功接收请求并已完成整个请求,常用200 |
300~399 | 未完成请求,需客户端进一步细化需求,常用302,307,304 如使用缓存 |
400~499 | 客户端请求有误,常用404 |
500~599 | 服务器出现错误,常见500 |
HTTP常用的响应头:
Location: http://www.it315.org/index.jsp 配合302实现请求重定向
Server: apache tomcat 服务器的基本信息
Content-Encoding: gzip 服务器发送数据时使用的压缩格式
Content-Length: 80 发送数据的大小
Content-Language: zh-cn 发送的数据使用的语言环境
Content-Type: text/html; charset=GB2312 当前所发送的数据的基本信息,(数据的类型,所使用的编码)
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT 缓存相关的头
Refresh: 1;url=http://www.it315.org 通知浏览器进行定时刷新,此值可以是一个数字指定多长时间以后刷新当前页面,这个数字之后也可以接一个分号后跟一个URL地址指定多长时间后刷新到哪个URL
Content-Disposition: attachment;filename=aaa.zip 与下载相关的头
Transfer-Encoding: chunked 传输类型,如果是此值是一个chunked说明当前的数据是一块一块传输的
Set-Cookie: SS=Q0=5Lb_nQ; path=/search 和cookie相关的头,通知浏览器设置cookie
ETag: W/”83794-1208174400000” 和缓存机制相关的头
Expires: -1 指定资源缓存的时间,如果取值为0或-1浏览就不缓存资源
Cache-Control: no-cache 缓存相关的头,如果为no-cache则通知浏览器不缓存
Pragma: no-cache 缓存相关的头,如果为no-cache则不缓存
以上三个头都是用来控制缓存的,是因为历史原因造成的,不同的浏览器认识不同的头,我们通常三个一起使用保证通用性。
Connection: close/Keep-Alive 是否保持连接
Date: Tue, 11 Jul 2000 18:23:51 GMT 当前时间
5.会话技术
Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。
一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。
一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。
浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。
注意,删除cookie时,path必须一致,否则不会删除(浏览器通过> cookie的name+path来标识一个cookie)
response身上具有addCookie的方法,可以将创建出来的组织成响应消息中的set-cookie头,通知浏览器保存该cookie
request身上具有getCookies方法,可以获取浏览器带过来的所有Cookie
Cookie方法:注意,浏览器是根据cookie的名称加上cookie的path来区分是否是同一个cookie的,如果需要覆盖之前的cookie,除了保证名称相同外还要保证path也相同。
public Cookie(String name,String value)利用构造方法创建一个Cookie对象,在创建的时候就要指定该Cookie的名和值
setValue与getValue方法 设置或者获取Cookie的值
setMaxAge与getMaxAge方法 如果不设置cookie的MaxAge(或将其值设置为负值),则默认情况下浏览器会将cookie保存在浏览器的内存中,会随着浏览器关闭而消失。如果设置为一个正值,则代表该Cookie要保存的以秒为单位的时间值,如此,该cookie将会被浏览器保存到硬盘中去。如果将MaxAge设置为0,则是通知浏览器去删除该Cookie。
setPath与getPath方法 用来指定访问哪个ULR及其子URL时带上此cookie,如果不设置此值,则浏览器默认会将发送该cookie的servlet所在的路径作为path使用。
例如:
setPath(“/Day06”)则/Day06/…/…的路径都会带上该Cookie
如果发送该Cookie的Servlet是 /Day06/servlet/Demo1Servlet,并且未设置setPat,则浏览器在访问/Day06/servlet/..时会带上该cookiesetDomain与getDomain方法 设置cookie对应的域名,此方法一旦调用,则浏览器会认为该cookie是一个第三方cookie而拒收
getName方法 获取该cookie的名字,注意没有setName方法,一个Cookie一旦创建出来就不能修改名字了
浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
Cookie是基于set-Cookie响应头和Cookie请求头工作的,服务器可以发送set-Cookie请求头命令浏览器保存一个cookie信息,浏览器会在访问服务器时以Cookie请求头的方式带回之前保存的信息request.getCookies();
response.addCookie(Cookie c);
new Cookie(String name,String value)//Cookie在构造的时候就需要设定好cookie的名字和值
getName();
getValue();
setValue();
!!setMaxAge与getMaxAge方法
一个Cookie如果没有设置过MaxAge则这个Cookie是一个会话级别的Cookie,这个Cookie信息打给浏览器后浏览器会将它保存在浏览器的内存中,这意味着只要浏览器已关闭随着浏览器内存的销毁Cookie信息也就消失了.一个Cookie也可以设置MaxAge,浏览一一旦发现收到的Cookie被设置了MaxAge,则会将这个Cookie信息以文件的形式保存在浏览器的临时文件夹中,保存到指定的时间到来位置.这样一来即使多次开关浏览器,由于这些浏览器都能在临时文件夹中看到cookie文件,所以在cookie失效之前cookie信息都存在.
– 想要命令浏览器删除一个Cookie,发送一个同名同path的cookie,maxage设置为0,浏览器以名字+path识别cookie,发现同名同path,cookie覆盖后立即超时被删除,从而就删除了cookie.
!!setPath与getPath方法
– 用来通知浏览器在访问服务器中的哪个路径及其子路径时带着当前cookie信息过来
如果不明确设置,则默认的路径是发送Cookie的Servlet所在的路径
setDomain与getDomain方法.– 用来通知浏览器在访问哪个域名的时候带着当前的cookie信息.但是要注意,现代的浏览器一旦发现cookie设置过domain信息则会拒绝接受这个Cookie.我们平常不要设置这个方法
Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。
Session 是一个域
!!作用范围:当前会话范围
!!生命周期:当程序第一次调用到request.getSession()方法时说明客户端明确的需要用到session此时创建出对应客户端的Session对象.
当session超过30分钟(这个时间是可以在web.xml文件中进行修改的)没有人使用则认为session超时销毁这个session.
程序中明确的调用session.invalidate()方法可以立即杀死session.
当服务器被非正常关闭时,随着虚拟机的死亡而死亡.
*如果服务器是正常关闭,还未超时的session会被以文件的形式保存在服务器的work目录下,这个过程叫做session的钝化.下次再正常启动服务器时,钝化着的session会被恢复到内存中,这个过程叫做session的活化.
!!作用:在会话范围内共享数据
!!session 的原理:
request.getSession()方法会检查请求中有没有JSESSIONID cookie,如果有拿出他的值找到对应的session为他服务.
如果没有则检查请求的URL后有没有以参数的形式带着JSESSIONID过来,如果有则找到对应的Session为浏览器服务器
如果还找不到则认为这个浏览器没有对应的Session,创建一个Session然后再在响应中添加JSESSIONID cookie,值就是这个Session 的id
默认情况下,JSESSIONID 的path为当前web应用的名称,并且没有设置过MaxAge,是一个会话级别的cookie.
这意味着一旦关闭浏览器再新开浏览器时,由于JSESSIONID丢失,会找不到之前的Session
我们可以手动的发送JSESSIONID cookie,名字和path设置的和自动发送时一样,但是设置一下MaxAge,使浏览器除了在内存中保存JSESSIONID信息以外还在临时文件夹中以文件的形式保存,这样即使重开浏览器仍然可以使用之前的sessionURL重写:
如果浏览器禁用了Cookie,浏览器就没有办法JSESSIONID cookie,这样就用不了Session了.
我们可以使用URL重写的机制,在所有的超链接后都以参数的形式拼接JSESSIONID信息,从而在点击超链接时可以使用URL参数的方式待会JSESSIONID,从而使用Session
将URL进行重写拼接上JSESSIONID的过程就叫做URL重写request.getSession() –在URL重写之前一定要先创建出Session,才有Session id,才能进行重写
response.encodeURL()— 一般的地址都用这个方法重写
response.encodeRedirectURL() — 如果地址是用来进行重定向的则使用这个方法*url重写的方法一旦发现浏览器带回了任意cookie信息,则认为客户端没有禁用cookie,就不会再进行重写操作
cookie是客户端技术
数据保存在客户端,这个信息可以保存很长时间
数据随时有可能被清空,所以cookie保存的数据是不太靠谱的
数据被保存在了客户端,随时有可能被人看走,如果将一些敏感信息比如用户名密码等信息存在cookie中,可能有安全问题
session是服务器端技术
数据保存在服务区端,相对来说比较稳定和安全
占用服务器内存,所以一般存活的时间不会太长,超过超时时间就会被销毁.我们要根据服务器的压力和session 的使用情况合理设置session的超时时间,既能保证session的存活时间够用,同时不用的session可以及时销毁减少对服务器内存的占用.