【巨人的肩膀】JAVA面试总结(六)

目录

    • 1、说一说Servlet的生命周期
    • 2、Servlet API 中 forward() 与 redirect()的区别
    • 3、request.getAttribute() 和 request.getParameter() 有何区别
    • 4、MVC的各个部分都有哪些技术来实现?如何实现?
    • 5、session和cookie有什么区别
    • 6、tomcat容器是如何创建servlet类实例?用到了什么原理?
    • 7、如何避免sql注入?
    • 8、什么是XSS攻击,如何避免?
    • 9、JDBC访问数据库的基本步骤是什么
    • 10、说说事务的概念,在JDBC编程中处理事务的步骤
    • 11、数据库连接池的原理,为什么要使用连接池
    • 12、JDBC的脏读是什么?哪种数据库隔离级别能防止脏读
    • 13、JDBC的DriverManager是用来做什么的?
    • 14、AJAX有哪些优点和缺点
    • 15、AJAX应用和传统Web应用有什么不同?
    • 16、JDBC的DataSource是什么,有什么好处?
    • 17、Cookie的过期和Session的超时有什么区别?
    • 18、如何解决分布式Session问题
    • 18、在单点登录中,如果cookie被禁用了怎么办
    • 19、session何时被删除
    • 20、什么是过滤器
    • 21、什么是监听器
    • 22、什么是拦截器
    • 23、过滤器和拦截器的区别
    • 24、web.xml的作用
    • 25、filter的生命周期

1、说一说Servlet的生命周期

Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。

web容器加载servlet,生命周期开始。通过调用servlet的init()方法进行servlet的初始化。通过调用service()方法实现,根据请求的不同调用不同的do()方法。结束服务,web容器调用servlet的destroy()方法。

2、Servlet API 中 forward() 与 redirect()的区别

  1. 从地址栏显示来说

    forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器。浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址

    redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.所以redirect等于客户端向服务器端发出两次request,同时也接受两次response

  2. 从数据共享来说

    forward:转发页面和转发到的页面可以共享request里面的数据

    redirect:不能共享数据

  3. 从运用地方来说

    forward:一般用于用户登陆的时候,根据角色转发到相应的模块

    redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等

  4. 从效率来说

    forward:高

    redirect:低

HTTP中重定向和请求转发的区别?

本质区别:

  • 转发是服务器行为
  • 重定向是客户端行为

重定向特点:两次请求,浏览器地址发生变化,可以访问自己 web 之外的资源,传输的数据会丢失。

求转发特点:一次强求,浏览器地址不变,访问的是自己本身的 web 资源,传输的数据不会丢失。

3、request.getAttribute() 和 request.getParameter() 有何区别

  • request.getParameter()取得是通过容器的实现来取得通过类似post,get等方式传入的数据。request.setAttribute()和getAttribute()只是在web容器内部流转,仅仅是请求处理阶段。
  • getAttribute是返回对象,getParameter返回字符串
  • getAttribute()一向是和setAttribute()一起使用的,只有先用setAttribute()设置之后,才能够通过getAttribute()来获得值,它们传递的是Object类型的数据。

4、MVC的各个部分都有哪些技术来实现?如何实现?

MVC是Model-View-Controller的简写。Model代表的是应用的业务逻辑(通过JavaBean,EJB组件实现),View是应用的表示面(由JSP页面产生),Controller是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。

5、session和cookie有什么区别

  • 由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识别具体的用户,这个机制就是Session。典型的场景比如购物车,当你点击下单按钮时,由于HTTP协议无状态,所以并不知道是哪个用户操作的,所以服务端要为特定的用户创建了特定的Session,用于标识这个用户,并且跟踪用户,这样才知道购物车里面有几本书。这个Session是保存在服务端的,有一个唯一标识。在服务端保存Session的方法很多,内存、数据库、文件都有。群的时候也要考虑Session的转移,在大型的网站,一般会有专门的Session服务器集群,用来保存用户会话,这个时候 Session 信息都是放在内存的,使用一些缓存服务比如Memcached之类的来放 Session。
  • 思考一下服务端如何识别特定的客户?这个时候Cookie就登场了。每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。实际上大多数的应用都是用 Cookie 来实现Session跟踪的,第一次创建Session的时候,服务端会在HTTP协议中告诉客户端,需要在 Cookie 里面记录一个Session ID,以后每次请求把这个会话ID发送到服务器,我就知道你是谁了。有人问,如果客户端的浏览器禁用了 Cookie 怎么办?一般这种情况下,会使用一种叫做URL重写的技术来进行会话跟踪,即每次HTTP交互,URL后面都会被附加上一个诸如 sid=xxxxx 这样的参数,服务端据此来识别用户。
  • Cookie其实还可以用在一些方便用户的场景下,设想你某次登陆过一个网站,下次登录的时候不想再次输入账号了,怎么办?这个信息可以写到Cookie里面,访问网站的时候,网站页面的脚本可以读取这个信息,就自动帮你把用户名给填了,能够方便一下用户。这也是Cookie名称的由来,给用户的一点甜头。所以,总结一下:Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。

