1.http特点
http协议(规范),规范了各个浏览器和服务器通信的标准,不管使用什么浏览器,
大家都是基于http传递数据,服务器解析不了的情况。
tomcat默认就是支持http协议的服务器。
2.协议的特点:
(1) 遵循请求–响应模型。客户端发送了请求,服务器必定给你响应
(2) http是无状态的协议----客户端发送请求完了,接受相应就完了。关闭连接scoket.close()
(3)http端口是 80 ftp-21
(4)http属于应用层协议,应用层的数据封装在http里面进行传输的
3.http结构
(1)http请求
请求行:请求网址(你输入的网址)、请求方法(get/post)、版本(定义连接服务器的一些信息)
请求头:包含元数据(告诉服务器,浏览器类型,客户端要接受的数据格式、压缩方式 等等。)
空行:将请求头和消息体分隔开
消息体:存放用户传输的数据
(2)http响应
状态行:http版本(目前用的都是1.1版本)、状态码(status code 一般都是200(正常) 404 500 异常)、状态描述
响应头: 包含元数据(服务器告诉客户端 发送回来的数据格式、例如:content-type)
(content-type:表示服务器传递回客户端的数据格式,数据类型。)
空行:
消息体: 服务器响应的数据。
部署servlet。 核心是:service doget/dopost都是弟弟 往后稍稍
tomcat默认调用service,service会把请求传给doget dopost doput dodelete等
此处的service方法(服务方法,用于接收用户传递过来的请求),不同于三层结构中的service包(业务层)。这里仅仅是 重名 的而已
get、post请求都是service来处理
tomcat既是服务器,又是容器,tomcat默认就支持servlet 和jsp运行
tomcat负责创建servlet以及servlet里面数据的封装,以及servlet方法的调用。
servlet和容器(tomcat)的通信:
1.通信支持:指的是servlet和tomcat之间的通信。tomcat会调用servletapi的方法来进行通信。 tomcat默认调用service方法 只需要写好service方法就行,tomcat会主动来调用它的
2.多线程支持:tomcat默认以及实现了多线程,每次请求都会默认创建新的线程来处理(servlet的效率比较高)
3.jsp支持:tomcat也支持jsp。jsp就是servlet
4.生命周期管理:servlet或者jsp的生与死 都是容器来控制
5.安全信息管理:tomcat做了一些安全验证,保证我们服务器信息安全,比如web-inf(用户访问不了这个)
jsp和servlet的关系:
jsp本质就是servlet。 jsp能展示的功能servlet也可以。
结果和jsp的效果是一样的。
同样,实现动态页面也可以用servlet:
二者的区别:
有了servlet 为什么还要jsp?
因为全写servlet里面 工作量太大了 页面过于繁杂。
设计jsp:静态模板+java代码。
tomcat运行这个jsp页面的时候,会自动把jsp页面转成servlet来运行
JSP运行原理:jsp里面有java代码和模板内容。 执行的时候,tomcat会把所有东西都转化成java代码 。tomcat文件夹里面有一个目录 :word 进去找到我们写的这个项目,发现前面写的jsp页面被tomcat里面的jsp引擎(用于把所有用jsp后缀的文件转化成java后缀)自动转化成了.java文件。
转化过程:自动把jsp文件通过流 转化成servlet
请求响应完了之后,如何做状态跟踪?
有状态的会话: 客户端第一次访问服务器完了后,再次访问服务器,服务器能够识别到这两次请求是同一个用户的行为。 先登录-访问主页。 服务器会识别
无状态的会话:多次访问服务器,对于服务器来说 每次访问都是一个新的用户
(会话:打开浏览器—访问服务器—关闭浏览器 完成一次会话。
请求:打开浏览器—输入地址—回车—刷新。)
http是一个无状态的协议。每次访问服务器完了后,客户端和服务器就断开连接。
一个浏览器就是一个用户对象,通过浏览器访问服务器,登陆后 换一个浏览器 会要求你重新登陆。
为了保存用户会话状态,避免用户登陆后进行每一步操作都被服务器判定为新用户,要求重新登录,引入了一系列新技术:
hidden隐藏
cookie
session
url重写
cookie:客户端技术。
(经常清理内存的时候清楚浏览器的cookie信息的cookie就是这个)
cookie是客户端的用户,程序把每个用户的数据以cookie的形式保存在浏览器里面。当用户使用浏览器访问服务器的时候,会将cookie传递给服务器,服务器就能获取cookie数据。
客服端访问服务器, 这时候没有cookie 服务器会给你生成一个cookie 保存用户信息(user message)。接下来 服务器会给cookie发送给客户端,当下次客户端再访问服务器的时候, 会把cookie信息放在请求里面发给服务器,供服务器识别。
服务器端获取cookie: getHeader。
获取的cookie由于包含很多键值对,是一个字符串 直接获取比较麻烦。可以理解成一个 Map
可以使用req.getCookies
这句话把req.getHeader(“cookie”)这句话封装了,不用自己拆(value.split)这些字符串了。
格式的设置:
这个格式设置要放在最上面,在声明流之前。
游戏里的获取上次登录时间:
一般用 多少小时 乘 一个小时的 3600秒
cookie: 安全性不高,一般不会将重要的信息保存到cookie里,只能保存时间,保存一些id。
插曲: URL uri 获取请求行内的信息。
获取请求头信息:可以知道用户用的什么信息
user agent:用户代理
session:用于存放重要信息。保存在服务器端
例如银行卡,你只能拿到银行卡号。密码等所有信息都在服务器中。
session保存会话技术的一种,保存在服务器内。一个浏览器独占了一个session对象。
你可以将一些隐私数据保存到session对象中,来达到会话状态管理。
用户在浏览器首次登陆过后,会创建 保存一个sessionID 和session其他的信息,用户再次访问的时候 浏览器会根据这个ID去找session信息。如果没有找到,则会创建一个session。
关于session 主要研究下面三点。
1.怎么创建session?
2.session的用法。
3.销毁session
1.怎么创建session?
刷新一次
说明第二次访问的时候不会再创建新的session了。
tomcat是如何识别每个用户的session的 ?
访问服务器,从服务器获取到session对象,如果获取不到session 就会创建一个新的session。 将session的id获取到,保存在cookie中,将cookie发送回客户端。
下次再访问的时候,将cookie发送给服务器,去除session然后匹配session对象。
只获取session 而不创建session
在servlet里面和jsp里面得到的session 是同一个session。一个浏览器有且只有一个session。所以不能一个浏览器同时登陆多个用户。
重定向 与内部派发
重定向:给浏览器发送一个新的地址,让浏览器重新访问,整个过程请求两次。
内部派发:请求到达这个资源,继续将请求交给其他资源,整个流程只有一个请求。
请求派发和重定向的区别:
1.请求派发是在服务器内部完成的,不能跨服务器访问,只能派发到本服务器的其他资源。
重定向是客户端发起的多次请求,可以跨服务器,第一次访问百度,第二次访问其他服务器。
2.请求派发,整个流程只有一个请求,经过了多个资源。
内部派发 发起了两次请求,产生两个请求对象和两个响应对象
3.请求派发可以传递数据
重定向不好传递数据
4.请求派发,浏览器地址栏不变
重定向浏览器地址栏会产生变化
设置session的销毁(过期)时间
服务器默认设置session对象的活跃时间为30分钟。这个30分钟,指的是最大不活跃(30分钟之内客户端与服务器没有任何的通信、交互)时间。
我们也可以自己在web.xml中配置session的销毁时间。
第二种方法:在servlet中设置。
立即销毁session:一般用于注销功能
注销功能需要重新写一个servlet
session立即销毁,并且重定向到登陆界面
jsp页面
配置xml文件
禁用了Cookie 无法保存sessionID,怎么保存会话状态?—url重写
如果禁用了cookie。则会遇到问题:没办法保存用户会话状态,无法给session传id进去,session是依赖cookie的,cookie若被禁用了 session也无法使用。
这个时候可以使用 url重写技术来完成会话状态的保存
url:统一资源定位符
uri:统一资源标识符
url第一次访问的时候(传一个url地址过去)获取到资源,接下来对服务器接收到这个地址之后,对url进行编码(编码过程就是把sessionID放进去),再将url发送回客户端。
下次访问的时候使用编码过后的url访问就能将会话状态保存起来。
url编码(url重写):将session放在url后面
检测到session是新的 的时候 返回一个url地址,这个地址包含了上面的path路径 这个路径已经重写了url 里面保存了sessionID
此时不再刷新页面,直接点发回来的连接
这就说明了会话已经保存了,sessionID通过url重写得到了。
当url重写了,且没有禁用cookie的时候,取的谁的sessionID?
cookie以请求头的方式传递,url以地址传递,当cookie和url同时生效的时候,会优先使用cookie的数据。