Tomcat 的 work 目录缓存导致的JSP页面图片更新问题

这篇具有很好参考价值的文章主要介绍了Tomcat 的 work 目录缓存导致的JSP页面图片更新问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、问题分析

1. 修改后重新部署没有变化

    笔者之前部署了一个后台管理项目,通过它来发布课程内容,其中有一个 JSP 课程页面,在该 JSP 页面里也引用了类文件 Constant.java 里的一个变量(ALIYUN_OSS_PATH),该变量的值是一个域名地址(static.aaa.com),在该 JSP 页面基于这个地址来加载和显示图片(static.aaa.com/x.png)。

# 在 jsp 页面获取 java 类的变量值
<c:set var="aliyun" value="<%=com.xxx.admin.common.Constants.ALIYUN_OSS_PATH%>"/>

    现在因为项目需要,在 Constant.java 文件里更改了这个该变量的值:

//修改前
//public static final String ALIYUN_OSS_PATH = "http://static.aaa.com/";
//修改后
public static final String ALIYUN_OSS_PATH = "http://static.bbb.com/";

    然后重新部署,但是却发现所有的图片都打不开了。但是在浏览器展示的页面上拷贝图片地址,发现与和之前的图片地址没有任何变化:static.aaa.com/x.png, 本来希望出现的变化是:static.bbb.com/x.png

    总之一句话,就是项目修改并重新部署后 JSP 页面的图片路径没有更新。

2. 图片无法正常显示分析

原先浏览器入口路径是 admin.aaa.com, 图片请求地址是:static.aaa.com/x.png ;

现在浏览器入口路径是 admin.bbb.com, 图片请求地址仍然是:static.aaa.com/x.png, 并没有变成我希望的修改后的 static.bbb.com.

    这里图片为什么之前能打开?现在重新部署后,路径没有变化为什么反而打不开呢?这个与部署后,进入网站后台入口地址发生了变化有关系:

    浏览器是通过 admin.aaa.com 进入后台管理,发起请求时,http 头的 referer url 路径就是入口路径:admin.aaa.com,这与 OSS 服务端设置的 referrer url 白名单一致,所以能正常打开图片。现在更新部署后,请求的图片路径没有变化,仍然是 static.aaa.com/x.png,但是管理后台的入口地址变更为: admin.bbb.com , 所以 header 头里带的 referer url 路径就变成 admin.bbb.com. 这个与 OSS 服务端设置的 refer url 白名单不一致,所以导致图片无法正常请求。

    通过 referer url 实现“访问控制”,其原理可以可以参考: <HTML页面跨域请求图片资源报错>

二、问题排查   

    一开始是怀疑浏览器的缓存导致,重新清理了浏览器的缓存重启浏览器,再次打开后台页面,仍然没有任何改变。

    问题进一步排除,继续去查看项目部署后台的文件,发现有更新的 java源文件,在编译后的 class 文件确实已经更新完毕。为什么 jsp 页面图片就是无法正常打开了。

    排除了以上问题后,开始怀疑在【服务端的Tomcat是否有类似浏览器一样的缓存】,经过查询后,定位到了 Tomcat 下的 WORK 目录。原来所有的 JSP 页面都会编译成 _jsp.java  和 _jsp.class 文件,存储在这个目录下,如果 jsp 发生了改变,tomcat 会重新编译,在前端请求时候将重新编译后的 _jsp.class 文件载入内存:

Tomcat 的 work 目录缓存导致的JSP页面图片更新问题,Tomcat,tomcat,java,servlet

    现在问题明白了。因为我的 JSP 文件引用 java 类文件了的 oss 路径变量:

<c:set var="aliyun" value="<%=com.xxx.admin.common.Constants.ALIYUN_OSS_PATH%>"/>

    虽然我修了 java 源代文件里的 ALIYUN_OSS_PATH 变量的值后重新部署,但是 work 目录下的 JSP 文件本身没有进行任何修改,所以在重新部署后,JSP 不会重新编译,在发起请求时,tomcat 仍然调用的是之前缓存的 _jsp.class 文件,该文件里面 ALIYUN_OSS_PATH 值并没更新。所以图片加载地址就没有变化,仍然是之前的:static.aaa.com/x.png, 而不是更新后的 static.bbb.com/x.png

三、问题解决

方式1:

    清理 Tomcat 缓存,我们可以通过执行下面的命令:

rm -rf /path/to/tomcat/work/*

方式2:

    用 RD 命令删除整个目录,只需打开 tomcat/bin/startup.bat 文件,在开头加入:

rd/s/q "/Tomcat path/work/Catalina"

    这样每次启动Tomcat的时候就会先删除页面缓存了,不用担心页面修改后没被重新编译。

四、总结

    如果 JSP 的引用了 java 源代码里的变量。如果该变量的值发生了变化,在重新部署后,记得将Tomcat 下 work 目录里对应的 JSP 文件的缓存进行清理。文章来源地址https://www.toymoban.com/news/detail-781910.html

到了这里,关于Tomcat 的 work 目录缓存导致的JSP页面图片更新问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • IDEA中运行JSP文件,启动Tomcat运行网页显示404,对编译代码右键运行又可以显示正常页面的解决办法

    这个问题困扰了我许久,一直以为是自己的Tomcat配置出现了问题,但实际上我Tomcat并没有出现问题,在网上看了很多大佬关于这方面问题的博客问题也没有得到解决,直到我对比了两次运行的网页url才发现了自己的问题所在。 这里选择Edit Configurations...进去 切换到Deployment,并

    2024年02月08日
    浏览(39)
  • 云原生 - 微信小程序 COS 对象存储图片缓存强制更新解决方案

    遇到一个这样的情况:在微信小程序里图片缓存十分麻烦,网上很多说在腾讯云里的 COS 存储对象服务里设置对应的图片缓存(Header 头 Cache-Contorl),说实话真不好用,一会儿生效,一会儿没生效,而且量又大。于是,今天给大家分享一个简单粗暴的解决方案~ 以腾讯云为例,

    2024年01月23日
    浏览(31)
  • el-upload实现可替换、删除、预览的图片上传。js 往返缓存(可判断当前页面是不是返回的页面)

    组件使用: UploadImage.vue 组件: BFCache是一种浏览器优化,可实现即时前进和后退载入页面。它改善了用户的浏览体验,尤其是那些网络或设备速度较慢的用户。 *我们可以通过这个方法判断当前页面是不是返回的页面* 在APP站内嵌套h5页面,判断进入拨号页返回情况: 我们需要通

    2024年01月25日
    浏览(36)
  • uniapp - [ H5 网页 / App ] 高性能 tabbar 底部菜单凸起效果,原生系统自定义底部菜单不卡顿、切换页面不闪烁、自动缓存页面(底部菜单中间自定义一个图片并悬浮起来)

    网上有很多自定义 tabbar 底部菜单的教程,但终归是组件形式,避免不了切换页面卡顿、闪屏闪烁、各平台不兼容等一系列问题。 本文 基于 uniapp 系统原生 tabbar 底部菜单,植入一个向上凸起的 “图片” 菜单,并支持点击触发事件, 您可以直接复制代码,换个中间凸起的菜

    2024年02月21日
    浏览(40)
  • idea 配置tomcat 运行jsp项目

    点击ok后,出现界面,把这里的 Application context 中的 version2_0_war_exploded 删除,只剩下 / ,这样浏览器地址就不会是 http://localhost:8080/version2_0_war_exploded/ ,而是 http://localhost:8080/

    2024年01月24日
    浏览(42)
  • 【web安全】IDEA+Tomcat+JSP

    天命:我发现用 php + apache + mysql 搭建靶场有很多教程,但是用 tomcat + jsp 就很少,百度都甚至查不到,我还写一篇给大家研究一下吧,IDEA的不同是可能有点小出入。  开发环境:windows11 + IDEA2021 + JDK1.8 先打开IDEA2021,新建项目,选择maven,选择 JDK1.8 重点:选择使用模板,选择

    2024年02月21日
    浏览(27)
  • 快讯 | 微软开源 Deep Speed Chat;商汤回应自研大模型图片生产质疑;谷歌 Bard 聊天机器人实验更新页面上线

    一分钟速览新闻点 商汤回应自研大模型图片生产质疑 昆仑万维与阿里云达成战略合作,将新建智算中心支撑大模型创新 中科院自动化研究所针对康复机器人提出新的驾驶空间概念 百度Apollo将在上海车展发布智能汽车开放方案 谷歌 Bard 聊天机器人实验更新页面上线,数学和

    2024年02月11日
    浏览(37)
  • JavaWeb+jsp+Tomcat的教务查询系统

    点击以下链接获取源码: https://download.csdn.net/download/qq_64505944/88134601?spm=1001.2014.3001.5503 jsp/tomcat7.05/MySQL5.7或8版本/ssm框架/spring/ Web框架:SpringBoot/ORM框架:Mybatis/安全框架:Shiro/分页插件:PageHelper 连接池:SpringBoot自带的HiKariCP/日志:SpringBoot自带的LogBack/前端框架:Bootstrap 管理

    2024年02月14日
    浏览(41)
  • JavaWeb项目:航班信息管理系统(tomcat+jsp)

    航班信息管理系统是学习Javaweb的一个小项目,首先对该项目的业务需求进行分析,根据项目文档知它的主要实现技术为 SERVLET、JSP、MVC 架构、JDBC 和 MySQL。该项目着重学生的实际应用场景来设计,模拟 机场中的航班系统的业务实现以及扩展,能够实现航班信息管理的的所有功

    2024年04月12日
    浏览(32)
  • 尚硅谷JavaWeb电子书城项目(Java+Mysql+Tomcat+Jsp)

    自己写的在线电子书城项目,可改写,添加功能,如打折,分类,用户管理,评论等功能。 使用方法: 1.使用idea导入项目。 2.数据库要用项目resource文件里的book.sql文件建立。 3.修改jdbc.properites中的数据库信息。 4.使用maven加载pom.xml中的依赖。 5.配置好tomcat容器,运行项目。

    2024年02月04日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包