如何实现自动登录?

当用户在某个网站注册后,就会收到一个唯一用户ID的cookie。客户后来重新连接时,这个用户ID会自动返回,服务器对它进行检查,确定它是否为注册用户且选择了自动登录,从而使用户无需给出明确的用户名和密码,就可以访问服务器上的资源。

6、tomcat容器是如何创建servlet类实例?用到了什么原理?

当容器启动时,会读取在webapps目录下所有的web应用中的web.xml文件,然后对xml文件进行解析,并读取servlet注册信息。然后,将每个应用中注册的servlet类都进行加载,并通过反射的方式实例化。(有时候也是在第一次请求时实例化)

在servlet注册时加上1如果为正数,则在一开始就实例化,如果不写或为负数,则第一次请求实例化。

7、如何避免sql注入?

  1. 最简单有效的方法:PreparedStatement,参数化查询方式,避免 SQL 拼接
  2. 使用正则表达式过滤传入的参数
  3. 字符串过滤
  4. JSP页面判断代码

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

XSS攻击又称CSS,全称Cross Site Script (跨站脚本攻击),其原理是攻击者向有XSS漏洞的网站中输入恶意的 HTML 代码,当用户浏览该网站时,这段 HTML 代码会自动执行,从而达到攻击的目的。XSS 攻击类似于 SQL 注入攻击,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻击中,通过插入恶意脚本,实现对用户游览器的控制,获取用户的一些信息。XSS是 Web 程序中常见的漏洞,XSS 属于被动式且用于客户端的攻击方式。

XSS防范的总体思路是:对输入(和URL参数)进行过滤,对输出进行编码。

9、JDBC访问数据库的基本步骤是什么

JDBC的全称是Java DataBase Connection,也就是Java数据库连接,我们可以用它来操作关系型数据库。

  1. Class.forName()加载数据库连接驱动
  2. DriverManager.getConnection()获取数据连接对象
  3. 根据 SQL 获取 sql 会话对象,有 2 种方式 Statement、PreparedStatement
  4. 执行 SQL 处理结果集,执行 SQL 前如果有参数值就设置参数值 setXXX()
  5. 关闭资源

常见的JDBC异常有哪些?

  • java.sql.SQLException:JDBC异常的基类。
  • java.sql.SQLWarning:SQL操作出现的警告信息
  • java.sql.DataTruncation:字段值由于某些非正常原因被截断了

10、说说事务的概念,在JDBC编程中处理事务的步骤

  1. 事务是作为单个逻辑工作单元执行的一系列操作。
  2. 一个逻辑工作单元必须有四个属性,称为原子性、一致性、隔离性和持久性 (ACID) 属性,只有这样才能成为一个事务

事务处理步骤:

  1. conn.setAutoComit(false);设置提交方式为手工提交
  2. conn.commit()提交事务
  3. 出现异常,回滚 conn.rollback();

11、数据库连接池的原理,为什么要使用连接池

  1. 数据库连接是一件费时的操作,连接池可以使多个操作共享一个连接。

  2. 数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。

    我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量、使用情况,为系统开发,测试及性能调整提供依据。

  3. 使用连接池是为了提高对数据库连接资源的管理

12、JDBC的脏读是什么?哪种数据库隔离级别能防止脏读

当我们使用事务时,有可能会出现这样的情况,有一行数据刚更新,与此同时另一个查询读到了这个刚更新的值。

这样就导致了脏读,因为更新的数据还没有进行持久化,更新这行数据的业务可能会进行回滚,这样这个数据就是无效的

数据库的TRANSACTIONREADCOMMITTED(读已提交),TRANSACTIONREPEATABLEREAD(),和TRANSACTION_SERIALIZABLE隔离级别可以防止脏读。

13、JDBC的DriverManager是用来做什么的?

JDBC的DriverManager是一个工厂类,我们通过它来创建数据库连接。当JDBC的Driver类被加载进来时,它会自己注册到DriverManager类里面

然后我们会把数据库配置信息传成DriverManager.getConnection()方法,DriverManager会使用注册到它里面的驱动来获取数据库连接,并返回给调用的程序。

14、AJAX有哪些优点和缺点

优点:

  • 最大的一点是页面无刷新,用户的体验非常好。
  • 使用异步方式与服务器通信,具有更加迅速的响应能力。
  • 可以把以前一些服务器负担的工作转嫁到客户端,利用客户端闲置的能力来处理,减轻服务器和带宽的负担,节约空间和宽带租用成本。并且减轻服务器的负担,ajax的原则是“按需取数据”,可以最大程度的减少冗余请求,和响应对服务器造成的负担。
  • 基于标准化的并被广泛支持的技术,不需要下载插件或者小程序

缺点:

  • ajax不支持浏览器back按钮。
  • 安全问题 AJAX暴露了与服务器交互的细节
  • 对搜索引擎的支持比较弱
  • 不容易调试

15、AJAX应用和传统Web应用有什么不同?

