JavaWeb(一) 关于http协议以及原理详细解答

一.常见的两种软件结构

网络中有很多的计算机,它们直接的信息交流,我们称之为:交互。 在互联网交互的过程的有两个非常典型的交互方式——B/S 交互模型和C/S 交互模型。也称为B/S结构和C/S结构。

1.C/S架构

C/S 是 Client/Server 的缩写。服务器通常采用高性能的 PC、工作站或小型机,并采用大型数据库系统,如 Oracle、Sybase、InFORMix 或 SQLServer。客户端需要安装专用的客户端软件

C/S结构可以看做是胖客户端架构。客户端实现绝大多数的业务逻辑处理和界面展示,作为

客户端的部分需要承受很大的压力,充分利用客户端的资源,因此对客户机的要求较高

2.B/S架构

B/S是 Brower/Server 的缩写,客户机上只要安装一个浏览器(Browser),如 NetscapeNavigator 或 InternetExplorer,服务器安装 Oracle、Sybase、InFORMix 或 SQLServer 等数据库。在这种结构下,用户界面完全通过 WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现。浏览器通过WebServer 同数据库进行数据交互

B/S结构可以看作是瘦客户端,只是把显示的较少的逻辑交给了Web浏览器,事务逻辑数

据处理在放在了Server端,这样就避免了庞大的胖客户端,减少了客户端的压力。B/S结构

的系统无需特别安装,只有Web浏览器即可

3.两者区别

相同点:

  1. 都是基于请求-响应交互模型,即:

浏览器(客户端) 向 服务器发送 一个 请求。服务器 向 浏览器(客户端)回送 一个 响应 。

  1. 必须先有请求 再有响应

  2. 请求和响应成对出现

不同点:

  1. 实现C/S结构需要用户在自己的操作系统安装各种客户端软件(百度网盘、腾讯QQ等);实现B/S结构,只需要用户在操作系统中安装浏览器即可。

在一定程度上,B/S结构可以理解为一个特殊的C/S结构

  1. B/S具有分布性特点,可以随时随地进行查询、浏览等业务处理。

  2. B/S升级维护便捷,无需升级多个客户端,升级服务器即可,就可以实现所有用户的同

步更新。

4.对安全要求不同

  • C/S 一般面向相对固定的用户群,对信息安全的控制能力很强.一般高度机密的信息系统采用 C/S 结构适宜.可以通过 B/S 发布部分可公开信息;
  • B/S 建立在广域网之上,对安全的控制能力相对弱,可能面向不可知的用户;

JavaEE开发的应用软件属于B/S结构的软件,是以浏览器作为软件的呈现界面的。

二.http和https协议

1.什么是http

Http是超文本传输协议(Http,HyperText Transfer Protocol),是一个基于请求与响应模式的、无状态的、应用层的协议。它的作用是从www服务器传输超文本到本地浏览器,浏览器再解析超文本,将解析后的超文本呈现成网页,供用户浏览

HTTP 原理

① 客户端的浏览器首先要通过网络与服务器建立连接,该连接是通过TCP 来完成的,

一般 TCP 连接的端口号是80。 建立连接后,客户机发送一个请求给服务器,请求方

式的格式为:统一资源定位符(URL)、协议版本号,后边是 MIME 信息包括请求修

饰符、客户机信息和许可内容 。

② 服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议

版本号、一个成功或错误的代码,后边是 MIME 信息包括服务器信息、实体信息和可

能的内容 。

2.http与TCP的联系

我们都知道,TCP在网络中是传输层,http是应用层;我们在传输数据时,可以只使用(传输层)TCP/IP协议,但是那样的话,如果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议

Http连接是一种短连接,是一种无状态的连接。

短连接:

无状态是指浏览器每次向服务器发起请求的时候,不是通过一个连接,而是每次都建立一个新的连接。

每次请求结束后,连接就关闭,相关的内容就释放了

相反

长连接指的是:

正常的连接在服务器进程中.能保持住这个连接并且在内存中记住一些信息状态。举例就是:socket在使用TCP协议时,我们自己可以通过代码区控制什么时候打开连接什么时候关闭连接,只要我们不通过代码把连接关闭,这个连接就会在客户端和服务端的进程中一直存在,相关状态数据会一直保存着。

3.https

HTTPS:是以安全为目标的 HTTP 通道,是 HTTP 的安全版。HTTPS 的安全基础是 SSL。SSL 协议位于 TCP/IP 协议与各种应用层协议之间,为数据通讯提供安全支持。SSL 协议可分为两层:SSL 记录协议(SSL Record Protocol),它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。SSL 握手协议(SSL Handshake Protocol),它建立在 SSL 记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。

HTTPS 在HTTP 的基础下加入SSL 层,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL。 HTTPS 存在不同于 HTTP 的默认端口及一个加密/身份验证层(在 HTTP与 TCP 之间)。这个系统提供了身份验证与加密通讯方法。现在它被广泛用于万维网上安全敏感的通讯,例如交易支付等方面

HTTPS 协议是由 HTTP 加上 TLS/SSL 协议构建的可进行加密传输、身份认证的网络协

议,主要通过数字证书、加密算法、非对称密钥等技术完成互联网数据传输加密,实

现互联网传输安全保护。

HTTPS 原理

① 客户端将它所支持的算法列表和一个用作产生密钥的随机数发送给服务器;

② 服务器从算法列表中选择一种加密算法,并将它和一份包含服务器公用密钥的证书

发送给客户端;该证书还包含了用于认证目的的服务器标识,服务器同时还提供了一

个用作产生密钥的随机数 ;

③ 客户端对服务器的证书进行验证(有关验证证书,可以参考数字签名),并抽取服

