JavaWeb详解(第一篇)之Web入门
Posted 穆瑾轩
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWeb详解(第一篇)之Web入门相关的知识,希望对你有一定的参考价值。
JavaWeb详解(第一篇)之Web入门
1、JavaWeb概述
Internet上供外界访问的Web资源分为:静态web资源、动态web资源。
静态web资源(如html 页面、css):指web页面中供人们浏览的数据始终是不变。
动态web资源:指web页面中供人们浏览的数据是由程序产生的,不同时间点访问web页面看到的内容各不相同。常用动态web资源开发技术:JSP/Servlet、ASP、php等,在Java中,动态web资源开发技术统称为Javaweb。
我们绝大多数的Web应用都是基于HTTP来进行开发的。我们对Web的操作都是通过HTTP协议来进行传输数据的。HTTP(超文本传送协议)是在客户程序(如浏览器)与服务器(WWW)程序之间进行交互所使用的协议。HTTP是面向事务的应用层协议,它使用TCP连接进行可靠传输,服务器默认监听在80端口。
简单来说,HTTP协议就是客户端和服务器交互的一种通迅的协议(格式)。HTTP的诞生主要是为了能够让文档之间相互关联,形成超文本可以互相传阅。可以说,Http就是Web通信的基础。
2、HTTP概述
2.1、HTTP基础概念
计算机通信诞生之初,系统化与标准化未受到重视,不同厂商只出产各自的网络来实现通信,这样就造成了对用户使用计算机网络造成了很大障碍,缺乏灵活性和可扩展性。为解决该问题,ISO(国际标准化组织)制定了一个国际标准OSI(开放式通信系统互联参考模型),也称为七层模型,但是仅仅是理论基础。实际上大多人都是使用TCP/IP的分层结构。
分层的目的就是为了将困难的问题简单化,有助于我们理解且将不同层次处理的问题进行解耦。TCP/IP网络模型,将网络分为:网络接口层(网络访问层)、网络层、传输层、应用层。
TCP/IP协议族是一组协议的集合,也叫互联网协议族,用来实现互联网上主机之间的相互通信。TCP/IP并非ISO指定,是由IETF(国际互联网工程任务组)建议、致力推进标准化的一种协议,现已成为业界标准协议。
而HTTP协议是在最上层,也就是应用层。也是最贴近我们开发Web软件的一个层次。
2.2、Web通信概述
在Web通信的过程中,不仅仅是需要HTTP协议的,还会涉及到其他的协议的。比如:DNS、FTP等等;HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤:1)建立TCP连接、2)Web浏览器向Web服务器发送请求行、3)发送请求头、4)(服务器)发送状态行、5)发送响应头、6)发送响应数据->7)断TCP连接
2.2.1、HTTP1.0和HTTP1.1的区别
在HTTP1.0协议中,客户端与web服务器建立连接后,只能获得一个web资源。如果容量很少的文本传输是没有问题的。但是如果我们访问一个网页,该网页有非常多的图片。请求一个图片也算一个HTTP请求了。这样非常浪费资源。
HTTP1.1协议,允许客户端与web服务器建立连接后,在一个连接上获取多个web资源。
HTTP1.1版本新特性:
1)默认持久连接:只要客户端服务端任意一端没有明确提出断开TCP连接,就一直保持连接,可以发送多次HTTP请求;
2)管线化:客户端可以同时发出多个HTTP请求,而不用一个个等待响应,就能够继续发送第二次请求
3)断点续传:利用HTTP消息头使用分块传输编码,将实体主体分块传输。
注:http1.0 称为短连接,http1.1 称为长连接。所谓长和短指的是:持续时间,长连接30s,短连接是发送完数据就断掉。
2.2.2、DNS域名系统
我们访问网站,其实都是通过IP来访问的,但是成千上万的网站都需要记忆其服务器的IP,那实在太难了。人们为了便于记忆,于是就出现了域名。(如:www.baidu.com)
域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。计算机通信只认的是我们的主机地址(IP),有了目标后就需要和目标之间建立连接。
2.2.3、TCP协议
TCP(Transmission Control Protocol,传输控制协议)是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。
传输连接有三个阶段,即:连接建立、数据传送、连接释放。
TCP协议采用了三次握手的方式来保证数据的准确运输,采用三报文握手主要是为了防止已失效的连接请求报文段突然又传送到了,因而产生错误。这样也保证了数据传输是可靠的。连接成功了就可以开始传输数据了。
2.2.4、HTTP协议
HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息URL,全称是UniformResourceLocator, 中文叫统一资源定位符,是互联网上用来标识某一处资源的地址。
HTTP的报文结构有两类报文:请求报文、响应报文。
2.2.5、Http请求报文
客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送了一个http请求。一个完整的请求包括如下内容:一个请求行、请求头(首部字段)、空行、实体主体,其中请求头和实体内容是可选的,请求头和实体内容之间用空行隔开。
请求行:用于描述客户端的请求方式、请求资源名称以及使用的HTTP协议的版本号
请求头:客户端请求哪台主机以及客户端的一些环境信息
HTTP请求中的常用头:
Accept: text/html,image/* 【浏览器告诉服务器,它支持的数据类型】
Accept-Charset: ISO-8859-1【浏览器告诉服务器,它支持哪种字符集】
Accept-Encoding: gzip,compress 【浏览器告诉服务器,它支持的压缩格式】
Accept-Language: en-us,zh-cn 【浏览器告诉服务器,它的语言环境】
Host: localhost:8080 【告诉服务器,客户机想访问的主机名】
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:89.0)...【浏览器告诉服务器,浏览器的内核是什么】
Content-Type: application/x-www-form-urlencoded【内容类型】
Content-Length: 29【内容长度】
Connection: keep-alive【告诉服务器,是保持连接或者断开连接, keep-alive保持连接,而close断开连接,如果使用爬虫模拟的请求头这个就是close】
Referer: http://localhost:8080/examples/servlets/servlet/CookieExample【浏览器告诉服务器,客户机是从哪个页面来的---反盗链】
Cookie: qq=qqq【浏览器告诉服务器,带来的Cookie是什么】
谷歌浏览器中还会有:
If-Modified-Since: Fri, 11 Dec 2020 02:51:39 GMT【浏览器告诉服务器,缓存数据的时间】 sec-ch-ua-platform: "Windows"【当前客户端运行的环境】
注:反盗链,可以用于控制越级访问页面,不允许重非指定的页面进入
//获取用户浏览器Referer,如果不是我们要的则返回一个错误
String referer=request.getHeader("Referer");
if(referer==null||!referer.startsWith("http://localhost:8088/examples/servlets/servlet/CookieExample")){
response.sendRedirect("/examples/servlets/servlet/error");
return;
}
2.2.5.1、请求方式
我们知道常用的提交方式有POST和GET方法,其实请求方式还有:HEAD、OPTIONS、DELETE、TRACE、PUT
GET:用于请求访问已经被URI(统一资源标识符)识别的资源,可以通过URL传参给服务器。
POST:用于传输信息给服务器,主要功能与GET方法类似,但一般推荐使用POST方式。
PUT: 传输文件,报文主体中包含文件内容,保存到对应URI位置。
HEAD: 获得报文首部,与GET方法类似,只是不返回报文主体,一般用于验证URI是否有效。
DELETE:删除文件,与PUT方法相反,删除对应URI位置的文件。
OPTIONS:查询相应URI支持的HTTP方法。
我们也知道GET是用来获取数据的,POST是用来提交数据的。不管POST或GET,都用于向服务器请求某个WEB资源,这两种方式的区别主要表现在数据传递上,客户端通过这两种方式都可以带一些数据给服务器。
例如:GET /mail/1.html?name=abc&password=xyz HTTP/1.1
GET方式的特点:GET方式没有实体主体的,它都是在URL地址后附带的参数的,其数据容量不能超过1K。
POST方式特点:可以在请求的实体主体中向服务器发送数据,传送的数据量无限制。
2.2.5.2、Http响应报文
一个HTTP响应代表服务器向客户端回送的数据,它包括:一个状态行、响应头、空行以及实体主体 ,其中的一些响应头和实体内容都是可选的,响应头和实体内容之间要用空行隔开。
状态行:用于描述服务器对请求的处理结果,格式: HTTP版本号 状态码 原因叙述<CRLF>,例如:HTTP/1.1 200 OK 或者 HTTP/1.1 302
响应头:用于描述服务器的基本信息以及数据的描述,服务器通过这些数据的描述信息可以通知客户端如何处理回送的数据。
实体主体:代表服务器向客户端回送的数据。
HTTP响应中的常用头:
Location: /examples/servlets/ 【这个头配合302状态码使用,让浏览器重新定位到url】
Content-Type: text/html;charset=UTF-8【内容格式text/html; 编码UTF-8】
Content-Length: 829 【告诉浏览器回送的数据大小80节】
Date: Fri, 08 Oct 2021 06:53:34 GMT 【告诉浏览器服务器系统时间】
Connection: keep-alive 【响应完后保持连接(或者close断开)】
Set-Cookie: qq=qqq; Path=/examples/; SameSite=Strict 【服务器告诉浏览器要保存Cookie】
Expires: -1 【告诉浏览器如何缓存页面IE,-1不要设置缓存】
Cache-Control: no-cache 【告诉浏览器如何缓存页面火狐,no-cache不要设置缓存】
Pragma: no-cache 【告诉浏览器如何缓存页面,no-cache不要设置缓存】
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT【服务器告诉浏览器该资源上次更新时间】 Content-Disposition: attachment; filename=aaa.zip 【告诉浏览器,有文件下载】
Refresh: 1;url=百度一下,你就知道 【过多久去,刷新到 百度一下,你就知道】 Server:apache tomcat【服务器告诉浏览器,服务器的型号是什么】
扩展:Refresh的应用
我们经常看到这种页面,就是一个网站跳转到另外一个页面,如果几秒钟未跳转请点击链接。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<!--设置3秒刷新-->
<!--<meta http-equiv="Refresh" content="3">-->
<!--设置3秒刷新-->
<meta http-equiv="Refresh" content="3;url=https://www.baidu.com/">
<title></title>
</head>
<body>
Hello
</body>
</html>
案例效果:
2.2.6、Http响应状态
状态码 | 含义 |
---|---|
100~199 | 表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程 |
200~299 | 表示成功接收请求并已完成整个处理过程,常用: 200(正常处理) 204(成功处理,但服务器没有新数据返回,显示页面不更新) |
300~399 | 为完成请求,客户需进一步细化请求。例如,请求的资源已经移动一个新地址,常用: 302(请求的资源临时分配了新的URI中,URL地址没变【转发】) 307(与302相同,但不会把POST请求变成GET) 304(发送了附带请求,但不符合条件【返回未过期的缓存数据】) |
400~499 | 客户端的请求有错误,常用: 404(服务器没有这个资源) 403(没有权限访问) |
500~599 | 服务器端出现错误,常用 : 500(内部资源出错了) 503(服务器正忙) |
3、HTTPS简述
HTTP在安全上是不足的:
-
通信使用明文【没有加密过内容的】
-
不验证通信方身份,无论是客户端和服务器,都是随意通信的
-
无法证明报文的完整性【别人监听后,可以篡改】
其实HTTPS就是披着SSL的HTTP。HTTPS 需要CA机构的颁发的SSL证书,HTTPS 的标准端口是443,而HTTP 标准端口是80。
3.1、HTTPS工作原理简诉
在tcp建立之后,在正式http请求(发送url)之前,会有一个ssl的握手过程。
-
一、客户端发起请求:首先client(客户端)会发送其支持的加密算法,并生成一个随机数C1给server(服务端);
-
二、服务器回应:server收到请求后,会确定加密协议算法,也会生成自己的一个随机数S1,然后随同证书一起发送给client;
-
三、客户端验证证书:此时客户端对证书的有效期、合法性、证书的公钥(RSA加密)等进行校验;验证完毕后会再次产生一个随机数C2,此随机数使用证书中的公钥加密(RSA加密);消息体产生的后,对它的摘要进行MD5(或者SHA1)算法加密,此时就得到了RSA签名,并通知服务端;
-
四、生成密钥:server收到加密后的随机数后,使用私钥(申请证书时,server生成的)将其解密并保存;得到的随机数,再用AES加密,作为密钥(此时的密钥只有客户端和服务端知道)。此时双方已经持有安全通信的必要信息(对称加密算法、随机数密钥),可以进行安全通信了。
以上是关于JavaWeb详解(第一篇)之Web入门的主要内容,如果未能解决你的问题,请参考以下文章
JavaWeb入门详解(第三篇)web服务器之Tomcat简介
JAVAWEB开发之Spring详解之——Spring的入门以及IOC容器装配Bean(xml和注解的方式)Spring整合web开发整合Junit4测试