爆肝一周面试10多家中大厂后的万字总结——❤️JavaWeb篇❤️(建议收藏)

Posted 一条coding

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了爆肝一周面试10多家中大厂后的万字总结——❤️JavaWeb篇❤️(建议收藏)相关的知识,希望对你有一定的参考价值。

⭐欢迎订阅《大厂面试突击》专栏,面试10多家大厂总结出的高频面试知识,免费阶段大家赶快订阅

更多精品专栏简介点这里

⭐更多大厂全路线学习视频+笔记,PC端看左侧「关于作者」,手机端「私信」博主。

⭐老规矩,私信前请先关注,不然无法回复大家,感谢支持!

幸福,不是长生不老,不是大鱼大肉,不是权倾朝野。幸福是每一个微小的生活愿望达成。当你想吃的时候有得吃,想被爱的时候有人来爱你。

前言

哈喽,大家好,我是一条。

告诉大家一个消息,我在7月份又离职了,离职后我开始疯狂的面试,一共面了百度、字节、滴滴、美团、陌陌、58同城、汽车之家、元气森林、猿辅导,掌阅科技,美术宝、moka等10多家中大厂,最多的时候一天4面。

面完之后我发现大厂对于算法的重视程度非常之高,算法题没做出来,基本就不会再往下问了,你“八股文”再溜也没有展现的机会。

所以我开始刷leetcode,每天一道,放在了《leetcode》专栏里,趁着还没有收费,大家可以抓紧订阅一波。

但算法非一日之功可成,我们的“八股文”也不能落下。

一条根据多家公司的面试检验,将高频面试题分门别类的总结出来,包括java基础篇、javaweb篇、集合篇、jvm篇、多线程篇、框架篇、设计模式篇、数据结构篇、网络篇、操作系统篇、mysql篇、redis篇、kafka篇、ES篇、dubbo篇。Spring cloud篇、企业项目篇,由浅入深,到时有可能还会增加。

所有文章都会放在《大厂面试突击》专栏里,以后会收费,所以请大家现在抓紧订阅。


本文是❤️javaWeb篇❤️

java Web是用Java技术来解决相关web互联网领域的技术栈。Web就是网页,分为静态和动态。涉及 的知识点主要包括jsp,servlet,tomcat,http,MVC等知识,由于jsp更偏向前端。本文不做讲解。

本文特别之处

现在网络的面试题资源可以说数不胜数,但也良莠不齐。

那么,博主总结的有哪些特别之处呢?

选题

以战养战

相比于逐个知识点的去讲解,一条更偏向于用面试题的方式呈现,原因如下:

  • 节省时间,有很多朋友都是面试前临时抱佛脚,从helloworld开始讲,根本来不及好吗
  • 重点突出,有些东西面试官是不会问的,也没法问,暂时就可以不看
  • 转换思维,最重要的一点,有很多时候这个东西你知道,但一问就不会,有没有,有的评论区扣1

经验之谈

关于选题,java的知识点又多又杂,技术更新又很快。所以明白以下几点很重要:

  • 很多技术已经淘汰,所以就没必要再去看。

  • 有些技术是当下正火,面试官特别爱问。

  • 有些知识点之间存在关联关系,问完这个必问那个。

一条凭借面试了10多家大厂的经验总结最高频的知识点,让你不做无用功,事半功倍!

解答

  • 文章中大部分题目都是在面试中真实被问到的,会标明出处。
  • 对知识点的讲解都尽量简单,用生活中的小事举例说明。
  • 除了知识点讲解,还会说明这道题的考点是哪,怎么回答更加分。
  • 会从一道题延伸出多道题,理清关联关系,题目的顺序都是精心排列,由浅入深。

题目合集

HTTP网络请求方式有哪些?

出自moka、美术宝

相信这个问题都难不倒大家,但很多人答不全。

