【Java⾯试题总结4】JavaWeb、⽹络、设计模式综合篇(附答
案)
英雄联盟空白符号Java Web篇
⼀、jsp 和 servlet 有什么区别?
spring boot毕设视频网站
1、servlet是服务器端的Java程序,它担当客户端和服务端的中间层。
2、jsp全名为Java server pages,中⽂名叫Java服务器页⾯,其本质是⼀个简化的servlet设计。JSP是⼀种动态页⾯设计,它的主要⽬的是将表⽰逻辑从servlet中分离出来。
3、JVM只能识别Java代码,不能识别JSP,JSP编译后变成了servlet,web容器将JSP的代码编译成JVM能够识别的Java类(servlet)。
4、JSP有内置对象、servlet没有内置对象。
⼆、jsp 有哪些内置对象?作⽤分别是什么?
JSP九⼤内置对象:
1. pageContext,页⾯上下⽂对象,相当于页⾯中所有功能的集合,通过它可以获取JSP页⾯的out、request、response、session、
application对象。
2. request
3. response
4. session
5. application,应⽤程序对象,application实现了⽤户间数据的共享,可存放全局变量,它开始于服务器启动,知道服务器关闭。
6. page,就是JSP本⾝。
7. exception
8. out,out⽤于在web浏览器内输出信息,并且管理应⽤服务器上的输出缓冲区,作⽤域page。
9. config,取得服务器的配置信息。
三、forward 和 redirect 的区别?
1. forward是直接请求转发;redirect是间接请求转发,⼜叫重定向。
2. forward,客户端和浏览器执⾏⼀次请求;redirect,客户端和浏览器执⾏两次请求。
3. forward,经典的MVC模式就是forward;redirect,⽤于避免⽤户的⾮正常访问。(例如⽤户⾮正常访问,servlet就可以将HTTP请求
重定向到登录页⾯)。pickle有什么隐喻
4. forward,地址不变;redirect,地址改变。
5. forward常⽤⽅法:RequestDispatcher类的forward()⽅法;redirect常⽤⽅法:HttpServletRequest类的sendRedirect()⽅法。
四、说⼀下 jsp 的 4 种作⽤域?
application、session、request、page
五、session 和 cookie 有什么区别?
1、存储位置不同
cookie在客户端浏览器;
session在服务器;
2、存储容量不同
cookie<=4K,⼀个站点最多保留20个cookie;
session没有上线,出于对服务器的保护,session内不可存过多东西,并且要设置session删除机制;
3、存储⽅式不同
cookie只能保存ASCII字符串,并需要通过编码⽅式存储为Unicode字符或者⼆进制数据;
session中能存储任何类型的数据,包括并不局限于String、integer、list、map等;
4、隐私策略不同
cookie对客户端是可见的,不安全;
session存储在服务器上,安全;
5、有效期不同
jframe设置窗口大小开发可以通过设置cookie的属性,达到使cookie长期有效的效果;
session依赖于名为JESSIONID的cookie,⽽cookie JSESSIONID的过期时间默认为-1,只需关闭窗⼝该session就会失效,因⽽session达不到长期有效的效果;
6、跨域⽀持上不同
cookie⽀持跨域;
session不⽀持跨域;
六、如果客户端禁⽌ cookie 能实现 session 还能⽤吗?
⼀般默认情况下,在会话中,服务器存储 session 的 sessionid 是通过 cookie 存到浏览器⾥。
如果浏览器禁⽤了 cookie,浏览器请求服务器⽆法携带 sessionid,服务器⽆法识别请求中的⽤户⾝份,session失效。
但是可以通过其他⽅法在禁⽤ cookie 的情况下,可以继续使⽤session。
1. 通过url重写,把 sessionid 作为参数追加的原 url 中,后续的浏览器与服务器交互中携带 sessionid 参数。
2. 服务器的返回数据中包含 sessionid,浏览器发送请求时,携带 sessionid 参数。
3. 通过 Http 协议其他 header 字段,服务器每次返回时设置该 header 字段信息,浏览器中 js 读取该 header 字段,请求服务器时,js设
置携带该 header 字段。
七、什么是上下⽂切换?
多线程编程中⼀般线程的个数都⼤于 CPU 核⼼的个数,⽽⼀个 CPU 核⼼在任意时刻只能被⼀个线程使⽤,为了让这些线程都能得到有效执⾏,CPU 采取的策略是为每个线程分配时间⽚并轮转的形式。当⼀个线程的时间⽚⽤完的时候就会重新处于就绪状态让给其他线程使⽤,这个过程就属于⼀次上下⽂切换。
概括来说就是:当前任务在执⾏完 CPU 时间⽚切换到另⼀个任务之前会先保存⾃⼰的状态,以便下次
再切换回这个任务时,可以再加载这个任务的状态。任务从保存到再加载的过程就是⼀次上下⽂切换。
上下⽂切换通常是计算密集型的。也就是说,它需要相当可观的处理器时间,在每秒⼏⼗上百次的切换中,每次切换都需要纳秒量级的时间。所以,上下⽂切换对系统来说意味着消耗⼤量的 CPU 时间,事实上,可能是操作系统中时间消耗最⼤的操作。
Linux 相⽐与其他操作系统(包括其他类 Unix 系统)有很多的优点,其中有⼀项就是,其上下⽂切换和模式切换的时间消耗⾮常少。
⼋、cookie、session、token
1、session机制
session是服务端存储的⼀个对象,主要⽤来存储所有访问过该服务端的客户端的⽤户信息(也可以存储其他信息),从⽽实现保持⽤户会话状态。但是服务器重启时,内存会被销毁,存储的⽤户信息也就消失了。
不同的⽤户访问服务端的时候会在session对象中存储键值对,“键”⽤来存储开启这个⽤户信息的“钥匙”,在登录成功后,“钥匙”通过cookie返回给客户端,客户端存储为sessionId记录在cookie中。当客
户端再次访问时,会默认携带cookie中的sessionId来实现会话机制。
(1)session是基于cookie的。
python3是什么意思cookie的数据4k左右;
cookie存储数据的格式:字符串key=value
cookie存储有效期:可以⾃⾏通过expires进⾏具体的⽇期设置,如果没设置,默认是关闭浏览器时失效。
cookie有效范围:当前域名下有效。所以session这种会话存储⽅式⽅式只适⽤于客户端代码和服务端代码运⾏在同⼀台服务器上(前后端项⽬协议、域名、端⼝号都⼀致,即在⼀个项⽬下)
(2)session持久化
⽤于解决重启服务器后session消失的问题。在数据库中存储session,⽽不是存储在内存中。通过包:express-mysql-session。
当客户端存储的cookie失效后,服务端的session不会⽴即销毁,会有⼀个延时,服务端会定期清理⽆效session,不会造成⽆效数据占⽤存储空间的问题。
2、token机制
适⽤于前后端分离的项⽬(前后端代码运⾏在不同的服务器下)
请求登录时,token和sessionid原理相同,是对key和key对应的⽤户信息进⾏加密后的加密字符,登录成功后,会在响应主体中将{token:“字符串”}返回给客户端。
客户端通过cookie都可以进⾏存储。再次请求时不会默认携带,需要在请求位置给请求头中添加认证字段Authorization携带token信息,服务器就可以通过token信息查⽤户登录状态。
九、说⼀下 session 的⼯作原理?
当客户端登录完成后,会在服务端产⽣⼀个session,此时服务端会将sessionid返回给客户端浏览器。客户端将sessionid储存在浏览器的cookie中,当⽤户再次登录时,会获得对应的sessionid,然后将sessionid发送到服务端请求登录,服务端在内存中到对应的sessionid,完成登录,如果不到,返回登录页⾯。
⽹络篇
⼀、http 响应码 301 和 302 代表的是什么?有什么区别?
1. 301和302状态码都表⽰重定向,当浏览器拿到服务器返回的这个状态码后悔⾃动跳转到⼀个新的URL地址。
2. 301代表永久性重定向,旧地址被永久移除,客户端向新地址发送请求。
3. 302代表暂时性重定向,旧地址还在,客户端继续向旧地址发送请求。
4. 303代表暂时性重定向,重定向到新地址时,必须使⽤GET⽅法请求新地址。
5. 307代表暂时性重定向,与302的区别在于307不允许从POST改为GET。
6. 307代表永久性重定向,与301的区别在于308不允许从POST改为GET。
⼆、简述 tcp 和 udp的区别?
1. TCP是传输控制协议,UDP是⽤户数据表协议;
2. TCP长连接,UDP⽆连接;
3. UDP程序结构较简单,只需发送,⽆须接收;
4. TCP可靠,保证数据正确性、顺序性;UDP不可靠,可能丢数据;
5. TCP适⽤于少量数据,UDP适⽤于⼤量数据传输;
6. TCP速度慢,UDP速度快;
三、tcp 为什么要三次握⼿,两次不⾏吗?为什么?
因为客户端和服务端都要确认连接,①客户端请求连接服务端;②针对客户端的请求确认应答,并请求建⽴连接;③针对服务端的请求确认应答,建⽴连接;
两次⽆法确保A能收到B的数据;
四、OSI 的七层模型都有哪些?
五、get 和 post 请求有哪些区别?
1. get请求参数是连接在url后⾯的,⽽post请求参数是存放在requestbody内的;
2. get请求因为浏览器对url长度有限制,所以参数个数有限制,⽽post请求参数个数没有限制;
3. 因为get请求参数暴露在url上,所以安全⽅⾯post⽐get更加安全;
4. get请求只能进⾏url编码,⽽post请求可以⽀持多种编码⽅式;
5. get请求参数会保存在浏览器历史记录内,post请求并不会;
6. get请求浏览器会主动cache,post并不会,除⾮主动设置;
7. get请求产⽣1个tcp数据包,post请求产⽣2个tcp数据包;
8. 在浏览器进⾏回退操作时,get请求是⽆害的,⽽post请求则会重新请求⼀次;
9. 浏览器在发送get请求时会将header和data⼀起发送给服务器,服务器返回200状态码,⽽在发送post请求时,会先将header发送给服务器,
服务器返回100,之后再将data发送给服务器,服务器返回200 OK;
六、什么是 XSS 攻击,如何避免?
xss(Cross Site Scripting),即跨站脚本攻击,是⼀种常见于web应⽤程序中的计算机安全漏洞。指的是在⽤户浏览器上,在渲染DOM树的时候,执⾏了不可预期的JS脚本,从⽽发⽣了安全问题。
XSS就是通过在⽤户端注⼊恶意的可运⾏脚本,若服务端对⽤户的输⼊不进⾏处理,直接将⽤户的输⼊输出到浏览器,然后浏览器将会执⾏⽤户注⼊的脚本。所以XSS攻击的核⼼就是浏览器渲染DOM的时候将⽂本信息解析成JS脚本从⽽引发JS脚本注⼊,那么XSS攻击的防御⼿段就是基于浏览器渲染这⼀步去做防御。只要我们使⽤HTML编码将浏览器需要渲染的信息编码后,浏览器在渲染DOM元素的时候,会⾃动解码需要渲染的信息,将上述信息解析成字符串⽽不是JS脚本,这就是我们防御XSS攻击的核⼼想法。
预防:
1、获取⽤户的输⼊,不⽤innerHtml,⽤innerText.
2、对⽤户的输⼊进⾏过滤,如对& < > " ' /等进⾏转义;
七、什么是 CSRF 攻击,如何避免?
跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF,是⼀种挟制⽤户在当前已登录的Web应⽤程序上执⾏⾮本意的操作的攻击⽅法。跟跨⽹站脚本(XSS)相⽐,XSS 利⽤的是⽤户对指定⽹站的信任,CSRF 利⽤的是⽹站对⽤户⽹页浏览器的信任。
1、攻击细节
跨站请求攻击,简单地说,是攻击者通过⼀些技术⼿段欺骗⽤户的浏览器去访问⼀个⾃⼰曾经认证过的⽹站并运⾏⼀些操作(如发邮件,发消息,甚⾄财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的⽹站会认为是真正的⽤户操作⽽去运⾏。这利⽤了web中⽤户⾝份验证的⼀个漏洞:简单的⾝份验证只能保证请求发⾃某个⽤户的浏览器,却不能保证请求本⾝是⽤户⾃愿发出的。
例⼦
那么,⼀个恶意攻击者可以在另⼀个⽹站上放置如下代码: <img src="amplebank/withdraw?
account=Alice&amount=1000&for=Badman">
如果有账户名为Alice的⽤户访问了恶意站点,⽽她之前刚访问过银⾏不久,登录信息尚未过期,那么她就会损失1000资⾦。
这种恶意的⽹址可以有很多种形式,藏⾝于⽹页中的许多地⽅。此外,攻击者也不需要控制放置恶意⽹址的⽹站。例如他可以将这种地址藏在论坛,博客等任何⽤户⽣成信息的⽹站中。这意味着如果服务端没有合适的防御措施的话,⽤户即使访问熟悉的可信⽹站也有受攻击的危险。
java常见笔试题透过例⼦能够看出,攻击者并不能通过CSRF攻击来直接获取⽤户的账户控制权,也不能直接窃取⽤户的任何信息。他们能做到的,是欺骗⽤户浏览器,让其以⽤户的名义运⾏操作。
2、防御措施
检查Referer字段
HTTP头中有⼀个Referer字段,这个字段⽤以标明请求来源于哪个地址。在处理敏感数据请求时,通
常来说,Referer字段应和请求的地址位于同⼀域名下。以上⽂银⾏操作为例,Referer字段地址通常应该是转账按钮所在的⽹页地址,应该也位于amplebank之下。⽽如果是CSRF攻击传来的请求,Referer字段会是包含恶意⽹址的地址,不会位于amplebank之下,这时候服务器就能识别出恶意的访问。
这种办法简单易⾏,⼯作量低,仅需要在关键访问处增加⼀步校验。但这种办法也有其局限性,因其完全依赖浏览器发送正确的Referer字段。虽然http协议对此字段的内容有明确的规定,但并⽆法保证来访的浏览器的具体实现,亦⽆法保证浏览器没有安全漏洞影响到此字段。并且也存在攻击者攻击某些浏览器,篡改其Referer字段的可能。
3、添加校验token
由于CSRF的本质在于攻击者欺骗⽤户去访问⾃⼰设置的地址,所以如果要求在访问敏感数据请求时,要求⽤户浏览器提供不保存在cookie 中,并且攻击者⽆法伪造的数据作为校验,那么攻击者就⽆法再运⾏CSRF攻击。这种数据通常是窗体中的⼀个数据项。服务器将其⽣成并
附加在窗体中,其内容是⼀个伪随机数。当客户端通过窗体提交请求时,这个伪随机数也⼀并提交上去以供校验。正常的访问时,客户端浏览器能够正确得到并传回这个伪随机数,⽽通过CSRF传来的欺骗性攻击中,攻击者⽆从事先得知这个伪随机数的值,服务端就会因为校验token的值为空或者错误,
拒绝这个可疑请求。
⼋、如何实现跨域?说⼀下 JSONP 实现原理?
1、
2、最流⾏的跨域⽅案cors
cors是⽬前主流的跨域解决⽅案,跨域资源共享(CORS) 是⼀种机制,它使⽤额外的 HTTP 头来告诉浏览器让运⾏在⼀个 origin (domain)上的Web应⽤被准许访问来⾃不同源服务器上的指定的资源。当⼀个资源从与该资源本⾝所在的服务器不同的域、协议或端⼝请求⼀个资源时,资源会发起⼀个跨域 HTTP 请求。
3、最⽅便的跨域⽅案Nginx
nginx是⼀款极其强⼤的web服务器,其优点就是轻量级、启动快、⾼并发。
现在的新项⽬中nginx⼏乎是⾸选,我们⽤node或者java开发的服务通常都需要经过nginx的反向代理。
反向代理的原理很简单,即所有客户端的请求都必须先经过nginx的处理,nginx作为代理服务器再讲请求转发给node或者java服务,这样就规避了同源策略。
九、websocket应⽤的是哪个协议
WebSocket是⼀个允许Web应⽤程序(通常指浏览器)与服务器进⾏双向通信的协议。HTML5的WebSocket API主要是为浏览器端提供了⼀个基于TCP协议实现全双⼯通信的⽅法。
WebSocket优势:浏览器和服务器只需要要做⼀个握⼿的动作,在建⽴连接之后,双⽅可以在任意时刻,相互推送信息。同时,服务器与客户端之间交换的头信息很⼩。
⼗、说⼀下 tcp 粘包是怎么产⽣的?
1. 发送⽅需要等缓冲区满才能发送出去,造成粘包;
2. 接收⽅不及时接收缓冲区的包,造成粘包;
设计模式篇
⼀、请列举出在 JDK 中⼏个常⽤的设计模式?
1、单例模式
作⽤:保证类只有⼀个实例。
JDK中体现:Runtime类。
2、静态⼯⼚模式
作⽤:代替构造函数创建对象,⽅法名⽐构造函数清晰。
JDK中体现:Integer.valueOf、Class.forName
3、抽象⼯⼚
作⽤:创建某⼀种类的对象。
JDK中体现:Java.sql包。
4、原型模式
clone();
原型模式的本质是拷贝原型来创建新的对象,拷贝是⽐new更快的创建对象的⽅法,当需要⼤批量创建新对象⽽且都是同⼀个类的对象的时候考虑使⽤原型模式。
⼀般的克隆只是浅拷贝(对象的hash值不⼀样,但是对象⾥⾯的成员变量的hash值是⼀样的)。
有些场景需要深拷贝,这时我们就要重写clone⽅法,以ArrayList为例:

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