务器的公用密钥;然后,再产生一个称作 pre_master_secret 的随机密码串,并使用服

务器的公用密钥对其进行加密(参考非对称加 / 解密),并将加密后的信息发送给服

务器 ;

④ 客户端与服务器端根据 pre_master_secret 以及客户端与服务器的随机数值独立计

算出加密和MAC密钥;

⑤ 客户端将所有握手消息的 MAC 值发送给服务器;

⑥ 服务器将所有握手消息的 MAC 值发送给客户端

区别:

总体来说两者的区别就是:

HTTPS 主要由两部分组成:HTTP + SSL / TLS,也就是在 HTTP 上又加了一层处理加

密信息的模块。服务端和客户端的信息传输都会通过 TLS 进行加密,所以传输的数据都是加密后的数据。

三.URL

每一信息资源都有统一的且在网上唯一的地址,该地址就叫URL(UniformResource Locator,统一资源定位符),它是WWW的统一资源定位标志,就是指网络地址。

  • URL由三部分组成:资源类型、存放资源的主机域名、资源文件名。
  • 也可认为由4部分组成:协议、主机、端口、路径

image-20231012213317635

四.WEB资源

静态资源

指web页面中供人们浏览的数据始终是不变。比如:HTML、CSS、JS、图片、音频、视频

动态资源

指web页面中供人们浏览的数据是由程序产生的,不同时间点访问web页面看到的内容各

不相同。 比如:你在不同时间搜索微博的热门话题内容是不一样的,每天的天气情况也是

变化的。这些数据由程序生成,JSP/Servlet、ASP、PHP等技术都可以完成

简单来说:

静态资源的数据都是写死在页面上的固定不变。

动态资源浏览器访问的结果是变化的(动态web资源你的数据都是程序读取数据库、

xml等文件生成的数据)。

五.常见的WEB容器

Java Web(以浏览器为软件界面的应用程序称为Java Web)开发中涵盖了JSP、Servlet以及各

种框架技术,而这些技术开发的应用程序就需要运行在Web容器中。

  1. WebLogic

Oracle公司的产品,是目前应用最广泛的Web服务器,支持J2EE规范。WebLogic是用于

开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务

器。

  1. WebSphere

IBM公司的WebSphere,支持JavaEE规范。WebSphere 是随需应变的电子商务时代的最

主要的软件平台,可用于企业开发、部署和整合新一代的电子商务应用。

  1. Glass Fish

最早是Sun公司的产品,后来被Oracle收购,开源,中型服务器。

  1. JBoss

JBoss公司产品,开源,支持JavaEE规范,占用内存、硬盘小,安全性和性能高。

  1. Tomcat

中小型的应用系统,免费开源,支持JSP和Servlet。

  1. jetty

java常用的是tomcat

六.IDE创建web项目

1.新建web项目

2.打开 project structure

点击+,添加web项目

image-20231012214827075

3.这里发现底下警告:not include in any artifacts,不用理会,一会在添加

image-20231012215119612

4.导入API,添加到库

image-20231012215813981

5.导入tomcat

image-20231012215926303

image-20231012220035993

6.再次进入到项目结构这里,点 from Modules,添加你的项目,这里我的项目名称叫web_1

image-20231012220155306

7.新建servlet类,这里使用了web3的新特性(后面会解释),注解(/ss)是你的浏览器访问路径

使用代码测试

步骤:

  1. 创建 LifeServlet 类,继承 HttpServlet

  2. 复写 init 、 service 、 destroy 方法

  3. 访问 servlet 测试初始化 LifeServlet

  4. 关闭服务器测试销毁 LifeServlet

@WebServlet("/ss")
public class Myservlet implements Servlet {

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

        System.out.println("loading");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

        System.out.println("des");

    }
}

运行

image-20231012220528553

因为没有写内容,所以是空白内容

image-20231012220604540

能够看到控制台初始化

image-20231012221101593

七.生命周期流程

Servlet 生命周期流程如下:

  1. 客户端(浏览器)通过 URL 请求 tomcat 服务器

  2. tomcat 服务器将 URL 解析后找到相应的项目,并查找是否有 urlPatterns ="/ss" 的 servlet 存在

  3. 查找到 servlet 后创建对象,调用 init 方法初始化 servlet

  4. tomcat 创建 request 、 response 对象,并调用 service 方法。执行成后,修改 response 并返回

  5. tomcat 将 response 解析成 http 响应格式的数据,返回给浏览器

  6. 浏览器解析,显示数据

  7. 如果 tomcat 停止,调用 destory() 方法,销毁 servlet

image-20231012221620365

也就是说,servlet在初始化一次之后,就不再创建,因此如果多次访问同一个

servlet,init方法只执行一次

八.servlet 2.5 xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
e
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<!-- 配置 servlet -->
<servlet>
<!-- servlet 名称,自定义 -->
<servlet-name>helloServlet</servlet-name>
<!-- servlet 类路径 -->
<servlet-class>com.kfm.servlet.HelloServlet</servlet-class>
</servlet>
<!-- servlet 映射 -->
<servlet-mapping>
<!-- 和要配置映射的 servlet 名一致 -->
<servlet-name>helloServlet</servlet-name>
<!-- 映射路径 -->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
  1. url-pattern定义URL

  2. servlet-class定义servlet的路径

  3. url-pattern和servlet-class通过servlet-name建立映射关系

九.javax.servlet.GenericServlet的使用

更加简洁的方式来开发servlet程序:

@WebServlet(name = "GenericServletDemo",urlPatterns = "/generic")
public class GenericServletDemo extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse
servletResponse) throws ServletException, IOException {
System.out.println("GenericServletDemo执行");
}
}