Java Web面试题是Java面试经常问到的内容,下面重点详解常见的Java Web面试题及答案。
什么是 MVC 模型?
可以用如下的图形来表示MVC模式三者之间的关系:
1.模型(Model)
模型封装了数据及对数据的操作,可以直接对数据库进行访问,不依赖视图和控制器,也就是说模型并不关注数据如何展示,只负责提供数据。GUI 程序模型中数据的变化一般会通过观察者模式通知视图,而在 web 中则不会这样。
2.视图(View)
视图从模型中拉取数据,只负责展示,没有具体的程序逻辑。
3.控制器(Controller)
控制器用于控制程序的流程,将模型中的数据展示到视图中。
JSP和Servlet是什么关系?
JSP全称Java Server Pages,一种Java Servlet,主要用于实现Java web应用程序的用户界面部分。
JSP工作原理
具体如下图所示:
JSP的工作流程,大致分为如下4步:
1)当用户访问一个JSP页面时,首先会向Servlet容器,比如:向Tomcat发出请求;
2)如果是第一次请求页面,则Servlet容器首先要把JSP页面,比如:test.jsp转化为Servlet代码,比如:test.java,再将其转化为test.class文件。
3)然后,JSP容器负责调用从JSP转换来的Servlet,这些Servlet负责提供服务相应用户请求。
比如:客户端发送表单,要求servlet:具体的表单.java来处理,则容器会建立一个线程,调用具体的表单.java来处理该请求。
如果用户有多个请求,则容器会建立多个线程处理多个请求。
4)容器执行字节码文件(具体的表单.java字节码),并将其结果返回到客户端,一般返回的方式html格式文件。
Servlet的生命周期
Servlet的生命周期,如下图所示:
包含:
- 初始化init
- 请求;
- 响应;
- 终止;
这4个过程。
Session与Cookie的区别?
Session与Cookie的区别,主要体现在如下3点:
1.存储位置区别
Session存储数据在服务器端,Cookie存储在客户端。
2.数据大小区别
Session没有数据大小限制,Cookie有限制。
3.数据安全区别
Session数据安全,Cookie相对于不安全,因为存储在客户端。
Http长连接和短连接区别?
在HTTP/1.0中默认使用短连接,即客户端和服务器每进行一次HTTP操作,就建立一次连接。
而从HTTP/1.1起,默认使用长连接,用以保持连接特性。
如下所示:
Connection:keep-alive
从HTTP/1.1起,默认使用长连接,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。
Struts的工作原理?
谈到Struts就不得不提到MVC设计模式,MVC即Model-View-Controller的缩写,它是web应用当中的常用的设计模式。
具体如下图所示:
MVC 减弱了业务逻辑接口和数据接口之间的耦合,以及让视图层更富于变化,Struts是MVC的一种实现。
1)控制(Controller)
在Struts中ActionServlet起着一个控制器(Controller)的作用,这个控制组件提供了处理所有发送到Struts的HTTP请求的入口点,它截取和分发这些请求到相应的动作类,这些动作类都是Action类的子类。
另外控制组件也负责用相应的请求参数填充 Action Form,通常称之为FromBean,并传给动作类:通常称之为ActionBean。
动作类实现核心商业逻辑,所有这些控制逻辑利用Struts-config.xml文件来配置。
2)视图(JSP)
主要是由Jsp来控制页面输出的。它接收到Action Form中的数据,利用html,taglib,bean,logic等显示数据。
3)模型(JavaBean)
在Struts中,主要存在三种bean,分别是:Action,ActionForm,EJB或者Java Bean。ActionForm用来封装客户请求信息,Action取得ActionForm中的数据,再由EJB或者Java Bean进行处理。
SpringMVC执行流程是什么?
(1)用户发送请求发送给前端控制器
(2)前端控制器收到请求调用处理器映射器
(3)处理器映射器找到具体得处理器,生成处理器对象以及处理器拦截器并返回给前端控制器
(4)前端控制器调用处理器适配器
(5)处理器适配器经过适配调用具体得处理器
(6)处理器执行完成并返回结果给前端控制器
(7)前端控制器接受到结果,并讲结果传给视图解析器
(8)视图解析器解析后返回具体得view
(9)前端根据view进行渲染视图,并且响应用户
什么是XSS攻击?如何避免?
跨站脚本(cross site script)简称为XSS,XSS是指恶意攻击者利用网站,没有对用户提交数据进行转义处理或者过滤不足的缺点,进而添加一些代码,嵌入到web页面中去,使别的用户访问都会执行相应的嵌入代码。
XSS的根源主要是没完全过滤客户端提交的数据 ,所以重点是要过滤用户提交的信息。
常见的解决方案,如下:
- 只允许用户输入我们期望的数据。 例如:age用户年龄只允许用户输入数字,而数字之外的字符都过滤掉;
- 对数据进行Html Encode 处理: 用户将数据提交上来的时候进行HTML编码,将相应的符号转换为实体名称再进行下一步的处理;
- 过滤或移除特殊的Html标签, 例如: <script>, <iframe> , < for <, > for >, " for
- 过滤js事件的标签。例如 “onclick=”, “onfocus” 等等;
CSRF攻击?如何避免?
CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF。
XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站,与XSS攻击相比,CSRF更具危险性。
防止CSRF的解决方案,包含如下:
- 重要数据交互采用POST进行接收,当然是用POST也不是万能的,伪造一个form表单即可破解;
- 使用验证码,只要是涉及到数据交互就先进行验证码验证,这个方法可以完全解决CSRF;
- 验证HTTP Referer字段,该字段记录了此次HTTP请求的来源地址,最常见的应用是图片防盗链;
- 为每个表单添加令牌token并验证;
以上就是常见的Java Web面试题及答案,更多的Java面试题及答案,请查看:1000+Java面试题及答案详解。
作者简介
陈睿|mikechen,10年+大厂架构经验,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
👇阅读mikechen更多原创技术文章👇
阿里架构 |双11秒杀 |微服务 |云原生 |Docker |K8S |Kafka |分布式架构 |高并发架构
关注作者「mikechen」公众号,获取更多技术干货!
![](https://static.mikechen.cc/wp-content/uploads/2023/04/mikechen-gzh.png)
后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》,后台回复【面试】即可获取《史上最全阿里Java面试题总结》