如果能回答出应用场景就完美了。

  • GET:最常用的方式,用来向服务器请求数据,没有请求体,请求参数放在URL后面。
  • POST:用于向表单提交数据,传送的数据放在请求体中。
  • PUT:用来向服务器上传文件,一般对应修改操作,POST用于向服务器发送数据,PUT用于向服务器储存数据。没有验证机制,任何人都可以操作,存在安全问题。具有幂等性。
  • DELETE:用于删除服务器上的文件,具有幂等性。同样存在安全问题。
  • HEAD:用HEAD进行请求服务器时,服务器只返回响应头,不返回响应体。与GET一样没有请求体,常用于检查请求的URL是否有效。
  • PATCH:对资源进行部分修改。与PUT区别在于,PUT是修改所有资源,替代它,而PATCH只是修改部分资源。
  • TRACE:用来查看一个请求,经过网关,代理到达服务器,最后请求的变换。因安全问题被禁用。
  • OPTIONS:当客户端不清楚对资源操作的方法,可以使用这个,具有幂等性。

GET和POST有什么区别?

高频必考题

  1. 作用不同:GET 用于获取资源,而 POST 用于传输实体主体。
  2. 参数位置不一样: GET 的参数是以查询字符串出现在 URL 中,而 POST 的参数存储在实体主体中。虽然GET的参数暴露在外面,但可以通过加密的方式处理,而 POST 参数即使存储在实体主体中,我们也可以通过一些抓包工具如(Fiddler)查看。
  3. 幂等性:GET是幂等性,而POST不是幂等性。(面试官紧接着可能就会问你什么是幂等性?如何保证幂等性?)
  4. 安全性:安全的 HTTP 方法不会改变服务器状态,也就是说它只是可读的。 GET 方法是安全的,而 POST 却不是,因为 POST 的目的是传送实体主体内容,这个内容可能是用户上传的表单数据,上传成功之后,服务器可能把这个数据存储到数据库中,因此状态也就发生了改变。

什么是幂等性?

是否具有幂等性也是一个http请求的重要关注点。

幂等性:指的是同样的请求不管执行多少次,效果都是一样,服务器状态也是一样的。具有幂等性的请求方法没有副作用。(统计用途除外)

如何保证幂等性?

假设这样一个场景:有时我们在填写某些form表单时,保存按钮不小心快速点了两次,表中竟然产生了两条重复的数据,只是id不一样。

这是一个比较常见的幂等性问题,在高并发场景下会变得更加复杂,那怎么保证接口的幂等性呢?

insert前select

插入数据前先根据某一字段查询一下数据库,如果已经存在就修改,不存在再插入。

加锁

加锁可解决一切问题,但也要考虑并发性。

主要包括悲观锁,乐观锁,分布式锁。

悲观锁的并发性较低,更适合使用在防止数据重复的场景,注意幂等性不光是防止重复还需要结果相同。

乐观锁可以很高的提升性能,也就是常说的版本号。

分布式锁应用在高并发场景,主要用redis来实现。

唯一索引

通过数据库的唯一索引来保证结果的一致性和数据的不重复。

Token

两次请求,第一请求拿到token,第二次带着token去完成业务请求。

常见的网络状态码有哪些?

出自美术宝

此题考查的是你有没有实际解决bug的经验和能力。不知道对应网络状态码的含义,解决问题的能力就会受到怀疑。

应该重点关注同一系列之间的区别,比如504和505什么区别?

网络状态码共三位数字组成,根据第一个数字可分为以下几个系列:

1xx(信息性状态码)

代表请求已被接受,需要继续处理。

包括:100、101、102

这一系列的在实际开发中基本不会遇到,可以略过。

2xx(成功状态码)

表示成功处理了请求的状态代码。

200:请求成功,表明服务器成功了处理请求。

202:服务器已接受请求,但尚未处理。

204:服务器成功处理了请求,但没有返回任何内容。

206:服务器成功处理了部分 GET 请求。

3xx(重定向状态码)

300:针对请求,服务器可执行多种操作。

301:永久重定向

302:临时性重定向

303:303与302状态码有着相同的功能,但303状态码明确表示客户端应当采用GET方法获取资源。

301和302的区别?

301比较常用的场景是使用域名跳转。比如,我们访问 http://www.baidu.com 会跳转到https://www.baidu.com,发送请求之后,就会返回301状态码,然后返回一个location,提示新的地址,浏览器就会拿着这个新的地址去访问。

302用来做临时跳转比如未登陆的用户访问用户中心重定向到登录页面。

4xx(客户端错误状态码)

400:该状态码表示请求报文中存在语法错误。但浏览器会像200 OK一样对待该状态码。

401:表示发送的请求需要有通过HTTP认证的认证信息。比如token失效就会出现这个问题。

