二阶段面试题
1.说下原生 jdbc 操作数据库流程?
第一步:Class.forName()加载数据库连接驱动;
第二步:DriverManager.getConnection()获取数据连接对象;
第三步:根据 SQL 获取 sql 会话对象,有 2 种方式 Statement、PreparedStatement ;
第四步:执行 SQL 处理结果集,执行 SQL 前如果有参数值就设置参数值 setXXX();
第五步:关闭结果集、关闭会话、关闭连接。
2.HTTP有哪些请求方法?
HTTP请求的常用方法有:GET方法、POST方法、HEAD方法、PUT方法、DELETE方法、CONNECT方法、OPTIONS方法、TRACE方法。
具体详情:https://www.cnblogs.com/yinrw/p/10694474.html
3.如何解决跨域问题?
Jsonp 和 CORS
CORS 是一个 W3C 标准,全称是"跨域资源共享"(Cross-origin resource sharing)。CORS 需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE 浏览器不能低于 IE10。 它允许浏览器向跨源服务器,发出 XMLHttpRequest 请求,从而克服了 AJAX 只能同源 使用的限制。整个 CORS 通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来 说,CORS 通信与同源的 AJAX 通信没有差别,代码完全一样。浏览器一旦发现 AJAX 请求跨 源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。 因此,实现 CORS 通信的关键是服务器。只要服务器实现了 CORS 接口,就可以跨源通信。 CORS 请求默认不发送 Cookie 和 HTTP 认证信息。如果要把 Cookie 发到服务器,一方面要服 务器同意,指定 Access-Control-Allow-Credentials 字段。另一方面,开发者必须在 AJAX 请求 中打开 withCredentials 属性。否则,即使服务器同意发送 Cookie,浏览器也不会发送。或者, 服务器要求设置 Cookie,浏览器也不会处理。
4.简述Get,Post请求的区别以及他们的传参方式?
get和post的区别首先:从本质上区别
1.GET用于信息获取(查)
2.POST表示可能修改变服务器上的资源的请求(增删改)
再者:从表现形式上区别
1.如果使用GET请求,需要传递参数时,只能通过URL传值
2.如果使用POST请求,需要传递参数时,能够通过表单传值
5.servlet,filter,listener,interceptor之间的区别和联系?
1.servlet:servlet 是一种运行服务器端的 java 应用程序
2.filter:filter 是一个可以复用的代码片段,可以用来转换 HTTP 请求、响应和头信息
3.listener:监听器,通过 listener 可以监听 web 服务器中某一个执行动作,并根据其要求作出相 应的响应。
4.interceptor:是在面向切面编程的,就是在你的 service 或者一个方法,前调用一个方法,或 者在方法后调用一个方法。比如动态代理就是拦截器的简单实现 servlet、filter、listener 是配置到 web.xml 中,interceptor 不配置到 web.xml 中,struts 的拦截 器配置到 struts.xml 中。spring 的拦截器配置到 spring.xml 中。
5.加载顺序 web.xml 的加载顺序是:context- param -> listener -> filter -> servlet
6.JSP有哪些内置对象和动作?它们的作用分别是什么?
1、request对象:客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。
2、response对象:response对象包含了响应客户请求的有关信息。
3、session对象:session对象指的是客户端与服务器的一次会话,从客户连到服务器的一个WebApplication开始,直到客户端与服务器断开连接为止。
4、out对象:是向客户端输出内容常用的对象
5、page对象:page对象就是指向当前JSP页面本身,有点象类中的this指针。
6、application对象:application对象实现了用户间数据的共享,可存放全局变量。它开始于服务器的启动,直到服务器的关闭,在此期间,此对象将一直存在;这样在用户的前后连接或不同用户之间的连接中,可以对此对象的同一属性进行操作;在任何地方对此对象属性的操作,都将影响到其他用户对此的访问。服务器的启动和关闭决定了application对象的生命。
7、exception对象:exception对象是一个例外对象,当一个页面在运行过程中发生了例外,就产生这个对象。如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译。
8、pageContext对象:pageContext对象提供了对JSP页面内所有的对象及名字空间的访问,也就是说他可以访问到本页所在的SESSION,也可以取本页面所在的application的某一属性值,他相当于页面中所有功能的集大成者,它的本类名也叫pageContext。
9、config对象:config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象)。
7.forward(请求转发)和redireet(重定向)的区别?
本质区别:转发是服务器行为,重定向是客户端行为。
重定向特点:两次请求,浏览器地址发生变化,可以访问自己 web 之外的资源,传输的数据会 丢失。
请求转发特点:一次强求,浏览器地址不变,访问的是自己本身的 web 资源,传输的数据不会 丢失
8.JSP中动态INCLUDE与静态INCLUDE 的区别?
动态INCLUDE
用法:<jsp:include page="included.jsp" flush="true" />
说明:它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数,先编译之后再进行处理。
原因:
1、静态include的结果是把其他jsp引入当前jsp,两者合为一体。
2、静态include纯粹是把代码写在外面的一种共享方法,所有的变量都是可以和include它的主文件共享,两者高度紧密结合,不能有变量同名的冲突.而页面设置也可以借用主文件的.
静态INCLUDE
用法:<%@ include file="included.htm" %>
说明:用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面,直接将内容先包含后处理。
原因:
1、动态include的结构是两者独立,直到输出时才合并( 看看jsp生成的java文件就可以知道了)。
2、动态include的jsp文件独立性很强,是一个单独的jsp文件,需要使用的对象,页面设置,都必须有自己创建,当然,还好它和include它的页面的request范围是一致的。
9.什么是 xml,使用 xml 的优缺点,xml 的解析器有哪几种,分别有什么区别?
1.xml 是一种可扩展性标记语言,支持自定义标签(使用前必须预定义)使用 DTD 和 XML Schema 标准化 XML 结构。
2.优点:用于配置文件,格式统一,符合标准;用于在互不兼容的系统间交互数据,共享数据方便;
3.缺点:xml 文件格式复杂,数据传输占流量,服务端和客户端解析 xml 文件占用大量资源且不易 维护Xml
4.常用解析器有 2 种,分别是:DOM 和 SAX;
5.主要区别在于它们解析 xml 文档的方式不同。使用 DOM 解析,xml 文档以 DOM 树形结构加载入内存,而 SAX 采用的是事件模型
10.Session和Cookie的区别?
1.Cookie 是 web 服务器发送给浏览器的一块信息,浏览器会在本地一个文件中给每个 web 服务 器存储 cookie。 以后浏览器再给特定的 web 服务器发送请求时,同时会发送所有为该服务器存储的 cookie。
2.Session 是存储在 web 服务器端的一块信息。session 对象存储特定用户会话所需的属性及配置 信息。 当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。
Cookie 和 session 的不同点:
1、无论客户端做怎样的设置,session 都能够正常工作。当客户端禁用 cookie 时将无法使用 cookie。
2、在存储的数据量方面:session 能够存储任意的 java 对象,cookie 只能存储 String 类型的对象。
11.在单点登录中,如果 cookie 被禁用了怎么办?
单点登录的原理是后端生成一个 session ID,然后设置到 cookie,后面的所有请求浏览器都 会带上 cookie,然后服务端从 cookie 里获取 session ID,再查询到用户信息。所以,保持登录 的关键不是 cookie,而是通过 cookie 保存和传输的 session ID,其本质是能获取用户信息的数 据。除了 cookie,还通常使用 HTTP 请求头来传输。但是这个请求头浏览器不会像 cookie 一样 自动携带,需要手工处理。
12.什么是Ajax异步请求和同步请求?
1.同步:指发送一个请求,需要等待返回,然后才能够发送下一个请求zhi,有个等待过程;
2.异步:指发送一个请求,不需要等待返回,随时可以再发送下一个请求,即不需要等待。
3.区别:一个需要等待,一个不需要等待,在部分情况下,我们的项目开发中都会优先选择不需要等待的异步交互方式。
13.简单说明下request、response、session、application之间的作用域及各自的运行机制?
1.request:服务器获取用户请求; 其作用域为在当前页面有效
2.response:服务器答复用户请求的资源;其作用域为在当前http请求中有效
3.session:用户使用服务器开始到结束的过程; 其作用域为在当前会话中有效
4.application:网站服务器启动到停止的过程;其作用域为在所有应用程序中有效,应用程序就是访问的网站服务器
5.request就是一个HTTP客户端请求,处理request可能需要多个Servlet合作, 几个Servlet之间可以通过某种方式传递信息,但这个信息在请求结束后就无效了
6.response就是一个HTTP服务器答复,将servlet处理结果答复给客户端
7.session与用户是一对一关系,一个web应用程序可以同时有多个用户在线,每个用户都有对应唯一的session,一个session就是一个用户从开始使用客户端到结束使用客户端的过程,这个过程可以有多个request和response。
8.application与用户是一对多关系,类似于一个web应用程序对应于多个用户在线使用,每个web应用程序对应只有一个aaplication,在一起协同工作以完成某项任务的一组 ASP 文件称作应用程序(application)。ASP 中的 Application 对象用于将这些文件捆绑在一起。application就是网站服务器从启动到停止的过程。
14.请描述下cookie、sessionStorage、localStorage的区别?
⒈localStorage长期存储数据,浏览器关闭数据后不丢失;
⒉sessionStorage数据在浏览器关闭后自动删除;
⒊cookie是网站为了标识用户身份而存储在用户本地终端(Client Side)上的数据(通常经过加密)。cookie始终在同源的http请求中携带(即使不需要)都会在浏览器和服务器端间来回传递。session storage和local storage不会自动把数据发给服务器,仅在本地保存;
⒋存储大小:cookie数据大小不会超过4K,session storage和local storage虽然也有存储大小的限制,但比cookie大得多,可以达到5M或者更多;
⒌有期时间:local storage存储持久数据,浏览器关闭后数据不丢失,除非自动删除数据。session storage数据在当前浏览器窗口关闭后自动删除。cookie 设置的cookie过期时间之前一直有效,即使窗口或者浏览器关闭;
15.关系数据库中连接池的机制是什么?
前提:为数据库连接建立一个缓冲池。
1:从连接池获取或创建可用连接
2:使用完毕之后,把连接返回给连接池
3:在系统关闭前,断开所有连接并释放连接占用的系统资源
4:能够处理无效连接,限制连接池中的连接总数不低于或者不超过某个限定值。
其中有几个概念需要大家理解:
1.最小连接数是连接池一直保持的数据连接。如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费掉。
2.最大连接数是连接池能申请的最大连接数。如果数据连接请求超过此数,后面的数据连接请求将被加入到等待队列中,这会影响之后的数据库操作。
3.如果最小连接数与最大连接数相差太大,那么,最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放。
4.上面的解释,可以这样理解:数据库池连接数量一直保持一个不少于最小连接数的数量,当数量不够时,数据库会创建一些连接,直到一个最大连接数,之后连接数据库就会等待。
16.数据库连接池的原理。为什么要使用连接池?
1,数据库连接是一件费时的操作,连接池可以使多个操作共享一个连接。
2,数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数 量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我 们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过 连接池的管理机制监视数据库的连接的数量、使用情况,为系统开发,测试及性能调整提供依据。
3,使用连接池是为了提高对数据库连接资源的管理
常用的数据库连接池:DBCP、C3P0、Druid
17.什么是反射,反射能干嘛?
反射是:指程序可以访问、检测和修改它本身状态或行为的一种能力在java中就是:反射将加载后的类中的各个组成部分封装为其他对象;
我们平时用反射主要做:
1.获取类型的相关信息
2.动态调用方法
3.动态构造对象
4.从程序集中获得类型
18.说几个开发中常见的异常?
1.StackOverFlower(栈溢出错误)
2.OutOfMemoryError(JVM内存空间不足)
3.NullPointerException(空指针异常)
4.ArrayIndexOutOfBoundsException (下标越界异常)使用数组,尤其是做for循环判断条件的时候,很容易引发的一个问题。
5.UnkownTypeException (不知道类型异常) 有时候不强制转换,会报这个异常。
6.ClassNotFoundException (类)报错是确实是常见的
19.HTTP 和 HTTPS 的区别?
1.HTTP 协议传输的数据都是未加密的,也就是明文的,因此使用 HTTP 协议传输隐私信息非常不 安全,为了保证这些隐私数据能加密传输,于是网景公司设计了 SSL(Secure Sockets Layer) 协议用于对 HTTP 协议传输的数据进行加密,从而就诞生了
2.HTTPS。 简单来说,HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,要 比 http 协议安全
主要区别:
1、https 协议需要到 ca 申请证书,一般免费证书较少,因而需要一定费用。 2、http 是超文本传输协议,信息是明文传输,https 则是具有安全性的 ssl 加密传输协议。
3、http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443。
4、http 的连接很简单,是无状态的;HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、 身份认证的网络协议,比 http 协议安全
20.说说事务的概念,在 JDBC 编程中处理事务的步骤?
1.事务是作为单个逻辑工作单元执行的一系列操作。一个逻辑工作单元必须有四个属性,称为原子性、一致性、隔离性和持久性 (ACID) 属性,只有这样才能成为一个事务。
事务处理步骤:
1.conn.setAutoComit(false);设置提交方式为手工提交
2.conn.commit()提交事务
3.出现异常,回滚 conn.rollback()
21.JDBC 的脏读是什么?哪种数据库隔离级别能防止脏读?
脏读:有一行数据刚更新,与此同时另一个查询读到了这个刚更新的值。
防止脏读的隔离级别:
Read committed (读已提交)
Serializable (串行化)
Repeatable read (可重复读)
22.Http 常见的状态码有哪些?
200 OK //客户端请求成功
301 Moved Permanently(永久移除),请求的 URL 已移走。Response 中应该包含一个 Location URL, 说明资源现在所处的位置
302 found 重定向
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的 URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
23.tomcat 容器是如何创建 servlet 类实例?
1.当容器启动时,会读取在webapps目录下所有的web应用中的web.xml文件,然后对 xml文件进行解析,并读取servlet注册信息。然后,将每个应用中注册的servlet类都进行加载,并通过 反射的方式实例化。(有时候也是在第一次请求时实例化)
2.在servlet注册时加上1如果为正数,则在一开始就实例化,如果不写或为负数,则第一次请求实例化。
24.EL表达式的功能,为什么要用EL表达式?
1.EL(Expression Language) 是为了使JSP写起来更加简单。减少java代码,便于开发和维护。
功能作用:
1.获取数据:EL表达式主要用于du替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象、获取dao数据。(某个web域 中的对象,访问javabean的属性、访问list集合、访问map集合、访问数组)
2.执行运算:利用EL表达式可以在JSP页面中执行一些基本的关系运算、逻辑运算和算术运算,以在JSP页面中完成一些简单的逻辑运算。${user==null}
3.获取web开发常用对象:EL 表达式定义了一些隐式对象,利用这些隐式对象,web开发人员可以很轻松获得对web常用对象的引用,从而获得这些对象中的数据。
4.调用Java方法:EL表达式允许用户开发自定义EL函数,以在JSP页面中通过EL表达式调用Java类的方法。
5.使用EL表达式获取数据语法:“${标识符}”EL表达式语句在执行时,会调用pageContext.findAttribute方法,用标识符为关键字,分别从page、requestsession、application四个域中查找相应的对象,找到则返回相应对象,找不到则返回”” (注意,不是null,而是空字符串)。
25.什么要使用 PreparedStatement?
1、 PreparedStatement 接口继承 Statement, PreparedStatement 实例包含已编译的 SQL 语句, 所以其执行速度要快于 Statement 对象。
2 、 作 为 Statement 的 子 类 , PreparedStatement 继 承 了 Statement 的 所 有 功 能 。 三 种 方法 execute、 executeQuery 和 executeUpdate 已被更改以使之不再需要参数
3、在 JDBC 应用中,在任何时候都不要使用 Statement
原因如下:
一、代码的可读性和可维护性.Statement 需要不断地拼接,而 PreparedStatement 不会。
二、PreparedStatement 尽最大可能提高性能.DB 有缓存机制,相同的预编译语句再次被调用不 会再次需要编译。
三、最重要的一点是极大地提高了安全性.Statement 容易被 SQL 注入,而 PreparedStatementc 传入的内容不会和 sql 语句发生任何匹配关系
26.什么是幻读,哪种隔离级别可以防止幻读?
幻读是指一个事务多次执行一条查询返回的却是不同的值。假设一个事务正根据某个条件进行数 据查询,然后另一个事务插入了一行满足这个查询条件的数据。之后这个事务再次执行了这条查 询,返回的结果集中会包含刚插入的那条新数据。这行新数据被称为幻行,而这种现象就叫做幻 读。
只有 TRANSACTION_SERIALIZABLE 隔离级别才能防止产生幻读。
27.Servlet 生命周期?
1、Servlet 通过调用 init () 方法进行初始化。
2、Servlet 调用 service() 方法来处理客户端的请求。
3、Servlet 通过调用 destroy() 方法终止(结束)。
28.tomcat 容器是如何创建 servlet 类实例?用到了什么原理?
当容器启动时,会读取在 webapps 目录下所有的 web 应用中的 web.xml 文件,然后对 xml 文 件进行解析,并读取 servlet 注册信息。然后,将每个应用中注册的 servlet 类都进行加载,并通 过反射的方式实例化。(有时候也是在第一次请求时实例化)
在 servlet 注册时加上<load-on-startup>1</load-on-startup>如果为正数,则在一开始就 实例化,如果不写或为负数,则第一次请求实例化。
29.谈谈你对 ajax 的认识?
Ajax 是一种创建交互式网页应用的的网页开发技术
Ajax 的最大特点:可以实现局部刷新,在不更新整个页面的前提下维护数据,提升用户体验度。
30.说下jsonp 原理?
jsonp 的最基本的原理是:动态添加一个<script>标签,使用 script 标签的 src 属性没有跨域的 限制的特点实现跨域。首先在客户端注册一个 callback, 然后把 callback 的名字传给服务器。此 时,服务器先生成 json 数据。 然后以 javascript 语法的方式,生成一个 function , function 名 字就是传递上来的参数 jsonp。最后将 json 数据直接以入参的方式,放置到 function 中,这样 就生成了一段 js 语法的文档,返回给客户端。
客户端浏览器,解析 script 标签,并执行返回的 javascript 文档,此时数据作为参数,传入到了 客户端预先定义好的 callback 函数里。
31.在JS中和=的区别?
==:叫相等运算符
===:叫严格运算符
区别:
== :表示值相等则都为true
===:表示 不仅要值相等,双方类型也要相等才为true
32.http的长连接和短连接区别?
1.HTTP协议有HTTP/1.0版本和HTTP/1.1版本。HTTP1.1默认保持长连接(HTTP persistent connection,也翻译为持久连接),数据传输完成了保持TCP连接不断开(不发RST包、不四次握手),等待在同域名下继续用这个通道传输数据;相反的就是短连接。
2.在 HTTP/1.0 中,默认使用的是短连接。也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。从HTTP/1.1起,默认使用的是长连接,用以保持连接特性。
33.描述Servlet调用过程?
(1)在浏览器输入地址,浏览器先去查找hosts文件,将主机名翻译为ip地址,如果找不到就再去查询dns服务器将主机名翻译成ip地址。
(2)浏览器根据ip地址和端口号访问服务器,组织http请求信息发送给服务器。
(3)服务器收到请求后首先根据Host请求头判断当前访问的是哪台虚拟主机。
(4)服务器根据http请求头中的请求URI判断当前访问的是哪个web应用。
(5)服务器根据http请求头中的请求URI判断当前访问的是web应用中的哪个web资源。
(6)检查web应用的web.xml文件,如果根据路径找到具体的servlet处理类的全路径名交给该servlet处理,如果找不到就交给缺省servlet处理。
(7)这个过程中浏览器只知道自己发出来http请求,不久就收到了http响应,浏览器不知道也不关心服务器内部是如何处理的。浏览器和服务器之间的关系是非常单纯的,只有HTTP协议。
(8)解析请求、封装RequestResponse对象、创建Servlet、调用Service方法都是服务器自动进行的,开发人员只需要写好Servlet配置进容器中即可,无需操心具体的底层实现。
34.简述Servlet生命周期?
(1)Servlet第一次被访问到时创建对象,创建出来后立即执行init方法执行初始化的操作。
(2)从此以后该对象一直驻留在内存中为后续的对这个Servlet的请求进行服务。
(3)直到服务器关闭或web应用移除出容器时,随着web应用的销毁Servlet对象销毁掉,在销毁之前调用destory方法执行善后工作。
(4)在存活期间,每次对Servlet 的调用都会导致Service方法的执行。
35.HTTP协议的特点是什么 ?
(1) 它是一个无状态的协议,服务器端在处理相应请求后不会保留任何客户端的信息,每次请求都是独立的
(2) 客户端与服务器端的每一次数据交互,都要经过一次请求/响应的过程。
(3) 服务器端无法识别能够出发客户端请求的方法。
(4) 一个典型的HTTP请求分为 一个请求行 若干请求头 一个空行 实体内容。
36.请求乱码产生的原因?
浏览器用什么码表来打开表单页面就用什么编码来发送数据。当前我们的注册页面指定了用utf-8来打开。这就决定了浏览器是用utf-8打开的页面,浏览器在提交表单时是用utf-8编码的。而tomcat默认情况下会使用iso8859-1来进行解码。我们知道全世界的码表都兼容iso8859-1,所以英文处理是没有问题的。但是iso8859-1中并没有中文,iso8859-1对于无法处理的字节都使用?(问号)替代,所以我们看到的都是?(问号)
37.如何来处理get请求产生的乱码?
由于客户端发送时使用的是utf-8编码而服务器用iso8859-1解码造成了乱码,虽然字符已经乱掉了,但底层的字节仍然是正确的,我们只要将乱码字符getBytes(“iso8859-1”)转换为字节,就是正确的字节,再将这些字节new String(bytes,“utf-8”)按照正确的码表编码,就可以转换回正确的字符了。从而解决了乱码。
38.如何处理响应乱码?
通过response.setHeader("Content-Type", "text/html;charset=utf-8")方法,通知服务器发送数据时的码表;通过response.setCharacterEncoding("utf-8")方法,通知浏览器解析时使用的码表。两码相同就不会有乱码了。
response提供了setContentType("text/html;charset=UTF-8")快捷方法,在它的底层,会同时做上面两件事,所以可以一行代码解决response产生的乱码问题。
39.简述ServletContext生命周期?
ServletContext对象代表当前web应用。当服务器启动时,服务器在启动时会依次加载web应用,每一个web应用加载完成后都会创建一个ServletContext对象唯一代表该web应用,这个对象一直存活,直到web应用移除出容器或服务器关闭时,随着应用销毁,ServletContext对象跟着销毁。
40.Session生命周期?
当程序第一次调用到request.getSession()代码时,服务器明确的知道了需要用到session了,此时创建session。
如果session超过30分钟(可以在web.xml中配置的)没人使用,服务器认为这个session超时了,销毁session。
明确的调用session.invalidate(),session立即销毁。
服务器被非正常关闭或web应用被移除出容器,此时随着web应用的销毁session销毁.如果是正常关闭,session会被钝化.当下次服务器正常启动时,没有超时的session还会被活化回来。
41.session的原理?
session的原理:在服务器第一次调用request.getSession()方法的时候,会在内存中创建一个session对象,此对象具有一个独一无二的id值,此id值将会以cookie(JSESSIONID)的形式发送给浏览器,浏览器以后每次访问都会带着此cookie,服务器就利用此cookie区分浏览器找到对应的session空间。
42.如何防止SQL注入攻击呢?
SQL注入:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
防止的办法:
(1) 永远不要信任用户的输入,要对用户的输入进行校验,可以通过正则表达式,或限制长度,对单引号和双"-"进行转换等。
(2) 永远不要使用动态拼装SQL,可以使用参数化的SQL或者直接使用存储过程进行数据查询存取。
(3) 永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
(4) 不要把机密信息明文存放,请加密或者hash掉密码和敏感的信息。
(5) 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装,把异常信息存放在独立的表中。
43.如何自己实现一个数据库连接池?
1:利用class实现DataSource接口
2:在class的构造器一次性创建指定的链接将链接保存LinkedList中
3:实现getConnection从LinkedList返回一个链接
4:提供将链接放回方法
44.Filter 的作用是什么?
init为初始化方法,在Filter对象被创建出来时,Servlet容器会调用该方法对filter进行初始化。
destory为销毁的方法,在过滤器对象被销毁之前,服务器会调用这个方法执行善后工作。
doFilter为过滤器中最核心的方法,对访问的请求和响应进行拦截,当过滤器拦截到对资源的访问时,服务器会自动调用该方法执行过滤代码。 我们只需要在这个方法中设计过滤器的逻辑代码即可。
45.Filter的生命周期?
当服务器启动,web应用加载后,立即创建出这个web应用中的所有过滤器对象,创建出来后立即调用过滤器的init方法执行初始化操作.从此这些过滤器对象驻留在内存中为后续的拦截进行服务.每当拦截到资源时,都会导致dofilter方法执行.最终直到服务器关闭或web应用移除出容器时,随着web应用的销毁,过滤器对象销毁,销毁之前调用destory方法执行善后工作。
46.Servlet的单例问题?
Servlet是一个供其他java程序调用的类,它不能独立运行,针对客户端的多次请求,通常状况下,Servlet只会创建一个Servlet实例对象,一旦创建它就会驻留在内存中,为后续的请求提供服务,直至退出web应用为止,也就是当我们关闭了浏览器之后我们的Servlet就终止了。
当Servlet第一次访问的时候,就被加载到内存中,以后该实例对各个请求服务,没次情况会调用一次service方法。
这样会出现什么问题:因为Servlet是单例的,所以会出现线程安全问题
47.Servlet的多线程同步问题?
Servlet本身是单实例的,这样当有多个用户同时访问某个Servlet时,会访问该唯一的Servlet实例中的成员变量,如果对成员变量进行写入操作,那就会导致Servlet的多线程问题,即数据不一致。
1.解决Servlet多线程同步问题的最好方式:去除实例变量,使用局部变量。
不使用成员变量,而使用局部变量,因为局部变量在每个线程中都有各自的实例。
所以对Servlet来说,如果要对某个变量做写入操作,一定不要使用成员变量,而要使用局部变量。
2.使用同步代码块
synchronized{}
3.Servlet实现javax.serlvet.SingleThreadModel,Servlet2.4中已经废弃了该接口,此时Servlet容器将保证Servlet实例以单线程方式运行,也就是说,同一时刻,只会有一个线程执行Servlet的service()方法。
48.如何防止表单重复提交?
使用session技术:
a、在regist.jsp页面中生成一个为一个随机值,将其保存到session中,同时将其保存为表单的隐藏域的值。
b、在处理注册的请求时,获取session中的值,获取请求参数的值,比较两者是否相同,如果相同说明不是重复提交,请求通过同时删除session中保存的的值,如果不相同则是重复提交,不能通过。
49.什么是web容器?
给处于其中的应用程序组件(JSP、Servlet)提供一个环境,是JSP、Servlet直接跟容器中的变量交互,不必关注其他系统问题。
主要有web服务器来实现。例如:tomcat、weblogic、sphere、JBoss等。该容器提供的接口严格遵守J2EE规范中的web application标准。
我们把遵守以上标准的web服务器叫做J2EE的web容器。
50.HTML和xml的区别?
XML是可扩展标记语言,而HTML超文本标记语言。不同之处:
1、语法有所不同。XML语法比较严谨而HTML语法比较松散。
2、用途不同。XML主要用于数据格式化存储而HTML主要用于网页的编辑。
51.Tomcat配置,部署优化?
1.内存优化:Tomcat依赖于JVM,可以配置JVM的内存配置
2.最大连接数配置(并发能力)
通常搭配Nginx提升Tomcat的并发性能
52.事务有哪些特性?
事务的特性:ACID
A - 原子性 Atomic
数据操作的最小单元是事务,而不是SQL语句
C - 一致性 Consistency
转账前 a+b = 100
转帐后 a+b = 100
I - 隔离性 Isolation
一个事物进行中时,另一事物不能操作数据
D - 持久性 Durancy
事务没有提交之前,数据操作只保存在日志文件中
提交事务之后,数据持久生效
53.Request和Session的取值区别,以及出现乱码的解决方式(不能在java代码中设置)?
1、Request可以通过getAttribute()方法直接取值,也可通过getParameter()取值
2、Session需要通过request.getSession().getAttribute()才能取值
3、Request是针对一次请求,Session是针对整个会话
4、在页面通过contentType,pageEncoding,content设置编码格式,必须要一致
54.对数据库连接池的理解?
用来提高程序的效率,创建一个容器,容器中存放已经获取到了的数据库连接对象,对外提供获取连接和还回连接的方法,外界需要时就从容器中获取,用完就还回容器中。