JAVA前端与后端交互面试题
JAVA前端与后端交互⾯试题
1.前端与后端交互⾯试题
1.1. 描述Servlet调⽤过程?
答案:
(1)在浏览器输⼊地址,浏览器先去查hosts⽂件,将主机名翻译为ip地址,如果不到就再去查询dns服务器将主机名翻译成ip地址。(2)浏览器根据ip地址和端⼝号访问服务器,组织http请求信息发送给服务器。
(3)服务器收到请求后⾸先根据Host请求头判断当前访问的是哪台虚拟主机。
(4)服务器根据http请求头中的请求URI判断当前访问的是哪个web应⽤。
(5)服务器根据http请求头中的请求URI判断当前访问的是web应⽤中的哪个web资源。
(6)检查web应⽤的l⽂件,如果根据路径到具体的servlet处理类的全路径名交给该servlet处理,如果不到就交给缺省servlet 处理。
(7)这个过程中浏览器只知道⾃⼰发出来http请求,不久就收到了http响应,浏览器不知道也不关⼼服务器内部是如何处理的。浏览器和服务器之间的关系是⾮常单纯的,只有HTTP协议。
(8)解析请求、封装RequestResponse对象、创建Servlet、调⽤Service⽅法都是服务器⾃动进⾏的,开发⼈员只需要写好Servlet配置进容器中即可,⽆需操⼼具体的底层实现。
1.2. 简述Servlet⽣命周期?
答案:
(1)Servlet第⼀次被访问到时创建对象,创建出来后⽴即执⾏init⽅法执⾏初始化的操作。
(2)从此以后该对象⼀直驻留在内存中为后续的对这个Servlet的请求进⾏服务。
(3)直到服务器关闭或web应⽤移除出容器时,随着web应⽤的销毁Servlet对象销毁掉,在销毁之前调⽤destory⽅法执⾏善后⼯作。(4)在存活期间,每次对Servlet 的调⽤都会导致Service⽅法的执⾏。
1.3. 什么是http协议?
答案:
HTTP协议就是⼀套基于tcp/ip协议的应⽤层协议 。简单来说,就是⼀个基于应⽤层的通信规范,双⽅要进⾏通信,⼤家都要遵守⼀个规范,这个规范就是HTTP协议。它规定了客户端(通常是浏览器)和服务器之间的通信⽅式。
1.4. HTTP协议⼯作原理?
答案:
HTTP协议基于请求响应模型。
勉学
⼀次请求对应⼀次响应。
⾸先客户端发送⼀个请求(request)给服务器,服务器在接收到这个请求后将⽣成⼀个响应(response)返回给客户端。
1.5. HTTP协议的特点是什么 ?
答案:
(1) 它是⼀个⽆状态的协议,服务器端在处理相应请求后不会保留任何客户端的信息,每次请求都是独⽴的
(2) 客户端与服务器端的每⼀次数据交互,都要经过⼀次请求/响应的过程。
(3) 服务器端⽆法识别能够出发客户端请求的⽅法。
(4) ⼀个典型的HTTP请求分为 ⼀个请求⾏ 若⼲请求头 ⼀个空⾏ 实体内容。
1.6. get和post请求的区别?
答案:
(1) get请求⽤来从服务器上获得资源,⽽post是⽤来向服务器提交数据;
(2) get将表单中数据按照name=value的形式,添加到action 所指向的URL 后⾯,并且两者使⽤"?“连接,⽽各个变量之间使
⽤”&“连接;post是将表单中的数据放在HTTP协议的请求头或消息体中,传递到action所指向URL;
(3) get传输的数据要受到URL长度限制(1024字节);⽽post可以传输⼤量的数据, POST数据是没有限制的,上传⽂件通常要使⽤post⽅式;
(4) 使⽤get时参数会显⽰在地址栏上,如果这些数据不是敏感数据,那么可以使⽤get;对于敏感
数据还是应⽤使⽤post;
(5) get使⽤MIME类型application/x-www-form-urlencoded的URL编码(也叫百分号编码)⽂本的格式传递参数,保证被传送的参数由遵循规范的⽂本组成,例如⼀个空格的编码是”%20"。
(6) Jsp页⾯中的FORM标签⾥的method属性为get时调⽤doGet(),为post时调⽤doPost()。
1.7. 请求乱码产⽣的原因?
答案:
浏览器⽤什么码表来打开表单页⾯就⽤什么编码来发送数据。当前我们的注册页⾯指定了⽤utf-8来打开。
这就决定了浏览器是⽤utf-8打开的页⾯,浏览器在提交表单时是⽤utf-8编码的。
⽽tomcat默认情况下会使⽤iso8859-1来进⾏解码。
我们知道全世界的码表都兼容iso8859-1,所以英⽂处理是没有问题的。
但是iso8859-1中并没有中⽂,iso8859-1对于⽆法处理的字节都使⽤?替代,所以我们看到的都是?。
1.8. 如何来处理get请求产⽣的乱码?
答案:
由于客户端发送时使⽤的是utf-8编码⽽服务器⽤iso8859-1解码造成了乱码,虽然字符已经乱掉了,但底层的字节仍然是正确的,我们只要将乱码字符getBytes(“iso8859-1”)转换为字节,就是正确的字节,再将这些字节new String(bytes,“utf-8”)按照正确的码表编码,就可以转换回正确的字符了。从⽽解决了乱码。
1.9. Request⽣命周期
答案:
request对象的⽣命周期是针对⼀个客户端(⼀个浏览器应⽤程序)的⼀次请求,当请求完毕之后,request⾥边的内容也将被释放,⼀个请求开始时创建,请求结束后销毁。
1.10. 如何处理响应乱码?
答案:
通过response.setHeader(“Content-Type”, “text/html;charset=utf-8”)⽅法,通知服务器发送数据时的码表;通过
response.setCharacterEncoding(“utf-8”)⽅法,通知浏览器解析时使⽤的码表。两码相同就不会有乱码了。
response提供了setContentType(“text/html;charset=UTF-8”)快捷⽅法,在它的底层,会同时做上⾯两件事,所以可以⼀⾏代码解决response产⽣的乱码问题。搞笑谜语
1.11. 简述ServletContext⽣命周期?
答案:
ServletContext对象代表当前web应⽤。当服务器启动时,服务器在启动时会依次加载web应⽤,每⼀个web应⽤加载完成后都会创建⼀个ServletContext对象唯⼀代表该web应⽤,这个对象⼀直存活,直到web应⽤移除出容器或服务器关闭时,随着应⽤销
毁,ServletContext对象跟着销毁。
1.1
2. 转发与重定向的⽐较?
答案:
转发是服务器内部资源跳转,重定向是通过302+Location实现浏览器跳转访问。
转发⼀次请求⼀次响应,重定向两次请求两次响应。
转发地址栏不发⽣变化,重定向地址栏会发⽣变化。
转发之前和转发之后request是⼀个,重定向之前和之后不是⼀个request。
1.13. Session⽣命周期?
答案:
当程序第⼀次调⽤到Session()代码时,服务器明确的知道了需要⽤到session了,此时创建session。
如果session超过30分钟(可以在l中配置的)没⼈使⽤,服务器认为这个session超时了,销毁session。
明确的调⽤session.invalidate(),session⽴即销毁。
服务器被⾮正常关闭或web应⽤被移除出容器,此时随着web应⽤的销毁session销毁.如果是正常关闭,session会被钝化.当下次服务器正常启动时,没有超时的session还会被活化回来。
1.14. session的原理?
答案:
session的原理:在服务器第⼀次调⽤Session()⽅法的时候,会在内存中创建⼀个session对象,此对象具有⼀个独⼀⽆⼆的id值,此id值将会以cookie(JSESSIONID)的形式发送给浏览器,浏览器以后每次访问都会带着此cookie,服务器就利⽤此cookie区分浏览器到对应的session空间。
1.15. cookie与session的区别
答案:
cookie数据存放在客户的浏览器上,session数据放在服务器上
空调能效等级cookie不是很安全,别⼈可以分析存放在本地的COOKIE并进⾏COOKIE欺骗,考虑到安全应当使⽤session
session会在⼀定时间内保存在服务器上。当访问增多,会⽐较占⽤你服务器的性能,考虑到减轻服务器性能⽅⾯,应当使⽤COOKIE
1.16. JSP和Servlet是什么关系?
答案:
其实这个问题在上⾯已经阐述过了,Servlet是⼀个特殊的Java程序,它运⾏于服务器的JVM中,能够依靠服务器的⽀持向浏览器提供显⽰内容。JSP本质上是Servlet的⼀种简易形式,JSP会被服务器处理成⼀个类似于Servlet的Java程序,可以简化页⾯内容的⽣成。Servlet和JSP最主要的不同点在于,Servlet的应⽤逻辑是在Java⽂件中,并且完全从表⽰层中的HTML分离开来。⽽JSP的情况是Java和HTML可以组合成⼀个扩展名为.jsp的⽂件。有⼈说,Servlet就是在Java中写HTML,⽽JSP就是在HTML中写Java代码,当然这个说法是很⽚⾯且不够准确的。JSP侧重于视图,Servlet更侧重于控制逻辑。
1.17. JSP的九⼤隐式对象是哪九个
答案:
1:request: 请求对象 在javax.servlet.ServletRequest 作⽤域为Request来⾃客服端的请求,如:FOR
M表单中填写的信息,常⽤的⽅法有getParameter,getParamterName 和getParamterValue通过表⽤获取请求对象中包含的参数值。
2:response表⽰客服端的响应。
3:pageContext对象为页⾯的上下⽂对象,代表当请运⾏页⾯的⼀些属性。
4:session:对象代码服务器与客服端所建⽴的会话,⽐如在写购物,客服轨迹跟踪,
session”是建⽴在cookie的基础之上的。常⽤⽅法有getId,getValues等。
5:application对象负责提供应⽤程序在服务端运⾏时的⼀些全局信息,⽅法有getMimeType等。
6:out:与response不同,通过out对象发送的内容是浏览器需要的显⽰内容,还可以直接想客服端编写⼀个有程序动态⽣成的HTML的⽂件。
7:page:page⾥的变量没法从index.jsp传递到test.jsp。只要页⾯跳转了,就不见了。
8: exception:他是⼀个列外的对象,当页⾯发⽣了列外,就会会创建该对象。
9:config:是在servlet初始化Servlet的时候,JSP引擎向他传递信息⽤的,此消息包括Servlet初始化
时所需要的参数。
1.18. 如何防⽌SQL注⼊攻击呢?
答案:
SQL注⼊:就是通过把SQL命令插⼊到Web表单递交或输⼊域名或页⾯请求的查询字符串,最终达到欺骗服务器执⾏恶意的SQL命令。具体来说,它是利⽤现有应⽤程序,将(恶意)的SQL命令注⼊到后台数据库引擎执⾏的能⼒,它可以通过在Web表单中输⼊(恶意)SQL 语句得到⼀个存在安全漏洞的⽹站上的数据库,⽽不是按照设计者意图去执⾏SQL语句。
防⽌的⽅法:
(1) 永远不要信任⽤户的输⼊,要对⽤户的输⼊进⾏校验,可以通过正则表达式,或限制长度,对单引号和双"-"进⾏转换等。
(2) 永远不要使⽤动态拼装SQL,可以使⽤参数化的SQL或者直接使⽤存储过程进⾏数据查询存取。
(3) 永远不要使⽤管理员权限的数据库连接,为每个应⽤使⽤单独的权限有限的数据库连接。
(4) 不要把机密信息明⽂存放,请加密或者hash掉密码和敏感的信息。
(5) 应⽤的异常信息应该给出尽可能少的提⽰,最好使⽤⾃定义的错误信息对原始错误信息进⾏包装,把异常信息存放在独⽴的表中。
1.19. Mysql数据库优化
答案:
(1)查询时,能不⽤* 就不⽤,尽量写全字段名。
(2)索引不是越多越好,每个表控制在6个索引以内。范围where条件的情况下,索引不起作⽤,⽐如where value<100
(3)⼤部分情况连接效率远⼤于⼦查询,但是有例外。当你对连接查询的效率都感到不能接受的时候可以试试⽤⼦查询,虽然⼤部分情况下你会更失望,但总有碰到惊喜的时候不是么…
(4)多⽤explain 和 profile分析查询语句
(5)有时候可以1条⼤的SQL可以分成⼏个⼩SQL顺序执⾏,分了吧,速度会快很多。
(6)每隔⼀段时间⽤alter table table_name engine=innodb;优化表
(7)连接时注意:⼩表 jion ⼤表的原则
(8)学会⽤explain 和 profile判断是什么原因使你的SQL慢
(9)查看慢查询⽇志,出执⾏时间长的SQL进⾏优化
(10)尽量避免使⽤order by
(11)因为where⼦句后⾯的条件是执⾏顺序是从右到左,所以尽量把能过滤掉⼤部分数据的条件放在最后
1.20. Filter 的作⽤是什么?
答案:
init为初始化⽅法,在Filter对象被创建出来时,Servlet容器会调⽤该⽅法对filter进⾏初始化。
destory为销毁的⽅法,在过滤器对象被销毁之前,服务器会调⽤这个⽅法执⾏善后⼯作。
doFilter为过滤器中最核⼼的⽅法,对访问的请求和响应进⾏拦截,当过滤器拦截到对资源的访问时,服务器会⾃动调⽤该⽅法执⾏过滤代码。 我们只需要在这个⽅法中设计过滤器的逻辑代码即可。
1.21. Filter的⽣命周期?
答案:
当服务器启动,web应⽤加载后,⽴即创建出这个web应⽤中的所有过滤器对象,创建出来后⽴即调⽤过滤器的init⽅法执⾏初始化操作.从此这些过滤器对象驻留在内存中为后续的拦截进⾏服务.每当拦截到资源时,都会导致dofilter⽅法执⾏.最终直到服务器关闭或web应⽤移除出容器时,随着web应⽤的销毁,过滤器对象销毁,销毁之前调⽤destory⽅法执⾏善后⼯作。
1.2
2. 什么是数据库连接池及其⼯作原理
答案:
对于共享资源,有⼀个很著名的设计模式:资源池(resource pool)。该模式正是为了解决资源的频繁分配﹑释放所造成的问题。为解决上述问题,可以采⽤数据库连接池技术。数据库连接池的基本思
想就是为数据库连接建⽴⼀个“缓冲池”。预先在缓冲池中放⼊⼀定数量的连接,当需要建⽴数据库连接时,只需从“缓冲池”中取出⼀个,使⽤完毕之后再放回去。我们可以通过设定连接池最⼤连接数来防⽌系统⽆尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量﹑使⽤情况,为系统开发﹑测试及性能调整提供依据。
1.23. 如何⾃⼰实现⼀个数据库连接池
答案:
思路如下:
1:利⽤class实现DataSource接⼝
2:在class的构造器⼀次性创建指定的链接将链接保存LinkedList中
3:实现getConnection从LinkedList返回⼀个链接
4:提供将链接放回⽅法
Public class MyDataSource inplements DataSource{
Private LinkedList dataSource=new LinkedList<>();
Public MyDataSource(){
For( int a=0;a<1000;a++){
Try{
Connection
Connection(“jdbc:sqlserver://localhost:1443;DatabaseName=liming”,”root”,”liming”
}catch(Exception e){
}
}
Public Connection getConnetion(){
梦见长白头发
Final Connection veFirst();
}
鱼池
Public void releasConnection(Connection conn){
dataSource.add(conn);
}
}
}
1.24. http和https的区别?
答案:
HTTP协议传输的数据都是未加密的,也就是明⽂的,因此使⽤HTTP协议传输隐私信息⾮常不安全,为了保证这些隐私数据能加密传输,于是⽹景公司设计了SSL(Secure Sockets Layer)协议⽤于对HTTP协议传输的数据进⾏加密,从⽽就诞⽣了HTTPS。简单来
说,HTTPS协议是由SSL+HTTP协议构建的可进⾏加密传输、⾝份认证的⽹络协议,要⽐http协议安全。
1.25. Servlet的单例问题
答案:
Servlet是⼀个供其他java程序调⽤的类,它不能独⽴运⾏,针对客户端的多次请求,通常状况下,Servlet只会创建⼀个Servlet实例对象,⼀旦创建它就会驻留在内存中,为后续的请求提供服务,直⾄退出web应⽤为⽌,也就是当我们关闭了浏览器之后我们的Servlet就终⽌了。
当Servlet第⼀次访问的时候,就被加载到内存中,以后该实例对各个请求服务,没次情况会调⽤⼀次service⽅法。
这样会出现什么问题:因为Servlet是单例的,所以会出现线程安全问题
1.26. “” 和 null的区别
答案:
如果说str是null,那么内存根本没创建字符串对像,并由str引⽤。不能调⽤object的⽅法。
如果说str是空串,那么确实存在⼀个由str引⽤的字符串对像,只不过这个字符串的值是""。长度为0;
2杠4星在获取请求参数的时候为什么要这样判断呢?
if(null==str || “”.equals(str)){
return “不合法参数”;
}
如果我们在表单中什么都不填接收到的字符串就是null;
如果我们在表单中填“”,接受到的字符串是“”,但是存⼊数据库后,查询出来的就是null;
1.27. Servlet的多线程同步问题

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。