403:被拒绝,表明对请求资源的访问被服务器拒绝了。

404:找不到,表明服务器上无法找到请求的资源,也可能是拒绝请求但不想说明理由。

5xx(服务器错误状态码)

500:服务器本身发生错误,可能是Web应用存在的bug或某些临时的故障。

502:该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。

⚠️有时候返回的状态码响应是错误的,比如Web应用程序内部发生错误,状态码依然返回200

转发和重定向有什么区别?

上面提到了重定向,那你知道什么是转发吗?

转发

A找B借钱,B没有钱,B去问C,C有钱,C把钱借给A的过程。

客户浏览器发送http请求,web服务器接受此请求,调用内部的一个方法在容器内部完成请求处理和转发动作,将目标资源发送给客户。

整个转发一个请求,一个响应,地址栏不会发生变化,不能跨域访问。

重定向

A找B借钱,B没有钱,B让A去找C,A又和C借钱,C有钱,C把钱借给A的过程。

客户浏览器发送http请求,web服务器接受后发送302状态码响应及对应新的location给客户浏览器,客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址,服务器根据此请求寻找资源并发送给客户。

两个请求,两个响应,可以跨域。

什么是跨域?如何解决跨域问题?

出自moka

考查实际开发中解决问题的能力。

什么是跨域?

跨域是针对浏览器的,由于浏览器的同源策略不能执行其他网站的脚本。那什么是同源?

同源是指域名、协议、端口均相同。只要有一个不同,就是跨域。

解决方案

  • JSONP跨域:人们发现调用js文件是不受跨域影响的,所以通过把数据装进JS来解决跨域问题。JSONP是一段参数是json格式(大多数情况)的JS代码。
  • nginx反向代理
  • HEADERS:通过修改headersAccess-Control-Allow-Origin允许所有人访问。

还有其他解决方案,但不常用,实际开发都是基于springboot注解实现。

什么是ajax?

一种「异步请求」+「局部刷新」技术。等于异步javascript 和 XML,用于创建快速动态网页。

异步请求:不需要等待当前请求返回就可以发送下一个请求。

局部刷新:无需重新加载整个网页的情况下,能够更新部分网页。

什么是Servlet

servlet是一个比较抽奖的概念,也是web部分的核心组件,大家回答这个问题一定要加入自己的理解,不要背定义。

servlet其实就是一个java程序,他主要是用来解决动态页面的问题。

之前都是浏览器像服务器请求资源,服务器(tomcat)返回页面,但用户多了之后,每个用户希望带到不用的资源。这时就该servlet上场表演了。

servlet存在于tomcat之中,用来网络请求与响应,但他的重心更在于业务处理,我们访问京东和淘宝的返回的商品是不一样的,就需要程序员去编写,目前MVC三层架构,我们都是在service层处理业务,但这其实是从servlet中抽取出来的。

看一下servlet处理请求的过程:

说一说Servlet的生命周期

Servlet生命周期分为三个阶段:

  • 初始化阶段 调用init()方法

  • 响应客户请求阶段  调用service()方法-àdoGet/doPost()

  • 终止阶段  调用destroy()方法

比较一下Listener和Filter/Servlet的区别

servlet已经介绍过,和他相似的这些你了解吗?

  • servlet是一种运行服务器端的java应用程序,工作在客户端请求与服务器响应的中间层。

  • filter是一个可以复用的代码片段,可以用来转换HTTP请求、响应和头信息。Filter不像Servlet,它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者修改从某一的响应。

  • 从字面上可以看出listener主要用来监听只用。通过listener可以监听web服务器中某一个执行动作,并根据其要求作出相应的响应。

  • servlet,filter都是针对url之类的,而listener是针对对象的操作的。

拦截器和过滤器的区别

这块的东西比较乱,给大家画个图

  • 拦截器是基于java的反射机制的,而过滤器是基于函数回调。
  • 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
  • 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
  • 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
  • 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
  • 拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。

Jsp有哪些内置对象?作用分别是什么?

  • request 用户端请求,此请求会包含来自GET/POST请求的参数
  • response 网页传回用户端的回应
  • pageContext 网页的属性是在这里管理
  • session 与请求有关的会话期
  • application servlet 正在执行的内容
  • out 用来传送回应的输出
  • config servlet的构架部件
  • page JSP网页本身
  • exception 针对错误网页,未捕捉的例外

