一. 面试题及剖析
1. 今日面试题
你熟悉servlet与session吗?
servlet和JSP有什么关系?
jsp有哪几个作用域?有几个内置对象?
说说session与servlet的生命周期
cookie与session的区别有哪些?
HTTP协议你熟悉吗?
说说HTTP请求的工作原理和执行流程吧
你遇到过哪些响应吗?都是什么含义?
你了解哪些请求方式?
get请求与post请求有什么区别?
如何防止post提交?
重定向和请求转发的区别有哪些?
从同一个浏览器页面发送两次请求去后台,后台如何知道这是同一个session?
2. 题目剖析
你熟悉servlet与session吗?
servlet和JSP有什么关系?
jsp有哪几个作用域?有几个内置对象?
说说session与servlet的生命周期
cookie与session的区别有哪些?
HTTP协议你熟悉吗?
说说HTTP请求的工作原理和执行流程吧
你遇到过哪些响应吗?都是什么含义?
你了解哪些请求方式?
get请求与post请求有什么区别?
如何防止post提交?
重定向和请求转发的区别有哪些?
从同一个浏览器页面发送两次请求去后台,后台如何知道这是同一个session?
2. 题目剖析
今天的面试题目,主要是考察我们的Web基础知识,基本没有什么难度,只要我们平时的基础知识稍微扎实点,很容易就能回答出来。这一块的内容,主要还是以记忆为主,需要理解的东西不是很多。而且这一块的内容,在现在的Java开发里,除了HTTP协议、Session、cookie会用到,Servlet、JSP基本都不用了。所以这一块在面试时考察的频率也并不高,大家稍微复习一下就可以。
有的小伙伴会问,既然企业里不用Servlet、JSP了,为什么还要学习它们?这不操蛋吗?其实不是这样的!我们现在开发时虽然很少直接使用Servlet了,但很多Web框架,比如经典的SpringMVC,其底层还是基于Servlet的。所以你想,如果你连Servlet是啥,怎么用都不知道,你怎么理解SpringMVC的底层原理和工作机制呢?
注意,本文主要是讲解与Web相关的面试题,并不会过多的讲解这些Web技术的具体用法。这些基础的东西,在我们上课时都已经很深入的给大家讲过了。如果你在这一块的基础很薄弱,可以给壹哥私信,或者在评论区给壹哥留言,可以免费获取Web课程的视频等资料。
受限于篇幅,在本篇文章中,壹哥先不讲解cookie和session的相关内容,我会在下一篇文章中再进行讲解。
二. Servlet
1. 简介
Servlet其实是Server Applet的简称,正式名称是“小服务程序或服务连接器”。它是一种用Java编写的服务器端应用程序,可以生成动态的Web内容,充当了用户与服务器之间的桥梁,能够处理和转发用户的请求,并将处理后的结果返回给客户端。
2. 生命周期
所谓的Servlet生命周期,其实就是从Servlet创建到销毁的整个过程,主要分为以下几个阶段:
加载类—>实例化(为对象分配空间)—>初始化(为对象的属性赋值)—>请求处理(服务阶段)—>销毁—>垃圾回收。
类加载:通过类加载器加载Servlet类到Web容器中,并解析Web请求, 创建Servlet实例:每当用户请求一个 Servlet 时,就会创建一个 Servlet 实例,每一个用户请求都会产生一个新的线程;init():该方法在第一次创建 Servlet 时被调用,执行一次性的初始化工作,只会调用一次,在后续每次用户请求时都不再调用。一般是服务器启动时(web.xml中配置load-on-startup=1,默认为0)或者第一次请求该servlet时,才会初始化一个Servlet对象;service():处理来自客户端的请求,执行主要的实际任务,把处理后的格式化响应结果返回给客户端,可以在该方法中检查 HTTP 的具体请求类型; destroy() :该方法在Servlet 生命周期结束时被调用,且只会被调用一次。我们可以在该方法中执行关闭数据库连接、停止后台线程、把 cookie 列表或点击计数器等数据写入到磁盘等清理功能; 垃圾回收:最后,Servlet由 JVM 的垃圾回收器进行垃圾回收。
所以Servlet的生命周期分为:加载阶段、实例化阶段、初始化阶段、执行服务阶段、销毁阶段。我们可以参考下图来理解Servlet的生命周期:
3. 3种转发方式
Servlet中有3种常用的转发方式来对请求进行传递,如下:
include:包含,将req和resp对象转发给url表示的对象,同时发送PrintWriter在此处写入的信息,属于转发,所以地址栏中的地址不变;
forward:请求转发,将req和resp对象转发给url表示的对象,由于是转发,所以地址栏中的地址不变;
sendRidirect:重定向,由客户端重新发起一次请求,请求地址重新指向其参数url,并再次发送req,由于是重新定位发送,地址栏中的地址会改变,这是由客户端发起的第2次请求。
三. JSP
除了Servlet,还有另一个常用的Web技术,就是JSP,接下来壹哥再带各位复习一下JSP的知识。
1. 简介
JSP全称是Java Server Pages,这是一种动态的网页开发技术,其本质就是Servlet。主要是使用JSP标签在HTML网页中插入Java代码,用于实现Java Web程序的用户界面部分。JSP和Servlet的最大不同在于,JSP是Java和HTML的混合体,侧重于视图;Servlet主要是在Java文件中进行实现,是从表示层的HTML分离出来的,主要用于控制逻辑。
2. 4个作用域
关于JSP,面试官经常会问我们JSP的4个作用域,如下:
page:只在当前用户请求的页面中有效,当前页面关闭或转到其他页面时,page对象将在响应结果返回到客户端后释放,一般操作时是使用pageContext内置对象来完成。 request:表示在当前请求中有效,request可以通过setAttribute()方法实现页面间的信息传递,也可以通过forward()方法进行页面间的跳转。只要是服务器请求转发类型的跳转,request属性就可以一直传递下去。session: 在当前会话中有效,也就是在同一台电脑上,从用户打开浏览器开始,到用户关闭浏览器结束,这中间的整个过程就是一个会话。在一个会话内,可能会进行多次访问时,在这多次访问之间传递的信息就是session作用域的范围。application:在整个应用程序中都有效,也就是当应用启动,到应用结束的这段时间,application作用域中存储的数据都是有效的,一般是通过ServletContext实现信息的存储传递。
3. 9个内置对象
关于JSP,面试官常问的另一个面试题是JSP的9个内置对象,如下:
PageContext:JSP的页面容器; request:获取用户的请求信息;response:服务器向客户端的回应信息;session: 用来保存每一个用户的信息; application: 表示所有用户的共享信息; config: 服务器配置信息,可以取得初始化参数; out:页面输出对象; page:该页面中表示出来的一个Servlet实例对象;exception:配置错误页面时使用。
四. HTTP协议
另外,面试官有时候还会考察我们关于请求协议与请求方式相关的内容,所以 接下来我们再复习一下HTTp协议。
1. 概念
HTTP(HyperText Transfer Protocol),超文本传输协议,底层基于TCP/IP协议,是一种应用于互联网的应用层协议,也是现代万维网的通信基础。目前该协议常用的版本有HTTP1.1与HTTP2.0两个版本。
具体的说,HTTP协议就是一个 客户端终端(用户) 和 服务器端(网站) 之间 请求和应答的标准(TCP)。通过使用浏览器、网络爬虫或者其它的工具,客户端发起一个HTTP请求到服务器的指定端口(默认80),我们把这个客户端称之为用户代理程序(user agent),因为是这个客户端替客户向服务器发送请求,等于是一个代理人。应答的服务器上存储着一些资源,比如HTML文件和图像、音视频等,我们把这个服务器称之为源服务器(origin server)。而在用户代理和源服务器之间又可能存在多个“中间层”,比如代理服务器、网关或者隧道(tunnel)。
2. 特点
HTTP作为基于TCP/IP协议之上的应用层协议,自身具有鲜明的特点:
基于 请求-响应 的模式:简单地说,就是客户端发起请求,服务端返回响应;
无状态保存:HTTP是一种无状态(stateless)协议,不会保存通信状态。也就是说HTTP协议自身不会对请求和响应之间的通信状态进行保存,不会对之前发送的请求或响应内容做持久化,不保留之前一切的请求或响应报文信息。也正因如此,才需要有cookie和Session这种技术来辅助保存通信状态;
无连接:就是不和每个用户建立长久的连接,每次的连接都只处理一个请求,请求一次就响应一次,并在收到客户端的应答后就断开连接。以此节省传输时间,提高并发性能。在HTTP1.1协议中,并不是请求响应后立刻就断开,而是会等几秒钟,看后续用户是否还有其他操作,若有,就继续通过之前的连接通道来收发消息;若没有,则断开连接,以此来减少短时间内建立连接的次数。
3. 工作原理(重点)
HTTP协议定义了一个Web客户端是如何从Web服务器请求Web页面,以及服务器是如何把这个Web页面返回给客户端的标准过程。该协议采用了请求/响应模型。在请求时,客户端首先会向服务器发送一个请求报文,该请求报文中会包含请求的方法、URL、协议版本、请求头部、空行和请求数据等信息。然后服务器会返回一个状态行(响应报文)作为响应结果,具体的响应内容包括协议的版本、成功或者错误代码、服务器信息、响应头部、空行和响应数据。
4. 请求报文
在上面的章节中,壹哥给大家提到了请求报文的概念,那么请求报文具体是什么样的呢?我们来看下图:
由此可知,客户端发送到服务器的请求报文,会包括如下内容:
请求行(request line):这部分用来说明请求类型,要访问的URL资源以及所使用的HTTP版本; 请求头部(header):该部分会紧接着请求行(即第一行),用来说明服务器要使用的附加信息;空行:位于请求头部后面,但这个空行是必须的;请求数据:请求主体,可以在这里添加任意的其他数据。
5. 响应报文
客户端发送完请求之后,服务器就会给客户端返回响应信息,也就是响应报文,其内容如下所示:
所以HTTP响应报文也由四个部分组成,分别是:
状态行:该部分由HTTP协议版本号, 状态码, 状态消息 组成; 消息报头:用来说明客户端要使用的一些附加信息;空行:消息报头后面的空行是必须的;响应正文:这是服务器返回给客户端的文本信息。
6. 请求/响应流程(重点)
了解了HTTP协议及其报文的基本内容之后,壹哥就根据上述HTTP请求原理,分解出HTTP的请求/响应流程,如下:
1. 客户端连接到Web服务器:一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接;
2. 发送HTTP请求:通过TCP套接字,客户端向Web服务器发送一个文本类型的请求报文,该报文由请求行、请求头部、空行和请求数据4部分组成。
3. 服务器接受请求并返回HTTP响应:Web服务器解析该请求,定位到请求资源。服务器将资源复本写到TCP套接字,由客户端读取,响应报文由状态行、响应头部、空行和响应数据4部分组成。
4. 释放连接TCP连接:若连接模式为close,则服务器会主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若 连接模式为keepalive,则该连接会保持一段时间,在该时间内会继续接收请求;
5. 客户端浏览器解析HTML内容:客户端浏览器首先解析状态行,查看表明请求是否成功的状态码。然后解析每一个响应头,响应头包括若干字节的HTML文档和文档字符集。客户端浏览器读取响应回来的HTML数据,根据HTML语法对其进行格式化,并在浏览器的窗口中显示。
所以,当我们在浏览器地址栏输入一个URL,按下回车键之后,会经历以下流程:
- 浏览器向 DNS服务器 请求解析该 URL中域名 所对应的 IP地址;
- 解析出 IP地址后,根据该 IP地址和默认的80端口,和服务器建立TCP连接;浏览器发出读取具体资源文件(URL中的path部分)的HTTP 请求,该请求报文作为 TCP 三次握手中第三个报文数据发送给服务器;服务器对浏览器的请求作出响应,并把对应的 html文本发送给浏览器;
- 释放 TCP连接;
- 浏览器将该 html文本解析并显示出来。
7. HTTP响应码
当客户端向服务器发送完请求,服务器就会返回响应信息,而所有的HTTP响应,其第一行都是状态行。状态行中依次是HTTP版本号,3位数字组成的状态码,以及描述状态的短语,彼此之间由空格分隔。其中状态代码的第一个数字代表当前响应的类型,如下:
1xx消息——请求已被服务器接收,继续处理; 2xx成功——请求已成功被服务器接收、理解、并接受;3xx重定向——需要后续操作才能完成这一请求;4xx请求错误——请求含有词法错误或者无法被执行; 5xx服务器错误——服务器在处理某个正确请求时发生错误。
我们也可以参考下表来理解这些不同响应码类型的含义:
我们在开发时,其实会遇到很具体的HTTP响应码,比如常见的200、404、500等,这些常见状态码的含义可以如下图所示:
六. 结语对于今天的内容,我觉得,只要是我教出来的学生,就今天的题目,在我平时讲课时,壹哥就已经给大家讲清楚并要求大家随堂记忆了,根本都不用专门复习。但如果你在这一块的基础比较薄弱,还是需要背一背的,另外如果你需要相关的学习资料,可以给壹哥留言或私信。
壹哥会在下一篇文章中,继续讲解Web基础相关的面试题,敬请关注哦!