在传统的Javascript编程中,如果想得到服务器端数据库或文件上的信息,或者发送客户端信息到服务器,需要建立一个HTML form然后GET或者POST数据到服务器端。用户需要点击”Submit”按钮来发送或者接受数据信息,然后等待服务器响应请求,页面重新加载。

因为服务器每次都会返回一个新的页面, 所以传统的web应用有可能很慢而且用户交互不友好。

使用AJAX技术, 就可以使Javascript通过XMLHttpRequest对象直接与服务器进行交互。

通过HTTP Request, 一个web页面可以发送一个请求到web服务器并且接受web服务器返回的信息(不用重新加载页面),展示给用户的还是同一个页面,用户感觉页面刷新,也看不到到Javascript后台进行的发送请求和接受响应,体验非常好。

16、JDBC的DataSource是什么,有什么好处?

DataSource即数据源,跟DriverManager相比,它的功能要更强大。我们可以用它来创建数据库连接,当然驱动的实现类会实际去完成这个工作。除了能创建连接外,它还提供了如下的特性:

  • 缓存PreparedStatement以便更快的执行

  • 可以设置连接超时时间

  • 提供日志记录的功能

17、Cookie的过期和Session的超时有什么区别?

Cookie的过期和Session的超时(过期),都是对某个对象设置一个时间,然后采用轮询机制检查当前对象是否超时,如果超时则进行移除。

  • cookie保存在浏览器中,不安全。而session是保存在服务端的。cookie的生命周期很长,而session很短,一般也就几十分钟。

  • cookie是保存在客户端,session保存在服务器端,cookie保存着session相关信息。 如果cookie没有超时,那么浏览器每次请求都会带上该cookie信息,服务器端根据cookie信息从session缓存中获取相对应的session。这两个信息有一个超时,用户连接即宣告关闭

18、如何解决分布式Session问题

  • Nginx ip_hash策略 ,服务端使用 Nginx 代理,每个请求按访问 IP 的 hash 分配,这样来自同一 IP 固定访问一个后台服务器,避免了在服务器 A 创建 Session,第二次分发到服务器 B 的现象
  • Session 复制,任何一个服务器上的 Session 发生改变(增删改),该节点会把这个 Session 的所有内容序列化,然后广播给所有其它节点。
  • 共享 Session,将用户的 Session 等信息使用缓存中间件来统一管理,保障分发到每一个服务器的响应结果都一致

18、在单点登录中,如果cookie被禁用了怎么办

单点登录的原理是后端生成一个 session ID,然后设置到 cookie,后面的所有请求浏览器都会带上 cookie,然后服务端从 cookie 里获取 session ID,再查询到用户信息。

所以,保持登录的关键不是 cookie,而是通过cookie 保存和传输的 session ID,其本质是能获取用户信息的数据。 除了 cookie,还通常使用 HTTP 请求头来传输。但是这个请求头浏览器不会像 cookie 一样自动携带,需要手工处理。

19、session何时被删除

session在下列情况下被删除:

  • 程序调用HttpSession.invalidate()
  • 距离上一次收到客户端发送的session id时间间隔超过了session的最大有效时间
  • 服务器进程被停止

注意关闭浏览器只会使存储在客户端浏览器内存中的session cookie失效,不会使服务器端的session对象失效。

20、什么是过滤器

定义:依赖于servlet容器; 在实现上基于函数回调,可以对几乎所有请求进行过滤; 缺点是一个过滤器实例只能在容器初始化时调用一次;

作用: 用来做一些过滤操作,获取我们想要获取的数据: 在过滤器中修改字符编码; 在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等。

21、什么是监听器

定义:实现了javax.servlet.ServletContextListener 接口的服务器端程序; 随web应用的启动而启动;只初始化一次; 随web应用的停止而销毁;

作用: 做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等。如SpringMVC的监听器org.springframework.web.context.ContextLoaderListener,实现了SpringMVC容器的加载Bean对象创建DispatchServlet初始化等。

22、什么是拦截器

依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架; 在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用; 缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理;

由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。

23、过滤器和拦截器的区别

拦截器 过滤器
基于Java反射机制 基于函数回调
不依赖Servlet容器 依赖Servlet容器
只能对action起作用 几乎对所有请求起作用
拦截器不能修改request 过滤器可以修改request
拦截器可以调用IOC容器中的各种依赖 过滤器不能调用IOC容器中的各种依赖
拦截器可以详细到每个方法 过滤器只能在请求的前后使用

过滤器主要是过滤出要的东西,如requeset中的信息;拦截器在做安全方面用的比较多,比如终止一些流程

24、web.xml的作用

用于配置Web应用的相关信息 如:监听器(listener)、过滤器(filter)、 Servlet、相关参数、会话超时时间、安全验证方式、错误页面等。

25、filter的生命周期

  • 启动服务器时加载过滤器的实例,并调用init()方法来初始化实例;
  • 每一次请求时都只调用方法doFilter()进行处理;
  • 停止服务器时调用destroy()方法,销毁实例。

你可能感兴趣的:(#,JAVA,java,面试,servlet)