jsp和servlet的区别、共同点、各自应用的范围?

JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。JSP编译后是“类servlet”。

Servlet和JSP最主要的不同点在于:Servlet的应用逻辑是在Java文件中,并且完全从表示层中的html里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。

JSP侧重于视图,Servlet主要用于控制逻辑。在struts框架中,JSP位于MVC设计模式的视图层,而Servlet位于控制层.

tomcat容器是如何创建servlet类实例?用到了什么原理?

当容器启动时,会读取在webapps目录下所有的web应用中的web.xml文件,然后对xml文件进行解析,并读取servlet注册信息。

然后,将每个应用中注册的servlet类都进行加载,并通过反射的方式实例化。(有时候也是在第一次请求时实例化)

在servlet注册时加上1如果为正数,则在一开始就实例化,如果不写或为负数,则第一次请求实例化。

如何解决请求和响应的乱码问题

请求

GET请求:GET请求参数是在地址后面的。我们需要修改tomcat的配置文件。需要在server.xml文件修改Connector标签,添加URIEncoding="utf-8"属性。

POST请求:post请求提交了中文的请求体,服务器解析出现问题。在获取参数值之前,设置请求的解码格式,使其和页面保持一致。

request.setCharacterEncoding("utf-8");

响应

向浏览器发送响应的时候,要告诉浏览器,我使用的字符集是哪个,浏览器就会按照这种方式来解码。

方法一:

response.setHeader("Content-Type", "text/html;charset=utf-8");

方法二:

response.setContentType("text/html;charset=utf-8");

session、cookie、token都是什么?

首先我们要明白HTTP是一种无状态协议,怎么理解呢?很简单

夏洛:大爷,楼上322住的是马冬梅家吧?
大爷:马冬什么? 
夏洛:马冬梅。 
大爷:什么冬梅啊? 
夏洛:马冬梅啊。 
大爷:马什么梅?
夏洛:行,大爷你先凉快着吧。

这段对话都熟悉吧,HTTP就是那个大爷,那如果我们就直接把“大爷”放给用户,用户不用干别的了,就不停的登录就行了。

既然“大爷不靠谱”,我们找“大娘”去吧。

哈哈哈,开个玩笑,言归正传。

为了解决用户频繁登录的问题,在服务端和客户端共同维护一个状态——会话,就是所谓session,我们根据会话id判断是否是同一用户,这样用户就开心了。

但是服务器可不开心了,因为用户越来越多,都要把session存在服务器,这对服务器来说是一个巨大的开销,这是服务器就找来了自己的兄弟帮他分担(集群部署,负载均衡)。

但是问题依然存在,如果兄弟挂了怎么办,兄弟们之间的数据怎么同步,用户1把session存放在机器A上,下次访问时负载均衡到了机器B,完了,找不到,用户又要骂娘。

这时有人思考,为什么一定要服务端保存呢,让客户端自己保存不就好了,所以就诞生了cookie,下一次请求时客户段把cookie发送给服务器,说我已经登录了。

但是空口无凭,服务器怎么知道哪个cookie是我发过去的呢?如何验证成了新的问题。

有人想到了一个办法,用加密令牌,也就是token,服务器发给客户端一个令牌,令牌保存加密后id和密钥,下一次请求时通过headers传给服务端,由于密钥别人不知道,只有服务端知道,就实现了验证,且别人无法伪造。

如果感觉博主讲的还不错,一键三连支持一下吧。

更多学习视频+笔记,PC端看左侧「关于作者」,手机端「私信」博主。

MVC与三层架构

三层架构与MVC的目标一致:都是为了解耦和、提高代码复用。MVC是一种设计模式,而三层架构是一种软件架构。

MVC

Model 模型

模型负责各个功能的实现(如登录、增加、删除功能),用JavaBean实现。

View 视图

用户看到的页面和与用户的交互。包含各种表单。 实现视图用到的技术有html/css/jsp/js等前端技术。

常用的web 容器和开发工具

Controller 控制器

控制器负责将视图与模型一一对应起来。相当于一个模型分发器。接收请求,并将该请求跳转(转发,重定向)到模型进行处理。模型处理完毕后,再通过控制器,返回给视图中的请求处。

三层架构

