JAVA常见面试题总结(五)JAVA Web 和网络

1、JSP 和 Servlet 有什么区别?

  1. JSP 经编译后就变成了 Servlet 。( JSP 本质就是 Servlet , JVM 只能识别 Java 的类,不能识别 JSP 的代码, Web 容器将 JSP 的代码编译成 JVM 能识别的 Java 类)
  2. JSP 更擅长表现于页面显示,Servlet 更擅长于逻辑控制。
  3. Servlet 中没有内置对象, JSP 中的内置对象都是必须通过HttpServletRequest、HttpServletResponse 对象以及HttpServlet 对象得到。
  4. 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 有什么区别?

  1. 存储位置不同

    session 是保存在服务器端,cookie 保存在客户端浏览器。

    session 是服务器保持用户会话状态的一种实现方式,需要借助 session id 来识别用户对应的 session ,session id 通常保存在 cookie 中。

  2. 存储容量不同

    不同的浏览器对 cookie 的限制不同,一般情况下单个 cookie 保存的数据<=4KB,一个站点最多保存20个 cookie 。

    session 则没有容量上限,但为了性能考虑,一般不建议在 session 中保存过多的东西。

  3. 存储方式不同

    cookie 中只能保存ASCII字符串,其它编码的字符(例如unicode)需要通过转码等方式存储。

    session 可以存放任何类型的数据,包括且不限制于String、Integer、List等。

  4. 隐私策略不同

    cookie 由于是存储在客户端的,所以对用户来所是可见的。

    session 是存储在服务器端的,对客户端不可见。

5、如果客户端禁止 cookie ,那么 session 还能用吗?

session 是通过 session id 来从服务器检索出来的,一般来说 session id 保存在 cookie 里,当 cookie 被禁用时只要有其它办法将 session id 发送到服务器端都是可以的。常见的方式有:通过URL传值、通过隐藏表单传值、通过 http 请求头传值等等。因此客户端禁用 cookie 也能够使用 cookie 。

6、如何避免 SQL 注入?

  1. 使用 PreparedStatement 预编译方式执行SQL。
  2. 如果使用 MyBatis 传值使用 #{} ,避免使用 ${} 。(#{} 方式底层其实也是使用的 PreparedStatement)
  3. 校验参数是否含有非法字符及恶意代码。

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 攻击:

  1. 验证 HTTP Referer 字段识别请求的真实来源地址。
  2. 使用验证码。
  3. 在请求中添加 token 并验证。
  4. 在 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:重定向。

两者的区别:

  1. 地址栏显示不同

    forward 只会显示请求的地址,并不知道资源最原始是从哪个地址过来的。

    redirect 会显示重定向后的地址。

  2. 资源共享不同

    forward 整个过程*用一个 request ,因此可以共享 request 里保存的信息。

    redirect 相当于重新发起了第二次请求,因此 request 是不共享的。

  3. 效率

    forward 效率高于 redirect 。

  4. 请求次数

    forward 是一次请求,redirect 是两次请求。

JAVA常见面试题总结(五)JAVA Web 和网络

13、TCP 和 UDP 的区别?

  1. TCP 面向连接(例如打电话需要先拨号建立连接);UDP 是无连接的,即发送数据之前不需要建立连接。
  2. TCP 提供可靠服务。通过 TCP 连接传送的数据,无差错、不丢失、不重复、且按顺序到达;UDP 尽最大努力交付,即不保证可靠交付。
  3. TCP 面向字节流,实际上是 TCP 把数据看成一连串无结构的字节流;UDP 是面向报文的。UDP 没有拥塞控制,因此在网络拥挤时也不会降低自己的发送速率(对实时应用很有用,例如 IP 电话、实时视频会议等)。
  4. 每一条 TCP 连接都只能是点对点的,因此 TCP 只能时一对一的;UDP 支持一对一、一对多、多对一、多对多的交互通信。
  5. TCP 首部开销 20 个字节;UDP 首部开销只有 8 个字节。
  6. TCP 的逻辑通信信道是全双工的可靠信道,UDP 则是不可靠信道。

14、说一下 TCP 的三次握手,为什么要三次握手?两次不行吗?

JAVA常见面试题总结(五)JAVA Web 和网络

TCP 的三次握手:

  • 第一次握手

    客户端向服务器发送连接请求报文段。该报文段中包含自身的数据通讯初始序号。请求发送后便进入 SYN-SEND(请求连接)状态。

  • 第二次握手

    服务端收到连接请求报文段后,如果统一连接,则会发送一个应答,该应答中也会包含自身的数据通讯初始序号,发送完成后便进入 SYN-RECEIVED(连接接受) 状态。

  • 第三次握手

    当客户端收到连接同意的应答后,还要向服务器发送一个确认报文。此后客户端便进入 ESTABLISHED(建立连接) 状态,服务器收到这个应答后也进入 ESTABLISHED(建立连接) 状态,此时连接建立成功。

为什么要三次握手?

三次握手是为了防止失效的请求连接报文段被服务器端接收的情况,三次握手让服务器端的通讯***也被确认,从而使连接更加可靠。

15、OSI 的七层模型有哪些? TCP/IP 协议的五层模型又是哪些?

JAVA常见面试题总结(五)JAVA Web 和网络

16、如何实现跨域?

  • 方式一:JSONP
  • 方式二:CORS(Cross-Origin Resource Sharing),跨域资源共享
  • 方式三:代理资源共享(通过代理服务器实现跨域)
  • 方式四:HTML5 postMessage 方法。
  • 方式五:基于 HTML5 的 WebSocket 方式。

17、说一下 JSONP 的实现原理。

JSONP 即 JSON+padding,动态创建script标签,利用script标签的src属性可以获取任何域下的js脚本,通过这个特性,服务器端不再返回JSON格式,而是返回一段调用某个函数的js代码,在src中进行了调用,这样实现了跨域。