欢迎来到致知知识服务平台!

请登录 免费注册

服务热线:13164506307

当前位置:首页 > 编程/算法实现 > java

(Java实习生)每日10道面试题打卡——JavaWeb篇

(Java实习生)每日10道面试题打卡——JavaWeb篇

价格 50
评分 5.0 (0人评分) 销量: 收藏商品
数量
加入购物车 购买服务
服务详情

* 临近秋招,备战暑期实习,祝大家每天进步亿点点!==打卡 Day05==!
* 本篇总结的是javaweb相关的面试题,后续会每日更新~
* **剧透**:明日更新 *JVM* 面试题,相关知识不牢固的先去补一补哦 O(∩_∩)O~

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210522175819650.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzU5MTk4MA==,size_16,color_FFFFFF,t_70#pic_center =400x400)

---

## 1、JSP 和 Servlet 有什么区别?

* *JSP* 经编译后就变成了*Servlet*(*JSP* 的本质就是 *Servlet*,JVM只能识别 Java 的类,不能识别 *JSP* 的代码,Web 容器将*JSP* 的代码编译成 JVM 能够识别的 Java 类)。
* *JSP* 更擅长表现于页面显示,*Servlet* 更擅长于逻辑控制。
* *Servlet* 中没有内置对象,*JSP* 中的内置对象都是必须通过 *HttpServletRequest* 对象,*HttpServletResponse* 对象以及*HttpServlet* 对象得到。
* *JSP* 是*Servlet* 的一种简化,使用Jsp只需要完成程序员需要输出到客户端的内容,*JSP* 中的 Java 脚本如何镶嵌到一个类中,由 *JSP* 容器完成。而*Servlet* 则是个完整的 Java 类,这个类的 Service 方法用于生成对客户端的响应。

==**注**:*JSP* 现在公司用的少了,面试不作为重点,但是 *Servlet* 还是要了解一些东西的!==

---

## 2、说一下 jsp 的 4 种作用域?

* **page** 代表与一个页面相关的对象和属性
* **request** 代表与Web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个Web组件;需要在页面显示的临时数据可以置于此作用域。
* **session** 代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的session中。
* **application** 代表与整个Web应用程序相关的对象和属性,它实质上是跨越整个Web应用程序,包括多个页面、请求和会话的一个全局作用域。

---

## 3、请说一下 session 的工作原理?

 *Session* 是一个存在服务器上的类似于一个**散列表格式的文件**。里面存有我们需要的信息,在我们需要用的时候可以从里面取出来。类似于一个大号的 *map* (服务器端的一个集合),里面的 **键(key)** 存储的是用户的 `sessionid`,用户向服务器发送请求的时候会带上这个`sessionid`,这时就可以从中取出对应的值了。

---

## 4、session 和 cookie 有什么区别?

> Cookie 和 Session 的区别?

*Cookie* 的概念:客户端会话技术,服务器端将数据保存到客户端。

*Session* 的概念:服务器端会话技术,在一次会话的多次请求间共享数据,(客户端)将数据保存在服务器端的对象中(*HttpSession*)。

* 存储位置不同:*Cookie* 存储在客户端浏览器,*Session* 存储在服务器端。
* 存储容量不同:*Cookie* 存储数据的容量很小(通常为 *4KB* 左右),对同一个域名下的总 *Cookie* 数量也有限制(20个),而 *Session* 的存储容量较大。
* 安全性不同:*Cookie* 的安全性较低,而 *Session* 安全性较高。

> Cookie 和 Session 的生命周期不同:

* 当浏览器关闭后,*Cookie* 数据被销毁。
* 当服务器关闭时,*Session* 数据被销毁。或者 *Session* 对象调用`invalidate()` 主动销毁,也可以设置定时销毁 *Session*对象。

> Cookie 和 Session 的使用案例:

*Cookie* :

* 记住上一次访问时间。
* 在不登录的情况下,完成服务器对客户端的身份识别。
* 存少量的不太敏感的数据。

*Session*:

* 存储登录验证码。
* 用户登录的信息。

---

## 5、如果客户端禁止 cookie 能实现 session 还能用吗?

*Cookie* 与 *Session*,一般认为是两个独立的东西,*Session* 采用的是在服务器端保持状态的方案,而 *Cookie* 采用的是在客户端保持状态的方案。但为什么禁用 *Cookie* 就不能得到Session呢?

因为 *Session* 是用*Session ID* 来确定当前对话所对应的服务器 *Session*,而*Session ID* 是通过 *Cookie* 来传递的,禁用 *Cookie* 相当于失去了*Session ID*,也就得不到服务器端的 *Session*了。