表现层(UI)(web层)、业务逻辑层(BLL)(service层)、数据访问层(DAL)(dao层) ,再加上实体类库(Model)

  • 实体类库(Model),在Java中,往往将其称为Entity实体类。数据库中用于存放数据,而我们通常选择会用一个专门的类来抽象出数据表的结构,类的属性就一对一的对应这表的属性。一般来说,Model实体类库层需要被DAL层,BIL层和UI层引用。

  • 数据访问层(DAL),主要是存放对数据类的访问,即对数据库的添加、删除、修改、更新等基本操作,DAL就是根据业务需求,构造SQL语句,构造参数,调用帮助类,获取结果,DAL层被BIL层调用

  • 业务逻辑层(BLL),BLL层好比是桥梁,将UI表示层与DAL数据访问层之间联系起来。所要负责的,就是处理涉及业务逻辑相关的问题,比如在调用访问数据库之前,先处理数据、判断数据。

说说你对JSON的理解

JSON是一种轻量级的数据交换格式。它基于标准字符串实现,可分为三类数据:

  • 单个数据:有number, string, boolean和null四种类型数据。

  • 多个有序的数据: 数组,用[]包含起来, 其元素可以是三类数据中的任意一种, 元素之间用,号隔开。

  • 多个无序的数据: 对象用{}包含起来, 其元素必须由key-value组成, key是一个字符串, value可以是任意类型数据, key与value之间用:号隔开, 两个key-value之间用,号隔开。

接口间基于JSON传输数据有什么好处?

json之前都是基于xml的传输,所以基于xml对比。

  • 简洁,没有xml的开闭标签
  • 文件更小,传输更快
  • 序列化和反序列化的速度高于xml
  • cpu处理json消耗的资源更少

什么是单点登录

单点登录的英文名叫做:Single Sign On(简称SSO)。

起初我们的所有功能都在一个系统,比如登录,交易,物理。后来有了分布式微服务,按照功能拆分成了多个子服务,那如何实现一处登录,处处可用呢?

也就是如何用一把锁,打开你家的所有门?需要解决以下问题:

session共享

  • 全局复制,集群内每个tomcat的session完全同步,这样会影响集群的性能。
  • hash映射,将ip映射的对应的机器上,也就是某个固定访问某台机器。一旦挂了,就会丢数据。
  • 把Session数据放在Redis中。

redis会在【redis篇】更新,想提前了解的小伙伴PC端看左侧「关于作者」,手机端「私信」博主。

在单点登录中,如果cookie被禁用了怎么办?

单点登录的原理是后端生成一个sessionID,然后设置到cookie,后面的所有请求浏览器都会带上cookie,然后服务端从cookie里获取sessionID,再查询到用户信息。

所以,保持登录的关键是通过cookie保存和传输的sessionID,其本质是能获取用户信息的数据。除了cookie,还通常使用HTTP请求头来传输。但是这个请求头浏览器不会像cookie一样自动携带,需要手工处理。


以上就是关于「Javaweb」部分总结出的面试题,如果哪里有问题,欢迎大家交流评论!

最后

⭐今天是坚持刷题更文的第34/100天

⭐各位的点赞、关注、收藏、评论、订阅就是一条创作的最大动力

⭐更多面试题欢迎关注专栏《大厂面试突击》

为了回馈各位粉丝,礼尚往来,给大家准备了一条多年积累下来的优质资源,包括 学习视频、面试资料、珍藏电子书等

需要的小伙伴PC端看左侧「关于作者」,手机端「私信」博主。

以上是关于爆肝一周面试10多家中大厂后的万字总结——❤️JavaWeb篇❤️(建议收藏)的主要内容,如果未能解决你的问题,请参考以下文章

必知必会面试10多家中大厂后的两万字总结——❤️JVM篇❤️(建议收藏)

面试10多家中大厂后的万字总结——java基础篇(干货总结,必须收藏)

❤️五分钟结束面试,发奋图强爆肝一周,再也不怕被问到Redis了(阿里面试官给我的题库)❤️

❤️五万字❤️离职后一天4面,总结了204道高频Java面试题,已拿阿里offer(建议收藏)

大厂面试预备篇——《两万字MySql基础总结》❤️建议收藏

Python基础知识点六万字总结,爆肝一周熬夜完成建议收藏