⭐欢迎订阅《大厂面试突击》专栏,面试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
开始讲,根本来不及好吗关于选题,java的知识点又多又杂,技术更新又很快。所以明白以下几点很重要:
很多技术已经淘汰,所以就没必要再去看。
有些技术是当下正火,面试官特别爱问。
有些知识点之间存在关联关系,问完这个必问那个。
一条凭借面试了10多家大厂的经验总结最高频的知识点,让你不做无用功,事半功倍!
出自moka、美术宝
相信这个问题都难不倒大家,但很多人答不全。
如果能回答出应用场景就完美了。
GET
:最常用的方式,用来向服务器请求数据,没有请求体,请求参数放在URL后面。POST
:用于向表单提交数据,传送的数据放在请求体中。PUT
:用来向服务器上传文件,一般对应修改操作,POST
用于向服务器发送数据,PUT用于向服务器储存数据。没有验证机制,任何人都可以操作,存在安全问题。具有幂等性。DELETE
:用于删除服务器上的文件,具有幂等性。同样存在安全问题。HEAD
:用HEAD进行请求服务器时,服务器只返回响应头,不返回响应体。与GET
一样没有请求体,常用于检查请求的URL是否有效。PATCH
:对资源进行部分修改。与PUT区别在于,PUT是修改所有资源,替代它,而PATCH只是修改部分资源。TRACE
:用来查看一个请求,经过网关,代理到达服务器,最后请求的变换。因安全问题被禁用。OPTIONS
:当客户端不清楚对资源操作的方法,可以使用这个,具有幂等性。高频必考题
是否具有幂等性也是一个http请求的重要关注点。
幂等性:指的是同样的请求不管执行多少次,效果都是一样,服务器状态也是一样的。具有幂等性的请求方法没有副作用。(统计用途除外)
假设这样一个场景:有时我们在填写某些
form表单
时,保存按钮不小心快速点了两次,表中竟然产生了两条重复的数据,只是id不一样。这是一个比较常见的幂等性问题,在高并发场景下会变得更加复杂,那怎么保证接口的幂等性呢?
插入数据前先根据某一字段查询一下数据库,如果已经存在就修改,不存在再插入。
加锁可解决一切问题,但也要考虑并发性。
主要包括悲观锁,乐观锁,分布式锁。
悲观锁的并发性较低,更适合使用在防止数据重复的场景,注意幂等性不光是防止重复还需要结果相同。
乐观锁可以很高的提升性能,也就是常说的版本号。
分布式锁应用在高并发场景,主要用redis来实现。
通过数据库的唯一索引来保证结果的一致性和数据的不重复。
两次请求,第一请求拿到token,第二次带着token去完成业务请求。
出自美术宝
此题考查的是你有没有实际解决bug的经验和能力。不知道对应网络状态码的含义,解决问题的能力就会受到怀疑。
应该重点关注同一系列之间的区别,比如504和505什么区别?
网络状态码共三位数字组成,根据第一个数字可分为以下几个系列:
代表请求已被接受,需要继续处理。
包括:100、101、102
这一系列的在实际开发中基本不会遇到,可以略过。
表示成功处理了请求的状态代码。
200
:请求成功,表明服务器成功了处理请求。
202
:服务器已接受请求,但尚未处理。
204
:服务器成功处理了请求,但没有返回任何内容。
206
:服务器成功处理了部分 GET 请求。
300
:针对请求,服务器可执行多种操作。
301
:永久重定向
302
:临时性重定向
303
:303与302状态码有着相同的功能,但303状态码明确表示客户端应当采用GET方法获取资源。
301
比较常用的场景是使用域名跳转。比如,我们访问 http://www.baidu.com
会跳转到https://www.baidu.com
,发送请求之后,就会返回301状态码,然后返回一个location,提示新的地址,浏览器就会拿着这个新的地址去访问。
302
用来做临时跳转比如未登陆的用户访问用户中心重定向到登录页面。
400
:该状态码表示请求报文中存在语法错误。但浏览器会像200 OK一样对待该状态码。
401
:表示发送的请求需要有通过HTTP认证的认证信息。比如token
失效就会出现这个问题。
403
:被拒绝,表明对请求资源的访问被服务器拒绝了。
404
:找不到,表明服务器上无法找到请求的资源,也可能是拒绝请求但不想说明理由。
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
考查实际开发中解决问题的能力。
跨域是针对浏览器的,由于浏览器的同源策略不能执行其他网站的脚本。那什么是同源?
同源是指域名、协议、端口均相同。只要有一个不同,就是跨域。
headers
的Access-Control-Allow-Origin
允许所有人访问。还有其他解决方案,但不常用,实际开发都是基于
springboot
注解实现。
一种「异步请求」+「局部刷新」技术。等于异步JavaScript 和 XML,用于创建快速动态网页。
异步请求:不需要等待当前请求返回就可以发送下一个请求。
局部刷新:无需重新加载整个网页的情况下,能够更新部分网页。
servlet是一个比较抽奖的概念,也是web部分的核心组件,大家回答这个问题一定要加入自己的理解,不要背定义。
servlet
其实就是一个java程序,他主要是用来解决动态页面的问题。
之前都是浏览器像服务器请求资源,服务器(tomcat)返回页面,但用户多了之后,每个用户希望带到不用的资源。这时就该servlet
上场表演了。
servlet
存在于tomcat
之中,用来网络请求与响应,但他的重心更在于业务处理,我们访问京东和淘宝的返回的商品是不一样的,就需要程序员去编写,目前MVC三层架构,我们都是在service
层处理业务,但这其实是从servlet
中抽取出来的。
看一下servlet
处理请求的过程:
Servlet生命周期分为三个阶段:
初始化阶段 调用init()方法
响应客户请求阶段 调用service()方法-àdoGet/doPost()
终止阶段 调用destroy()方法
servlet已经介绍过,和他相似的这些你了解吗?
servlet是一种运行服务器端的java应用程序,工作在客户端请求与服务器响应的中间层。
filter是一个可以复用的代码片段,可以用来转换HTTP请求、响应和头信息。Filter不像Servlet,它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者修改从某一的响应。
从字面上可以看出listener主要用来监听只用。通过listener可以监听web服务器中某一个执行动作,并根据其要求作出相应的响应。
servlet,filter都是针对url之类的,而listener是针对对象的操作的。
这块的东西比较乱,给大家画个图
JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。JSP编译后是“类servlet”。
Servlet和JSP最主要的不同点在于:Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。
JSP侧重于视图,Servlet主要用于控制逻辑。在struts框架中,JSP位于MVC设计模式的视图层,而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");
首先我们要明白HTTP是一种无状态协议,怎么理解呢?很简单
夏洛:大爷,楼上322住的是马冬梅家吧? 大爷:马冬什么? 夏洛:马冬梅。 大爷:什么冬梅啊? 夏洛:马冬梅啊。 大爷:马什么梅? 夏洛:行,大爷你先凉快着吧。
这段对话都熟悉吧,HTTP就是那个大爷,那如果我们就直接把“大爷”放给用户,用户不用干别的了,就不停的登录就行了。
既然“大爷不靠谱”,我们找“大娘”去吧。
哈哈哈,开个玩笑,言归正传。
为了解决用户频繁登录的问题,在服务端和客户端共同维护一个状态——会话,就是所谓session
,我们根据会话id判断是否是同一用户,这样用户就开心了。
但是服务器可不开心了,因为用户越来越多,都要把session
存在服务器,这对服务器来说是一个巨大的开销,这是服务器就找来了自己的兄弟帮他分担(集群部署,负载均衡)。
但是问题依然存在,如果兄弟挂了怎么办,兄弟们之间的数据怎么同步,用户1把session
存放在机器A上,下次访问时负载均衡到了机器B,完了,找不到,用户又要骂娘。
这时有人思考,为什么一定要服务端保存呢,让客户端自己保存不就好了,所以就诞生了cookie
,下一次请求时客户段把cookie
发送给服务器,说我已经登录了。
但是空口无凭,服务器怎么知道哪个cookie
是我发过去的呢?如何验证成了新的问题。
有人想到了一个办法,用加密令牌,也就是token
,服务器发给客户端一个令牌,令牌保存加密后id和密钥,下一次请求时通过headers
传给服务端,由于密钥别人不知道,只有服务端知道,就实现了验证,且别人无法伪造。
如果感觉博主讲的还不错,一键三连支持一下吧。
更多学习视频+笔记,PC端看左侧「关于作者」,手机端「私信」博主。
三层架构与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是一种轻量级的数据交换格式。它基于标准字符串实现,可分为三类数据:
单个数据:有number, string, boolean和null四种类型数据。
多个有序的数据: 数组,用[]包含起来, 其元素可以是三类数据中的任意一种, 元素之间用,号隔开。
多个无序的数据: 对象用{}包含起来, 其元素必须由key-value组成, key是一个字符串, value可以是任意类型数据, key与value之间用:号隔开, 两个key-value之间用,号隔开。
json之前都是基于
xml
的传输,所以基于xml
对比。
单点登录的英文名叫做:Single Sign On(简称SSO)。
起初我们的所有功能都在一个系统,比如登录,交易,物理。后来有了分布式微服务,按照功能拆分成了多个子服务,那如何实现一处登录,处处可用呢?
也就是如何用一把锁,打开你家的所有门?需要解决以下问题:
session共享
redis会在【redis篇】更新,想提前了解的小伙伴PC端看左侧「关于作者」,手机端「私信」博主。
单点登录的原理是后端生成一个sessionID
,然后设置到cookie
,后面的所有请求浏览器都会带上cookie
,然后服务端从cookie里获取sessionID,再查询到用户信息。
所以,保持登录的关键是通过cookie
保存和传输的sessionID
,其本质是能获取用户信息的数据。除了cookie
,还通常使用HTTP
请求头来传输。但是这个请求头浏览器不会像cookie一样自动携带,需要手工处理。
以上就是关于「Javaweb」部分总结出的面试题,如果哪里有问题,欢迎大家交流评论!
⭐今天是坚持刷题更文的第34/100天
⭐各位的点赞、关注、收藏、评论、订阅就是一条创作的最大动力
⭐更多面试题欢迎关注专栏《大厂面试突击》
为了回馈各位粉丝,礼尚往来,给大家准备了一条多年积累下来的优质资源,包括 学习视频、面试资料、珍藏电子书等
需要的小伙伴PC端看左侧「关于作者」,手机端「私信」博主。