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

news2024/9/21 22:35:08

一、问题分析

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 文件载入内存:

    现在问题明白了。因为我的 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 文件的缓存进行清理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1367161.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

7个PyCharm实用插件实现轻松编程

大家好&#xff0c;IDE&#xff08;集成开发环境&#xff09;是开发者的武器&#xff0c;使用一个好的IDE和一些很棒的插件&#xff0c;工作效率会更高。Python是一种广泛使用的编程语言&#xff0c;PyCharm是最受欢迎的Python IDE之一。以下介绍7个PyCharm插件&#xff0c;它们…

JavaScript基础(25)_dom查询练习(二)

<!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><title>dom查询练习二</title><link rel"stylesheet" href"../browser_default_style/reset.css"><style>form {margi…

K8S--持久卷(PersistentVolume)的用法

原文网址&#xff1a;K8S--持久卷(PersistentVolume)的用法-CSDN博客 简介 本文介绍K8S的持久卷(PersistentVolume)的用法。 目标&#xff1a;用持久卷的方式将主机的磁盘与容器磁盘映射&#xff0c;安装nginx并运行。 --------------------------------------------------…

IO流-文件复制

IO流 概述&#xff1a;IO流&#xff0c;输入输出流&#xff08;Input Output&#xff09;流&#xff1a;一种抽象的概念&#xff0c;对数据传输的总称。&#xff08;数据在设备之间的传输称为流&#xff09;常见的功能 文件复制文件上传文件下载 学习流&#xff0c;我们要搞懂…

CSS 发光输入框动画

<template><view class="content"><input placeholder="请输入..." class="input" /> </view> </template><script></script><style>/* 设置整个页面的背景颜色为 #212121 */body{background-c…

centos7系统部署SqlServer2019

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 一 关于SQL Server SQL Server数据库是Microsoft开发设计的一个关系数据库智能管理系统(RDBMS)。 二 安装部署 2.1 安装依赖 …

使用 matlab 求解最小二乘问题

有约束线性最小二乘 其标准形式为&#xff1a; min ⁡ x 1 2 ∥ C x − d ∥ 2 2 \mathop {\min }\limits_x \quad \frac{1}{2}\left\| Cx-d \right\|_2^2 xmin​21​∥Cx−d∥22​ 约束条件为&#xff1a; A ⋅ x ≤ b A e q ⋅ x b e q l b ≤ x ≤ u b \begin{aligned} …

linux创建pyspark虚拟环境

一、创建虚拟环境 conda create -n test python3.6.6 二、注意添加镜像 vi /root/.condarc channels:- http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/- http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/- http://mirrors.ustc.edu.cn/anaconda/pkgs/ma…

消息队列-RockMQ-批量收发实践

批量收发实战 发送消息是需要网络连接的如果我们单条发送吞吐量可能没有批量发送好。剖来那个发送可以减少网络IO开销&#xff0c;但是也不能一批次发送太多的数据&#xff0c;需要根据每条消息的大小和网络带宽来确定量的数目。 比如网络带宽为可以支持一次性发送8M的数据包&…

如何解读服务器的配置和架构?

在当今数字化时代&#xff0c;服务器作为企业或组织的重要基础设施&#xff0c;其配置和架构对于保障业务的稳定运行至关重要。如何解读服务器的配置和架构&#xff0c;成为了一个备受关注的话题。本文将围绕服务器配置和架构的解读进行深入探讨&#xff0c;帮助读者更好地理解…

DDIM学习笔记

写在前面&#xff1a; &#xff08;1&#xff09;建议看这篇论文之前&#xff0c;可先看我写的前一篇论文&#xff1a; DDPM推导笔记-大白话推导 主要学习和参考了以下文章&#xff1a; &#xff08;1&#xff09;一文带你看懂DDPM和DDIM &#xff08;2&#xff09;关于 DDIM …

如何精选WordPress插件

WordPress的强大功能大多得益于其众多插件。正确选择插件可以让你的网站功能强大、运行平稳&#xff0c;而错误的选择则可能导致网站变慢甚至出现安全漏洞。这篇文章将指导你如何在众多可选的插件中作出明智的选择。 明确需求 在浏览WordPress的插件目录或其他市场之前&#…

阶段十-分布式-任务调度

第一章 定时任务概述 在项目中开发定时任务应该一种比较常见的需求&#xff0c;在 Java 中开发定时任务主要有三种解决方案&#xff1a;一是使用JDK 自带的 Timer&#xff0c;二是使用 Spring Task&#xff0c;三是使用第三方组件 Quartz Timer 是 JDK 自带的定时任务工具,其…

STL标准库与泛型编程(侯捷)笔记1

STL标准库与泛型编程&#xff08;侯捷&#xff09; 本文是学习笔记&#xff0c;仅供个人学习使用。如有侵权&#xff0c;请联系删除。 参考链接 Youbute: 侯捷-STL标准库与泛型编程 B站: 侯捷 - STL Github:STL源码剖析中源码 https://github.com/SilverMaple/STLSourceCo…

Vue2:脚手架Vue-CLI的使用

一、环境准备 vue脚手架&#xff08;vue-CLI&#xff09;的使用是基于nodejs环境下的。 你可以简单理解为&#xff0c;Java项目需要再jvm虚拟机上才能编译运行 nodejs的作用就是将vue文件编译成html、css、js代码文件。 如何安装nodejs 参考&#xff1a;https://blog.csdn.net…

谁动了我的注册表?免费的注册表对比分析工具

关于这款工具&#xff0c;可以在B站搜谁动了我的注册表&#xff0c;UP主名字为有限的未知。该注册表对比分析工具视频教程链接如下。谁动了我的注册表&#xff1f;注册表比对分析工具 & 手动实现右键菜单自由_哔哩哔哩_bilibili 声明&#xff1a;该款注册表分析软件&#…

想要成为机器学习领域的高手吗?这里有五本必读免费书,订阅周报发链接 (下)

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

接口测试实战教程详解(加密解密攻防)

一、对称加密 对称加密算法是共享密钥加密算法&#xff0c;在加密解密过程中&#xff0c;使用的密钥只有一个。发送和接收双方事先都知道加密的密钥&#xff0c;均使用这个密钥对数据进行加密和解密。 数据加密&#xff1a;在对称加密算法中&#xff0c;数据发送方将明文 (原…

用python提取excel表格第一列汉字首字母到第二列

今天有个任务就是需要提取excel表格里面的汉字首字母&#xff0c;然后我就手动写了三个小时&#xff0c;结果还剩3000多行&#xff0c;这样下去不行啊 想了下用python能不能做到呢&#xff1f; import openpyxl from pypinyin import lazy_pinyin, Style# 加载工作簿 workbook…

代码随想录算法训练营第三十天|总结、332.重新安排行程、51.N皇后、37.解数独

代码随想录 (programmercarl.com) 总结 332.重新安排行程 欧拉通路和欧拉回路&#xff1a; 欧拉通路&#xff1a;对于图G来说&#xff0c;如果存在一条通路包含G的所有边&#xff0c;则该通路称为欧拉通路&#xff0c;也称欧拉路径。欧拉回路&#xff1a;如果欧拉路径是一条…