Servlet入门 MVC实战项目 仓储管理系统
- JavaWeb入门介绍
- Http协议
- Http请求数据格式
- Http响应数据格式
- Web实战Demo:自定义服务器
- 对比Https协议
- 总结
Redis章节复习已经过去,新的章节JavaWeb开始了,这个章节中将会回顾JavaWeb实战项目 仓储管理
代码会同步在我的gitee中去,觉得不错的同学记得一键三连求关注,感谢:
JavaWeb优化-链接: JavaWebProject
JavaWeb入门介绍
Web是全球广域网,也称为万维网(www),能够通过浏览器访问的网站。
对我们而言:JavaWeb就是用Java技术来解决相关web互联网领域的技术。
- 我们平时都是通过浏览器向服务器发起请求,比如:登录,购买,注册等请求
- 获取服务器给我们的响应数据和资源展示;
- 静态web资源(如html 页面、css):指web页面中供人们浏览的数据始终是不变。
- 动态web资源:指web页面中供人们浏览的数据是由程序产生的,不同时间点访问web页面看到的内容各不相同。常用动态web资源开发技术:JSP/Servlet、ASP、PHP等,在Java中,动态web资源开发技术统称为Javaweb。
我们对Web的操作都是基于HTTP协议来进行传输数据的。
HTTP(超文本传送协议)是在客户程序(如浏览器)与服务器程序之间进行交互所使用的协议。
HTTP是面向事务的应用层协议,它使用TCP连接进行可靠传输,服务器默认监听在80端口。
简单来说,HTTP协议就是客户端和服务器交互的一种通迅的协议(格式)。HTTP的诞生主要是为了能够让文档之间相互关联,形成超文本可以互相传阅。
Http就是Web通信的基础。
引进一个新的概念:
B/S 架构:Browser/Server,浏览器/服务器 架构模式,它的特点是,客户端只需要浏览器,应用程序的逻辑和数据都存储在服务器端。浏览器只需要请求服务器,获取Web资源,服务器把Web资源发送给浏览器即可。
Http协议
- HTTP协议:主要定义通信规则
- HyperText Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则。
- 浏览器发送请求给服务器,服务器响应数据给浏览器,这整个过程都需要遵守一定的规则,之前大家学习过TCP、UDP,这些都属于规则,这里我们需要使用的是HTTP协议,这也是一种规则。
- 需要注意的是:在Web通信的过程中,不仅仅是需要HTTP协议的,还会涉及到其他的协议的。比如:DNS、FTP等等;
HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤:1)建立TCP连接、2)Web浏览器向Web服务器发送请求行、3)发送请求头、4)(服务器)发送状态行、5)发送响应头、6)发送响应数据->7)断TCP连接
web服务器解析协议,得到请求数据,发送响应;我们最常用的web服务器就是tomcat;
我们给出一个基本的请求与响应展示(F12快捷键):
HTTP主要就是学习请求和响应数据的具体格式内容
HTTP协议有它自己的一些特点,分别是:
-
基于TCP协议: 面向连接,安全
TCP是一种面向连接的(建立连接之前是需要经过三次握手)、可靠的、基于字节流的传输层通信协议,在数据传输方面更安全。
-
基于请求-响应模型的:一次请求对应一次响应
请求和响应是一一对应关系
-
HTTP协议是无状态协议:对于事物处理没有记忆能力。每次请求-响应都是独立的
无状态指的是客户端发送HTTP请求给服务端之后,服务端根据请求响应数据,响应完后,不会记录任何信息。这种特性有优点也有缺点,
- 缺点:多次请求间不能共享数据
- 优点:速度快
请求之间无法共享数据会引发的问题,如:
- 京东购物,
加入购物车
和去购物车结算
是两次请求, - HTTP协议的无状态特性,加入购物车请求响应结束后,并未记录加入购物车是何商品
- 发起去购物车结算的请求后,因为无法获取哪些商品加入了购物车,会导致此次请求无法正确展示数据
具体使用的时候,我们发现京东是可以正常展示数据的,原因是Java早已考虑到这个问题,并提出了使用
会话技术(Cookie、Session)
来解决这个问题。具体如何来做,我们后面会详细讲到。刚才提到HTTP协议是规定了请求和响应数据的格式,那具体的格式是什么呢?
Http请求数据格式
请求数据总共分为三部分内容,分别是请求行、请求头、请求体
Http响应数据格式
响应数据总共分为三部分内容,分别是响应行、响应头、响应体
Web实战Demo:自定义服务器
package com.itheima;
import sun.misc.IOUtils;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
/*
自定义服务器
*/
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(8080); // 监听指定端口
System.out.println("server is running...");
while (true){
//ServerSocket的accept()方法从连接请求队列中取出一个客户的连接请求,然后创建与客户连接的Socket对象,并将它返回。如果队列中没有连接请求,accept()方法就会一直等待,直到接收到了连接请求才返回。
Socket sock = ss.accept();
System.out.println("connected from " + sock.getRemoteSocketAddress());
Thread t = new Handler(sock);
t.start();
}
}
}
在客户/服务器通信模式中,服务器端需要创建监听特定端口的ServerSocket,ServerSocket负责接收客户连接请求,并生成与客户端连接的Socket。
我们通过ServerSocket创建服务器服务,监听指定端口,线程Handler请求过来,进行处理;
class Handler extends Thread {
Socket sock;
public Handler(Socket sock) {
this.sock = sock;
}
public void run() {
try (InputStream input = this.sock.getInputStream()) {
try (OutputStream output = this.sock.getOutputStream()) {
handle(input, output);
}
} catch (Exception e) {
try {
this.sock.close();
} catch (IOException ioe) {
}
System.out.println("client disconnected.");
}
}
定义 基本线程Handler,处理请求
handle方法中,请求拿到一个静态资源网页,解析并返回,这里是通过输入输出流的方式实现的
private void handle(InputStream input, OutputStream output) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(output, StandardCharsets.UTF_8));
// 读取HTTP请求:
boolean requestOk = false;
String first = reader.readLine();
if (first.startsWith("GET / HTTP/1.")) {
requestOk = true;
}
for (;;) {
String header = reader.readLine();
if (header.isEmpty()) { // 读取到空行时, HTTP Header读取完毕
break;
}
System.out.println(header);
}
System.out.println(requestOk ? "Response OK" : "Response Error");
if (!requestOk) {
// 发送错误响应:
writer.write("HTTP/1.0 404 Not Found\r\n");
writer.write("Content-Length: 0\r\n");
writer.write("\r\n");
writer.flush();
} else {
// 发送成功响应:
BufferedReader 读取资源
//读取html文件,转换为字符串
BufferedReader br = new BufferedReader(new FileReader("D:/Java-Sum/JavaWebHM/hmBook/day08-HTTP&Tomcat&Servlet/代码/http/html/a.html"));
StringBuilder data = new StringBuilder();
String line = null;
while ((line = br.readLine()) != null){
data.append(line);
}
br.close();
int length = data.toString().getBytes(StandardCharsets.UTF_8).length;
资源获取,最后返回给响应
writer.write("HTTP/1.1 200 OK\r\n");
writer.write("Connection: keep-alive\r\n");
writer.write("Content-Type: text/html\r\n");
writer.write("Content-Length: " + length + "\r\n");
writer.write("\r\n"); // 空行标识Header和Body的分隔
writer.write(data.toString());
writer.flush();
}
}
}
对比Https协议
HTTP在安全上是不足的:
- 通信使用明文【没有加密过内容的】
- 不验证通信方身份,无论是客户端和服务器,都是随意通信的
- 无法证明报文的完整性【别人监听后,可以篡改】
其实HTTPS就是披着SSL的HTTP。HTTPS 需要CA机构的颁发的SSL证书,HTTPS 的标准端口是443,而HTTP 标准端口是80。
https流程介绍
在tcp建立之后,在正式http请求(发送url)之前,会有一个ssl的握手过程。
- 客户端发起请求:首先client(客户端)会发送其支持的加密算法,并生成一个随机数C1给server(服务端);
- 服务器回应:server收到请求后,会确定加密协议算法,也会生成自己的一个随机数S1,然后随同证书一起发送给client;
- 客户端验证证书:此时客户端对证书的有效期、合法性、证书的公钥(RSA加密)等进行校验;验证完毕后会再次产生一个随机数C2,此随机数使用证书中的公钥加密(RSA加密);消息体产生的后,对它的摘要进行MD5(或者SHA1)算法加密,此时就得到了RSA签名,并通知服务端;
- 生成密钥:server收到加密后的随机数后,使用私钥(申请证书时,server生成的)将其解密并保存;得到的随机数,再用AES加密,作为密钥(此时的密钥只有客户端和服务端知道)。此时双方已经持有安全通信的必要信息(对称加密算法、随机数密钥),可以进行安全通信了。
总结
javaweb有三大组件:Servlet、Filter、Listener
我们后面将会围绕这三大组件进行学习