JAVA常见面试题总结(五)JAVA Web 和网络
文章目录
- 1、JSP 和 Servlet 有什么区别?
- 2、JSP 有哪些内置对象?作用分别是什么?
- 3、说一下 JSP 的 4 种作用域?
- 4、session 和 cookie 有什么区别?
- 5、如果客户端禁止 cookie ,那么 session 还能用吗?
- 6、如何避免 SQL 注入?
- 7、什么是 XSS 攻击?如何避免 XSS 攻击?
- 8、什么是 CSRF 攻击,如何避免 CSRF 攻击?
- 9、常见的 HTTP 状态码及其含义。
- 10、HTTP 请求的方法有哪些?
- 11、GET 和 POST 的区别。
- 12、forward 和 redirect 的区别?
- 13、TCP 和 UDP 的区别?
- 14、说一下 TCP 的三次握手,为什么要三次握手?两次不行吗?
- 15、OSI 的七层模型有哪些? TCP/IP 协议的五层模型又是哪些?
- 16、如何实现跨域?
- 17、说一下 JSONP 的实现原理。
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 方法用于生成对客户端的响应。
2、JSP 有哪些内置对象?作用分别是什么?
JSP 共有9个内置对象:
- request:封装客户端的请求,其中包含来自GET或POST请求的参数
- response:封装服务器对客户端的响应
- pageContext:通过该对象可以获取其它对象
- session:封装用户会话的对象
- application:封装服务器运行环境的对象
- out:输出服务器响应的输出流对象
- config:Web应用的配置对象
- page:JSP页面本身(相当于 Java 程序中的 this)
- exception:封装页面抛出异常的对象
3、说一下 JSP 的 4 种作用域?
JSP 中的四种作用域分别是:page、request、session、application
- page:代表与一个页面相关的对象和属性。范围为当前页面。
- request:代表与Web服务器发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个 Web 组件;需要在页面显示的临时数据可以置于此作用域。范围为一个请求。
- session:代表与某个客户与服务器建立的一次会话相关的对象和属性。范围为一次会话。
- application:代表与整个 Web 应用程序相关的对象和属性,它跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域。
4、session 和 cookie 有什么区别?
-
存储位置不同
session 是保存在服务器端,cookie 保存在客户端浏览器。
session 是服务器保持用户会话状态的一种实现方式,需要借助 session id 来识别用户对应的 session ,session id 通常保存在 cookie 中。
-
存储容量不同
不同的浏览器对 cookie 的限制不同,一般情况下单个 cookie 保存的数据<=4KB,一个站点最多保存20个 cookie 。
session 则没有容量上限,但为了性能考虑,一般不建议在 session 中保存过多的东西。
-
存储方式不同
cookie 中只能保存ASCII字符串,其它编码的字符(例如unicode)需要通过转码等方式存储。
session 可以存放任何类型的数据,包括且不限制于String、Integer、List等。
-
隐私策略不同
cookie 由于是存储在客户端的,所以对用户来所是可见的。
session 是存储在服务器端的,对客户端不可见。
5、如果客户端禁止 cookie ,那么 session 还能用吗?
session 是通过 session id 来从服务器检索出来的,一般来说 session id 保存在 cookie 里,当 cookie 被禁用时只要有其它办法将 session id 发送到服务器端都是可以的。常见的方式有:通过URL传值、通过隐藏表单传值、通过 http 请求头传值等等。因此客户端禁用 cookie 也能够使用 cookie 。
6、如何避免 SQL 注入?
- 使用 PreparedStatement 预编译方式执行SQL。
- 如果使用 MyBatis 传值使用 #{} ,避免使用 ${} 。(#{} 方式底层其实也是使用的 PreparedStatement)
- 校验参数是否含有非法字符及恶意代码。
7、什么是 XSS 攻击?如何避免 XSS 攻击?
XSS 攻击又称 CSS ,全称 Cross Site Script (跨站脚本攻击)。其原理是攻击者向有 XSS 漏洞的网站输入 恶意代码(例如:HTML代码javascript代码等等),当用户浏览该网站时,这些恶意代码会自动执行,从而达到攻击的目的。
XSS 的防御方法:对入参进行过滤,防止恶意代码被录入系统中;对出参进行编码,防止恶意代码执行。
8、什么是 CSRF 攻击,如何避免 CSRF 攻击?
CSRF (Cross Site Request Forgery)也被称为 one click attack 或者 session riding ,中文全称为跨站请求伪造。一般来说,攻击者向用户曾经认证访问过的网站发送伪造的用户请求,让网站误以为是用户的真实操作而去执行命令。常用于盗号、转账、发送虚假消息等。
如何避免 CSRF 攻击:
- 验证 HTTP Referer 字段识别请求的真实来源地址。
- 使用验证码。
- 在请求中添加 token 并验证。
- 在 HTTP 请求头中自定义属性并验证。
9、常见的 HTTP 状态码及其含义。
参考内容: Spring 中 org.springframework.http.HttpStatus 枚举。
分类:
范围 | 描述 |
---|---|
1xx | 信息。服务器收到请求,请继续执行请求。 |
2xx | 成功。请求被成功接收并处理。 |
3xx | 重定向。表示完成请求需进一步处理。 |
4xx | 客户端错误。请求语法有错误,无法完成请求。 |
5xx | 服务器端错误。服务器未能完成合法的请求。 |
详解:
100 Continue:继续。服务器已经收到一部分请求,请继续请求。
101 Switching Protocols:切换协议。请求者要求切换协议,服务器已接收并准备切换。
200 OK:服务器已经成功处理了请求。
201 Created:请求成功并且服务器创建了新的资源。
202 Accpted:已经接受请求,但尚未处理完成。
203 Non-Authoritative Information:非权威信息。服务器已经处理了请求,但结果可能来自另一源。
204 No Content:无内容。服务器已经处理了请求,但没有返回内容。
205 Reset Content:内容重置。
206 Partial Content:部分内容。服务器处理了部分请求。
300 Multiple Choices:多项选择。服务器可根据请求选择多种操作。
301 Moved Permanently:永久移动。请求的网页已永久移动到新位置。
302 Moved Temporarily:临时移动。请求的网页临时移动到新的位置。
400 Bad Request:错误的请求。服务器无法解析该请求。
401 Unauthorized:未经授权的。请求没有身份验证或验证未通过。
402 Payment Required:需要付款。
403 Forbidden:禁止访问。服务器拒绝该请求。
404 Not Found:未找到。服务器找不到请求的网页。
405 Method Not Allowed:不允许的方法。请求方法错误。
406 Not Acceptable:不能接受的。
407 Proxy Authentication Required:需要代理身份验证。
408 Request Timeout:请求超时。服务器等待请求时超时。
409 Conflict:冲突。
410 Gone:已删除。请求的资源已被永久删除。
411 Length Required:需要有效长度。服务器不接受不含有效长度标头字段的请求。
412 Precondition failed:前提条件错误。
413 Payload Too Large:请求的有效负载过大。
414 URI Too Long:URI 太长。
415 Unsupported Media Type:不支持的媒体类型。
500 Internal Server Error:服务器内部错误。服务器内部出现了错误,无法完成请求。
501 Not Implemented:未实现。服务器没有完成请求的功能。
502 Bad Gateway:网关错误。
503 Service Unavailable:暂停服务。
504 Gateway Timeout:网关超时。
505 HTTP Version Not Supported:不支持的 HTTP 协议版本。
10、HTTP 请求的方法有哪些?
GET:向指定的资源发出请求,GET请求应该只用来获取数据。
HEAD:与GET请求一样,不过请求只有头部信息。
POST:向服务器器提交数据,请求服务器处理。(提交表单或上传文件)
PUT:向指定资源位置上传最新位置(与POST相比,PUT指定了存放位置,而PSOT由服务器指定)。
DELETE:请求服务器删除资源。
TRACE:请求服务器回收收到的请求信息,主要用于测试和诊断。
OPTIONS:使服务器传回该资源所支持的所有HTTP请求方法。
11、GET 和 POST 的区别。
- 对资源的影响:GET一般用于获取或查询资源信息,对同一个URL的多个请求返回结果应该是一样的(幂等)。不修改资源的状态(安全);而POST请求一般用于更新资源信息,POST请求既不是安全的也不是幂等的。
- 传递的信息量:GET请求把发送的数据拼接在URL后面,由于有些浏览器和服务器对URL的长度和字符格式存在限制,所以传递的信息有限;POST请求将需要发送的数据放到请求报文的消息体中,HTTP协议对此没有限制,因此可以传递更多信息。
- 安全性:GET提交的数据以明文出现在URL上,这些信息可能被浏览器缓存,在历史记录中得到;POST把数据存放在消息体中,安全性较高,但也能被抓包工具抓取得到其中的内容。
12、forward 和 redirect 的区别?
forward 和 redirect 是 servlet 的两种主要跳转方式。forward:转发;redirect:重定向。
两者的区别:
-
地址栏显示不同
forward 只会显示请求的地址,并不知道资源最原始是从哪个地址过来的。
redirect 会显示重定向后的地址。
-
资源共享不同
forward 整个过程*用一个 request ,因此可以共享 request 里保存的信息。
redirect 相当于重新发起了第二次请求,因此 request 是不共享的。
-
效率
forward 效率高于 redirect 。
-
请求次数
forward 是一次请求,redirect 是两次请求。
13、TCP 和 UDP 的区别?
- TCP 面向连接(例如打电话需要先拨号建立连接);UDP 是无连接的,即发送数据之前不需要建立连接。
- TCP 提供可靠服务。通过 TCP 连接传送的数据,无差错、不丢失、不重复、且按顺序到达;UDP 尽最大努力交付,即不保证可靠交付。
- TCP 面向字节流,实际上是 TCP 把数据看成一连串无结构的字节流;UDP 是面向报文的。UDP 没有拥塞控制,因此在网络拥挤时也不会降低自己的发送速率(对实时应用很有用,例如 IP 电话、实时视频会议等)。
- 每一条 TCP 连接都只能是点对点的,因此 TCP 只能时一对一的;UDP 支持一对一、一对多、多对一、多对多的交互通信。
- TCP 首部开销 20 个字节;UDP 首部开销只有 8 个字节。
- TCP 的逻辑通信信道是全双工的可靠信道,UDP 则是不可靠信道。
14、说一下 TCP 的三次握手,为什么要三次握手?两次不行吗?
TCP 的三次握手:
-
第一次握手
客户端向服务器发送连接请求报文段。该报文段中包含自身的数据通讯初始序号。请求发送后便进入 SYN-SEND(请求连接)状态。
-
第二次握手
服务端收到连接请求报文段后,如果统一连接,则会发送一个应答,该应答中也会包含自身的数据通讯初始序号,发送完成后便进入 SYN-RECEIVED(连接接受) 状态。
-
第三次握手
当客户端收到连接同意的应答后,还要向服务器发送一个确认报文。此后客户端便进入 ESTABLISHED(建立连接) 状态,服务器收到这个应答后也进入 ESTABLISHED(建立连接) 状态,此时连接建立成功。
为什么要三次握手?
三次握手是为了防止失效的请求连接报文段被服务器端接收的情况,三次握手让服务器端的通讯***也被确认,从而使连接更加可靠。
15、OSI 的七层模型有哪些? TCP/IP 协议的五层模型又是哪些?
16、如何实现跨域?
- 方式一:JSONP
- 方式二:CORS(Cross-Origin Resource Sharing),跨域资源共享
- 方式三:代理资源共享(通过代理服务器实现跨域)
- 方式四:HTML5 postMessage 方法。
- 方式五:基于 HTML5 的 WebSocket 方式。
17、说一下 JSONP 的实现原理。
JSONP 即 JSON+padding,动态创建script标签,利用script标签的src属性可以获取任何域下的js脚本,通过这个特性,服务器端不再返回JSON格式,而是返回一段调用某个函数的js代码,在src中进行了调用,这样实现了跨域。