java面试题(基础、Tomcat、跨域请求)

1、Tomcat中为什么要使用自定义类加载器

一个Tomcat中可以部署多个应用,而每个应用中都存在很多类,并且各个应用中的类是独立的,全类名是可以相同的,比如一个订单系统中可能存在com.zhouyu.User类,一个库存系统中可能也存在com.zhouyu.User类,一个Tomcat,不管内部部署了多少应用,Tomcat启动之后就是一个Java进程,也就是一个JVM,所以如果Tomcat中只存在一个类加载器,比如默认的AppClassLoader,那么就只能加载一个com.zhouyu.User类,这是有问题的,而在Tomcat中,会为部署的每个应用都生成一个类加载器实例,名字叫做WebAppClassLoader,这样Tomcat中每个应用就可以使用自己的类加载器去加载自己的类,从而达到应用之间的类隔离,不出现冲突。另外Tomcat还利用自定义加载器实现了热加载功能。
**

2、Tomcat如何进行优化?对于Tomcat调优,可以从两个方面来进行调整:

内存和线程。
首先启动Tomcat,实际上就是启动了一个JVM,所以可以按JVM调优的方式来进行调整,从而达到Tomcat优化的目的。
另外Tomcat中设计了一些缓存区,比如appReadBufSize、bufferPoolSize等缓存区来提高吞吐量
还可以调整Tomcat的线程,比如调整minSpareThreads参数来改变Tomcat空闲时的线程数,调整maxThreads参数来设置Tomcat处理连接的最大线程数。
并且还可以调整IO模型,比如使用NIO、APR这种相比于B1O更加高效的1O模型。

3、浏览器发出一个请求到收到响应经历了哪些步骤?

1.浏览器解析用户输入的URL,生成一个HTTP格式的请求

2.先根据URL域名从本地hosts文件查找是否有映射IP,如果没有就将域名发送给电脑所配置的DNS进行域名解析,得到IP地址

3.浏览器通过操作系统将请求通过四层网络协议发送出去

4.途中可能会经过各种路由器、交换机,最终到达服务器

5.服务器收到请求后,根据请求所指定的端口,将请求传递给绑定了该端口的应用程序,比如8080被tomcat占用了

  1. tomcat接收到请求数据后,按照http协议的格式进行解析,解析得到所要访问的servlet

7.然后servlet来处理这个请求,如果是SpringMVC中的DispatcherServlet,那么则会找到对应的Controller中的方法,并执行该方法得到结果

  1. Tomcat得到响应结果后封装成HTTP响应的格式,并再次通过网络发送给浏览器所在的服务器

9.浏览器所在的服务器拿到结果后再传递给浏览器,浏览器则负责解析并渲染

24、跨域请求是什么?有什么问题?怎么解决?

跨域是指浏览器在发起网络请求时,会检查该请求所对应的协议、域名、端口和当前网页是否一致,如果不一致则浏览器会进行限制,比如在www.baidu.com的某个网页中,如果使用ajax去访问
www.jd.com是不行的,但是如果是img、iframe、script等标签的src属性去访问则是可以的,之所以浏览器要做这层限制,是为了用户信息安全。
但是如果开发者想要绕过这层限制也是可以的:

  1. response添加header,比如resp.setHeader(“Access-Control-Allow-Origin”,"*”);表示可以访问所有网站,不受是否同源的限制
    2.jsonp的方式,该技术底层就是基于script标签来实现的,因为script标签是可以跨域的
    3.后台自己控制,先访问同域名下的接口,然后在接口中再去使用HTTPClient等工具去调用目标接口
    4.网关,和第三种方式类似,都是交给后台服务来进行跨域访问

Guess you like

Origin blog.csdn.net/weixin_43889487/article/details/121529175