---

## 6、forward 和 redirect 的区别?

* forward 请求转发是一次请求,redirect  重定向是两次请求;
* 重定向的第二个请求一定是 GET 请求;
* 请求转发的目标只能是本应用中的资源,重定向的目标可以是其他应用;
* 请求转发后浏览器地址栏不会有变化,而重定向会有变化,因为重定向是两个请求;
* 请求转发对Servlet01和Servlet02的请求方法是相同的,即要么都是GET,要么都是POST,因为请求转发是一个请求;

直接上图更好对比区别:

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210524153720380.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzU5MTk4MA==,size_16,color_FFFFFF,t_70)

---

## 7、什么是 XSS 攻击,如何避免?

XSS 攻击,即跨站脚本攻击(Cross Site Scripting),它是 web 程序中常见的漏洞。 

> 原理:

攻击者往 web 页面里插入恶意的 HTML 代码(JavaScript、Css、Html 标签等),当某个用户浏览该页面时,嵌入其中的 HTML 代码会被执行,从而达到恶意攻击用户的目的。如盗取用户 cookie 执行一系列操作,破坏页面结构、重定向到其他网站等。 

**案例**:恶意的在某个网站的登录页面加 HTML 代码(JavaScript、Css、Html 标签等),当用户输入账号密码登录后,这段恶意的 HTML 代码会被执行,从而获取用户的账号密码信息。

> **预防思路** :

- web 页面中可由用户输入的地方,对输入的数据转义、过滤处理。
- 后台输出页面的时候,也需要对输出内容进行转义、过滤处理(因为攻击者可能通过其他方式把恶意脚本写入数据库)。
- 前端对 html 标签属性、css 属性赋值的地方进行校验。

参考文章:[什么是 XSS 攻击,如何避免?](https://blog.csdn.net/meism5/article/details/90414134)

---

## 8、什么是 CSRF 攻击,如何避免?

 CSRF:Cross Site Request Forgery(跨站点请求伪造)。

CSRF 攻击者在用户已经登录目标网站之后,诱使用户访问一个攻击页面,利用目标网站对用户的信任,以用户身份在攻击页面对目标网站发起伪造用户操作的请求,达到攻击目的。

**案例**:就好比用户A,在自己电脑上通过自己的账号密码登录了 B 网站(登录用户身份标识被 XX 网站信任),当 A 在浏览网页时候,不经意间打开了钓鱼网站 X,这时候 X 就可借着 B 网站对用户 A 的信任标识,以用户 A 的身份去访问 B 网站,并对其进行攻击!

> 预防方法:

- 添加并验证 token
- 添加自定义 http 请求头
- 使用 post 请求
- 敏感操作添加验证码

参考文章:[什么是 CSRF 攻击,如何避免?](https://blog.csdn.net/meism5/article/details/90414140)

---

## 9、说下原生 jdbc 操作数据库流程?

* 第一步: `Class.forName()`加载数据库连接驱动;
* 第二步: `DriverManager.getConnection()`获取数据连接对象;
* 第三步:根据 SQL 获取 sql 会话对象,有 2 种方式 `Statement`、 `PreparedStatement` ;
* 第四步:执行 SQL 处理结果集,执行 SQL 前如果有参数值就设置参数值 `setXxx()`;
* 第五步:关闭结果集、关闭会话、关闭连接。

---

## 10、如何避免 sql 注入?

* 预编译 SQL(使用 PreparedStatement),参数化查询方式,避免 SQL 拼接。
* 校验参数的数据格式是否合法(可以使用正则或特殊字符的判断)。
* 对进入数据库的特殊字符进行转义处理,或编码转换。

---

<font color=red>总结的面试题也挺费时间的,文章会不定时更新,有时候一天多更新几篇,如果帮助您复习巩固了知识点,还请三连支持一下,后续会亿点点的更新!</font>

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210522180031226.gif#pic_center)

---

<font color=orange size=4>为了帮助更多小白从零进阶 Java 工程师,从CSDN官方那边搞来了一套 《Java 工程师学习成长知识图谱》,尺寸 `870mm x 560mm`,展开后有一张办公桌大小,也可以折叠成一本书的尺寸,有兴趣的小伙伴可以了解一下,当然,不管怎样博主的文章一直都是免费的~</font>
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210524111209407.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzU5MTk4MA==,size_16,color_FFFFFF,t_70#pic_center =400x)

 

服务评价

综合得分 5.0

服务态度: 5

工作速度: 5

完成质量: 5

(0人评论)