Http协议
-
Http协议(Hypertext Transfer Protocol,超文本传输协议),是一个客户端请求和响应的标准协议,规定了浏览器和万维网服务器之间互相通信的规则,用户输入地址和端口号可以传给你服务器上取得所需要的信息
-
HTTP是一个基于请求与响应模式的、应用层的协议,常基于TCP的连接方式,大多数的Web开发都是构建在HTTP协议之上的Web应用
-
通信规则规定了客户端发送给服务器的内容格式,也规定了服务器发送给客户端的内容格式
-
客户端发送给服务器的格式叫请求协议,服务器发送给客户端的格式叫响应协议
-
Http特点:
-
支持客户端/服务器模式
-
简单快速:客户向服务器请求服务时,只需要传送请求方法和路径。请求方法有GET、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP服务器的程序规模小,因而通信速度快
-
灵活:HTTP允许传输任意类型的对象,传输的类型由Content-Type标记
-
无连接:无连接表示每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接,这种方式可节省传输时间。HTTP1.1版本后支持可持续连接。通过这种连接,就有可能在建立一个TCP连接后,发送请求并得到回应,然后发送给更多的请求并得到更多的回应。通过把建立和释放TCP连接的开销分摊到多个请求上,对于每个请求而言,由于TCP造成的相对开销被大大降低。并且还可以发送流水线请求,也就是在发送请求1之后的回应到来之前就可以发送请求2;也可以认为,一次连接发送多个请求,由客户机确认是否关闭连接,而服务器会认为这些请求分别来自不同的客户端
-
无状态:HTTP协议是无状态协议。无状态指协议对于事务处理没有记忆能力,缺少状态意味着如果后续处理需要之前的信息,则必须重传,这样导致每次连接传输的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快
-
URI
-
Uniform Resource Identifier,统一资源标识符
-
用于标识某一互联网资源名称的字符串
-
一种语义上的抽象概念,可以是绝对的,也可以是相对的
URL
-
Uniform Resource Locator,统一资源定位符
-
URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息
-
URL是一种具体的URI,是URI的一个子集,不仅唯一标识资源,还提供了定位该资源的信息
-
HTTP URL格式:
-
http://host[:port]/[abc_path]
-
http://IP(主机名/域名):端口/访问的资源路径
-
http:表示要通过HTTP协议来定位网络资源
-
host:表示合法的Internet主机域名或IP地址
-
port:指定一个端口号,为空则使用缺省端口80
-
abc_path:指定请求资源的URI;如果URl中没有abc_path,则当它作为URI时,必须以“/”的形式给出,通常这个工作由浏览器帮我们完成
-
HTTP请求
-
HTTP请求由三部分构成:请求行、请求头、请求正文(请求体)
-
请求行:
-
第一行的内容
-
格式:Method Request-URL HTTP-Version CRLF
-
Method:表示请求方式
-
Request-URL:统一资源标识符
-
HTTP-Version:请求的HTTP协议版本
-
CRLF:表示回车和换行
-
-
-
请求头:
-
一个一个的键值对
-
-
请求正文(请求体)
-
格式: 请求行 请求头1 请求头2 ... 请求空行 请求体 GET请求没有请求体,POST请求有请求体
-
HTTP响应
-
HTTP响应由三部分构成:状态行(响应行)、消息报头(响应头)、响应正文(响应体,我们所看到的浏览器中的内容)
-
格式:
状态行
响应头1
响应头2
...
响应空行
响应体
消息头
HTTP消息由客户端到服务器的请求和服务器到客户端的响应组成。请求消息和响应消息都是由开始行(对于请求消息,开始行是请求行;对于响应消息,开始行是状态行),消息报头(可选),空行(只有CRLF的行),消息正文(可选)组成每一个报头都是由 名字+:+空格+值 组成,消息报头域的名字大小写无关
请求头
-
请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息
-
Referer:该请求头指明请求从哪来(上一个页面)
响应头
-
响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对Request-URL所标识的资源进行下一步访问的信息
-
Location:Location响应报头域用于重定向接受者到一个新的位置
-
Refresh:每隔一定时间刷新页面或自动跳转(单位:秒),可以在页面通过meta标签实现,也可在后台实现
get和post区别
-
get的url参数可见,post的url参数不可见,因此post更安全
-
get通过拼接url进行传递参数,post通过请求体传递参数
-
get请求可以缓存,post请求不可以缓存
-
get请求页面后退时不产生影响,post请求页面后退时会重新提交请求
-
get请求传输数据不超过2-4K,post请求传输数据根据php.ini配置文件设定可无限大
-
get请求会将header和data一起发出去,post请求先发header再发data
常见响应状态码
-
100:客户端必须继续发送请求
-
200 :客户端请求成功
-
302 :重定向
-
400:客户端语法错误
-
401:请求未经授权
-
403:服务器收到请求,但是拒绝提供访问
-
404:请求资源不存在
-
500:服务器内部错误(代码错误)
-
503:服务器当前不能处理客户端的请求
Tomcat
-
Tomcat是一个Web应用服务器,属于轻量级应用服务器,符合JavaEE WEB标准的最小的WEB容器,底层是Socket的一个程序
-
IDEA重启Tomcat的选项
-
Update resources:更新静态的资源,比如html,js,css等 运行模式和调试模式都是立即生效
-
Update classes and resources:更新java,jsp和静态资源
-
Redeploy:重新部署,发布到tomcat里,不重启tomcat,而是把原来的删掉,然后重新发布
-
Restart server:重启服务器
-
Servlet
-
Servlet是Server和Applet的缩写,是服务端小程序的意思
-
Servlet主要运行在服务端,并由服务器调用执行,是一种按照Servlet标准开发的类
-
实现web开发,需要实现Servlet标准
-
Servlet本质上是Java类,但遵循Servlet规范编写,没有main()方法,创建、使用、销毁都由Servlet容器进行管理(如Tomcat)
-
Servlet可以处理HTTP协议相关的所有内容
-
提供了Servlet功能的服务器叫Servlet容器,常见的容器很多,如Tomcat、Jetty、WebLogic Server、WebSphere、JBoss等
Servlet实现
-
创建类
-
继承HttpServlet类(使用较多)或继承GenericServlet类 或 实现Servlet接口
-
重写service方法(使用较多)或重写doGet和doPost方法
-
设置注解@WebServlet
-
注解的参数:
-
name:默认情况是类名
-
value:访问的路径,可同时设置多个(路径之前有一个“/”)
-
urlPatterns:访问的路径,可同时设置多个
-
-
一般情况下在注解里就只写上访问的路径,如 @WebServlet("/ser01")
-
Servlet生命周期
-
Servlet没有main()方法,不能独立运行,它的运行由Servlet引擎控制和调度
-
生命周期:指的是servlet容器何时创建servlet实例、何时调用方法进行请求的处理、何时销毁实例的过程
-
Servlet生命周期分为三个阶段:
-
实例和初始化阶段:
-
当请求到达容器时,容器查找该servlet对象是否存在,如果不存在,则会创建实例并初始化,且只初始化一次
-
init()方法:在Servlet实例创建后执行
-
-
就绪/调用/服务阶段:
-
有请求到达容器,容器会调用servlet对象的service()方法,处理请求的方法在整个生命周期中可以被多次调用
-
HttpServlet的service()方法,会依据请求方式调用doGet()或doPost()方法,但是这两个方法在默认情况下会抛出异常,需要子类去重写
-
service()方法:处理请求
-
-
销毁阶段:
-
当容器关闭时(应用程序停止时),会将程序中的Servlet实例进行销毁
-
destroy():Servlet实例销毁时执行
-
-
Servlet的工作步骤
-
Web Client向Servlet容器(Tomcat)发出Http请求
-
Servlet容器接收Web Client的请求
-
Servlet容器创建一个HttpServletRequest对象,加过Web Client请求的信息封装到这个对象中
-
Servlet容器创建一个HttpServletResponse对象
-
Servlet容器调用HttpServlet对象的service方法,把Request和Response作为参数,传给HttpServlet
-
HttpServlet调用HttpServletRequest对象的有关方法,获取Http请求信息
-
HttpServlet调用HttpServletResponse对象的有关方法,生成响应数据
-
Servlet容器把HttpServlet的响应结果传给Web Client
设置对外访问路径
-
比如访问京东的时候输入jd就可以访问
-
Tomcat配置中的Deployment -> Application Context修改
-
Tomcat配置中的Server里勾选After launch表示自动打开浏览器
-
在浏览器输入localhost:8080/对外访问路径/类上面的注解里的访问路径
HttpServletRequest
-
主要用来接受客户端发送过来的请求信息(请求的参数、发送的头信息)
-
service()方法中形参接受的是HttpServletRequest接口的实例化对象,表示该对象主要应用在HTTP协议上,该对象是由Tomcat封装好传递过来的
-
常用方法
-
getRequestURL():获取请求时的完整路径(从http开始,到“?”结束)
-
getRequestURL():获取请求参数时的完整路径(从http开始,到“?”结束)
-
getRequestURI():获取请求时的部分路径(项目名称开始,到“?”结束)
-
getQueryString():获取请求行中的参数字符串(从“?”后面开始,到最后的字符串)
-
getMethod():获取请求方式(GET和POST)
-
getProtocol():获取协议版本
-
getContextPath():获取项目站点名(项目对外访问路径)
-
getParameter():获取指定名称的参数值,返回字符串(重点!!!)
-
getParameterValues():获取指定名称的参数的所有参数值,返回字符串数组(用于复选框)
-
-
作用域
-
通过该对象可以在一个请求中传递数据,作用范围:在一次请求中有效,即服务器跳转有效(请求转发跳转时有效)
-
-
request域对象中的数据只在一次请求中有效,经过请求转发,request域中的数据依然存在,可以在请求转发的过程中可以通过request来传输/共享数据
请求转发
-
请求转发是一种服务器的行为,当客户端请求到达后,服务器进行转发,此时会将请求对象进行保存,地址栏中的URL地址不会改变,得到响应后,服务器端再将响应发送给客户端,从始至终只有一个请求发出
-
特点:
-
服务端行为
-
地址栏不改变
-
从始至终只有一个请求
-
req数据可以共享,只能请求到web下的资源(不包括WEB-INF目录)
-
请求中的乱码问题
Tomcat8及以上版本 Tomcat7及以下版本 GET请求 没有乱码 有乱码 POST请求 有乱码 有乱码
-
GET请求在Tomcat7及以下版本会出现乱码
-
设置编码格式:new String(req.getParameter(name).getBytes("ISO-8859-1"),"UTF-8")
-
此方式只在Tomcat7及以下版本的GET请求中使用,Tomcat8及以上版本不要使用(否则会出现乱码)
-
-
POST请求无论什么版本的服务器,POST请求都会出现乱码
-
因此设置编码格式:req.setCharacterEncoding("UTF-8");
-
此方式只针对post请求,对get请求没有效果
-
-
由于在解析过程中默认使用的编码方式为ISO-8859-1,此编码不支持中文,所以解析时会出现乱码
HttpServletResponse
-
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象和代表响应的对象response对象
-
request和response对象代表请求和响应
-
获取客户端需要通过request对象,向客户端输出数据需要通过response对象
-
HttpServletResponse主要用于服务器对客户端的请求进行响应,将Web服务器处理后的结果返回给客户端
-
service()方法中形参接受的是HttpServletResponse接口的实例化对象,这个对象封装了向客户端发送给数据、发送响应头、发送响应状态码的方法
响应数据
-
接收到客户端请求后,可以通过HttpServletResponse对象直接进行响应,需要获取输出流:
-
getWriter():获取字符流(只能响应回字符)
-
getOutputStream():获取字节流(能响应一切数据 )
-
两者不能同时使用
-
响应乱码问题
-
在响应中,如果响应的内容包含中文,有可能出现乱码
-
同时设置客户端和服务端的编码格式:resp.setContentType("text/html;charset=UTF-8");
重定向
-
重定向是一种服务器指导,客户端的行为。客户端发出第一个请求,被服务器接受处理后,服务器会进行响应,同时会给客户端一个新的地址,当客户端接收到响应后,会立刻自动根据服务器给出的新的地址发起第二个请求,服务器接收请求并作出响应,重定向完成
-
特点
-
服务端指导,客户端行为
-
地址栏会改变
-
存在两次请求,因此req域数据不共享
-
可以重定向到任何资源(不包括WEB-INF目录)
-
请求转发和重定向的区别
-
请求转发的地址栏不会发生改变,重定向的地址栏会发生改变
-
请求转发是服务端内部进行跳转,数据不会丢失;重定向是客户端二次跳转,数据会丢失
-
请求转发只有一次请求,重定向有两次请求
-
请求转发是request对象可共享,重定向时request对象不共享
-
请求转发时的地址只能是当前站点下(当前项目下)的资源,重定向可以是任何地址
Cookie
-
Cookie是浏览器提供的一种技术,通过服务器的程序能将一些只须保存在客户端,或者在客户端进行处理的数据,放在本地计算机上,不需要网络传输,从而提高网页处理效率,减少服务器的负载。但是由于Cookie是服务器保存在客户端的信息,安全性很差,比如登录网页时保存密码
-
网站为识别用户身份,进行Session跟踪而存储在本地终端上的加密数据,由客户端计算机暂时或永久保存的信息
-
第一次登陆后服务器返回Cookie给浏览器,浏览器保存在本地,当第二次发送请求的时候,浏览器会自动把上次请求的Cookie和数据发送给服务器,减少数据的传送
-
客户端向服务器发送一个请求时,服务器会发送一个Cookie,浏览器将Cookie保存
-
保存方式有两种:①浏览器将Cookie保存在内存中;②保存在客户端的硬盘中
-
-
Cookie到期时间:
-
默认为当前浏览器关闭即失效,可以手动设置cookie有效时间
-
通过setMaxAge()设定时间,单位秒
-
负整数:表示不存储该Cookie,cookie的maxAge默认值为-1,表示只在浏览器内存中存活,关闭浏览器就会失效
-
正整数:表示存储的秒数,浏览器会把Cookie保存在硬盘上,关闭浏览器或者重启电脑cookie也会存活相应的时间
-
0:表示删除该cookie,如果原来浏览器保存了这个Cookie,可以删除此Cookie,无论在浏览器中还是在客户端硬盘上都会删除此Cookie
-
-
-
注意点:
-
cookie只针对同一个电脑的同一个浏览器,换电脑或者换浏览器都会失效
-
Cookie不能存中文,如果有中文则通过URLEncoder.encode()进行编码,获取时通过URLDecoder.decode()解码,两种方法已经不建议使用了,一般Cookie不存放中文
-
如果服务器发送同名的Cookie会覆盖原有的Cookie
-
浏览器对Cookie的存储数量是有限的,不同浏览器存储的上限不同。Cookie存储的大小有限,4k左右
-
Cookie路径
-
当前服务器下任何项目的任意资源可获取Cookie对象
-
当前项目下的资源可获取Cookie对象
-
指定项目下的资源可获取Cookie对象
-
指定目录下的资源可获取Cookie对象
-
只有访问的路径中包含Cookie对象的path值,才可以获取到该Cookie对象
HttpSession
-
对于服务器,每一个连接到它的客户端都是一个session,servlet容器使用此接口创建HTTP客户端和HTTP服务器之间的对话
-
会话将保留指定的时间段,跨多个连接或来自用户的页面请求
-
一个会话通常对应一个用户,该用户可能多次访问一个站点,可通过此接口查看和操作有关的会话信息
-
session无论客户端还是服务器都可以感知到,若重新打开一个浏览器,则无法取得之前设置的session,因为每一个session只保存在当前的浏览器中,并在相关页面取得
-
作用:标识一次会话,并在一次会话期间共享数据
session域对象
-
Session用来表示一次会话,在一次会话中数据是可以共享的,这时session作为域对象存在
session对象的销毁
-
默认生效时间:当客户端第一次请求servlet并操作session时,session对象生成,Tomcat中session默认存活30min
-
若在30min内没有任何操作,则session对象自动销毁
-
若30min内一旦有操作,则会重新计时(比如网页的重新登录)
-
-
在web.xml中设定到期时间(一般不建议修改),单位:min
<session-config> <session-timeout>30</session-timeout> </session-config>
-
程序中设定到期时间
-
setMaxInactiveInterval()方法,参数传上整数,表示最大不活动的时间,单位:s
-
-
立即销毁session
-
invalidate()让session立刻失效
-
-
关闭浏览器即失效
-
session底层依赖cookie,cookie对象默认只在浏览器内存中存活,关闭浏览器即失效
-
-
关闭服务器即失效
ServletContext
-
每一个web应用都有且仅有一个ServletContext对象,又称Application对象,该对象与应用程序相关
-
在web容器启动的时候,会为每一个web应用程序创建一个对应的ServletContext对象
-
ServletContext对象的作用:
-
作为域对象用来共享数据,此数据在整个应用程序中共享
-
该对象保存了当前应用程序的相关信息,可以获取当前服务器信息、获取资源的真实路径等
-
-
ServletContext也可当作域对象来使用,通过向ServletContext中存取数据,使整个应用程序共享某些数据
-
不建议存放过多的数据,因为ServletContext中的数据一旦存储进去没有手动移除将会一直保存
-
Servlet三大域对象
-
request域对象:
-
在一次请求中有效;请求转发有效;重定向失效
-
-
response域对象:
-
在一次会话中有效;请求转发有效;重定向有效;session销毁后失效
-
-
servletContext域对象:
-
整个应用程序中有效;服务器关闭失效
-