首页 > 其他分享 >两个关于Tomcat利用的好问题

两个关于Tomcat利用的好问题

时间:2022-10-27 13:34:01浏览次数:47  
标签:xml web tomcat Tomcat WEB 利用 文件夹 关于 INF


文章目录

两个好玩的问题

1.为什么往 ​​/WEB-INF/tomcat-web.xml/​​文件夹下写东西可以触发重加载

问题来源

问题的一切来源于一句话:

Trigger a reload of the web app by writing any file to ​​/WEB-INF/tomcat-web.xml/​​ ,文件夹什么鬼!

当然多提一嘴不是每个版本这个tomcat-web.xml都生效的具体看配置,详细的往下看

解决

首先既然能够在tomcat运行后继续加载新的jar到jvm,如果是你会怎么实现呢,答案很显然,多线程,定时让一个子进程去监控文件的变化,tomcat也是如此,具体的就不多说了,也不是本篇的重点,这里只是简单提一嘴

关于本篇要探索的问题,我本来也确实不清楚,但是昨天看到一句话

Trigger a reload of the web app by writing any file to `/WEB-INF/tomcat-web.xml/`

嗯?看到这个我愣了一下,因为在我第一认知里面都是网上说的web.xml,这个加了个前缀tomcat又是什么,并且为什么创建目录也能被识别到内容变化呢(今天一位师傅与我讨论)

首先谈谈我的第一想法,我一开始猜测是扫描到这个​​/WEB-INF/tomcat-web.xml/​​,发现是目录,是不是就去通过遍历目录下的文件内容看是否有变化呢

但是答案是No,我跟了下源码,这里我们节约时间从关键的说起​​org.apache.catalina.startup.HostConfig#checkResources​​,

我们来看看checkResources是干嘛的,会去检查哪些资源这里也很清楚了

两个关于Tomcat利用的好问题_xml

我们这里研究的是​​/WEB-INF/tomcat-web.xml/​​,继续往下看

往下看,关注下

long lastModified = app.reloadResources.get(s).longValue();

光看lastModified我就大概猜到了是靠什么机制了,没错时间戳!当前文件夹下的文件变动了自然也会影响文件夹的时间戳变化,不过都来了当然还是进去看看嘛

两个关于Tomcat利用的好问题_tomcat_02

确实如此,后面通过reload也就重新将​​/WEB-INF/lib​​下的jar加载进去了,昨天提过这里不再多讲

好了到了这里又是一个问题,刚才我们的资源路径是怎么取得的?

​app.reloadResources​​​这值是怎么来的呢,其实是在tomca首次运行时就设置了,在​​org.apache.catalina.core.StandardContext#addWatchedResource​​​中便引入了,那值是哪来的,在​​项目路径/conf/context.xml​

<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
<WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
</Context>

哦一切也就解决了,通过配置WatchedResource来监视,这也是默认名称

2.Tomcat下/META-INF/lib中被加载的jar,如果在其/META-INF/resources/下直接写jsp可以直接访问执行

问题来源

两个关于Tomcat利用的好问题_jar_03

很骚的东西,第一次看到,马上吃饭了,简单看了下

首先大概说一下浏览器敲下​​htttp://xxx/xx.jsp时候​​,它会检查jsp文件是否存在来避免创建垃圾文件夹和文件,也就是在

​org.apache.jasper.servlet.JspServlet#serviceJspFile​​下的

if (null == context.getResource(jspUri)) {

往里一直跟,最终一个关键的点在​​org.apache.catalina.webresources.CachedResource#validateResource​​下

两个关于Tomcat利用的好问题_tomcat_04

这个JarResource里面有映射关系,我们简简单单看看webResource咋来的

两个关于Tomcat利用的好问题_jar_05

这里只是初始化其他地方也没有

后面找了下在​​org.apache.jasper.servlet.JspCServletContext#scanForResourceJARs​​找到了答案

两个关于Tomcat利用的好问题_tomcat_06

拿下!!!

两个关于Tomcat利用的好问题_java_07


标签:xml,web,tomcat,Tomcat,WEB,利用,文件夹,关于,INF
From: https://blog.51cto.com/u_15847702/5800901

相关文章

  • nginxkeepalived和tomcat整合
    最前面两台NGINX+keepalived可不可以同时承担WEB的高可用负载均衡和图片服务器并实现高可用?完全可以实现的nginx可以设置多个server,相互之间互不影响,用keepalived做负载的应......
  • 整理一些关于树的力扣热门算法操作
    一、LC94、144、145中序,前序,后续遍历List<Integer>front=newArrayList<>();List<Integer>mid=newArrayList<>();List<Integer>back=newArrayList<>();......
  • 关于PO、BO、VO、DTO、DAO、POJO等概念的理解
    PO(PersistantObject)持久对象PO是持久化对象,用于表示数据库中的一条记录映射成的Java对象,类中应该都是基本数据类型和String,而不是更复杂的类型,因为要和数据库表字段对应......
  • CCCC L3-032 关于深度优先搜索和逆序对的题应该不会很难吧这件事 【树状数组】
    https://pintia.cn/problem-sets/994805046380707840/exam/problems/1518582895035215872题意给你一棵树,给定树根,要求树的所有结点编号的dfs序中逆序对的数量总和,对结果......
  • 关于for-in和for-of的区别
    1.循环数组区别一:forin和forof都可以循环数组,forin输出的是数组的index下标,而forof输出的是数组的每一项的值。constarr=['a','b','c','d']//for........
  • 利用anaconda搞定所有Python问题,各种安装包
    ?1、你要下载一个anaconda.的启动安装包,(个人感觉版本不是问题):??https://www.continuum.io/downloads#windows?2、下载好的anaconda.如下图,简单粗暴:......
  • 关于常量与字符串常量存储方式的一点看法
    首先,毫无疑问,即使是常量(字符串常量)也是要占据空间的。 一般来说,基本类型(整型、字符型等)常量会在编译阶段被编译成立即数,占的是代码段的内存。(代码段是只读的,而且不允程......
  • 利用pair容器计数
    900. RLEIteratorMedium14158FavoriteShareWriteaniteratorthatiteratesthrougharun-lengthencodedsequence.Theiteratorisinitializedby ​​RLEIterator(......
  • 利用栈求递增子字符串长度
    901. OnlineStockSpanMedium24552FavoriteShareWriteaclass ​​StockSpanner​​ whichcollectsdailypricequotesforsomestock,andreturnsthe span of......
  • 利用map对数组中的元素及其下标进行存储
    题目描述小摩有一个N个数的数组,他想将数组从小到大排好序,但是萌萌的小摩只会下面这个操作:任取数组中的一个数然后将它放置在数组的最后一个位置。问最少操作多少次可以使得......