9

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

 2 years ago
source link: https://blog.csdn.net/skylibiao/article/details/119782272
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

专栏收录该内容
9 篇文章 358 订阅

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

更多精品专栏简介点这里

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

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

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

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

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

iShot2021-08-05 18.02.50

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

所以我开始刷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处理请求的过程:

image-20210812201447743

说一说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是一种设计模式,而三层架构是一种软件架构。

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端看左侧「关于作者」,手机端「私信」博主。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK