JPROCMS 作为开源免费的 Java CMS,1.7 版本把重心放在了两个方向——多站点 SaaS 场景的资源统一管理,以及静态页生成的精细化控制。如果你在用 JPROCMS 搭建多租户内容平台,这版更新直接解决了几个日常运维痛点。
globalRes:多站点共享插件资源不再重复上传
SaaS 模式下,多个站点往往引用同一套前端插件(比如 jQuery、Bootstrap、图表库)。以前每个站点各自上传一份,存储浪费、版本还容易不一致。1.7 新增了全局资源文件引用变量 globalRes,模板里可以直接用这个变量指向共享资源目录。
模板中使用方式大致如下:
<!-- 引用全局共享的 jQuery,而非站点本地副本 -->
<script src="${globalRes}/js/jquery-3.7.1.min.js"></script>
<link rel="stylesheet" href="${globalRes}/css/bootstrap.min.css" />
所有站点模板里写 ${globalRes} 就能指向同一份物理文件,升级插件版本时只改一处。站点本地资源仍用原有的站点级变量,两者互不干扰。
上传目录按站点隔离 + 远程抓图白名单
1.7 把上传目录结构从扁平改成了按站点隔离:
/upload/
├── site_1/
│ ├── images/
│ └── files/
├── site_2/
│ ├── images/
│ └── files/
这样做的好处是:站点迁移、备份、清理都能独立操作,不会误删其他租户的文件。对应的 Spring Boot 配置可以这样写:
jprocms:
upload:
base-path: /data/upload
site-isolated: true # 开启站点目录隔离
allowed-extensions: jpg,jpeg,png,gif,webp,pdf,docx
max-file-size: 10MB
remote-fetch:
whitelist-enabled: true # 开启远程抓图白名单
whitelist:
- cdn.example.com
- img.partner-site.cn
- static.trusted-source.org
远程抓取图片的白名单限制是个安全加固点——没有白名单时,用户在富文本里贴任意外链图片,系统会主动抓取到本地存储,这可能被利用做 SSRF 攻击。开启白名单后,只抓取信任域名的图片,其余保留原始外链不处理。
按栏目生成静态页:不再全站重生成
以前做静态化是"一键全站生成",改了一个栏目的一篇文章,整个站点重新渲染一遍,站点内容多了以后耗时明显。1.7 支持按栏目单独生成静态页,运维和发布流程可以这样设计:
# 只重新生成"产品动态"栏目的静态页
curl -X POST "http://localhost:8080/admin/staticize/column" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${ADMIN_TOKEN}" \
-d '{"columnId": 12}'
# 发布流程中,编辑完文章后只刷该栏目
# 不再触发全站静态化
栏目富文本还新增了纯文本格式属性——有些栏目(比如公告摘要、推送标题)不需要富文本渲染,存纯文本更安全,避免 XSS 遗留和样式混乱。
实时日志查看:排查问题不用 SSH 上服务器
1.7 加了实时日志查看功能,后台页面直接滚动输出应用日志。对于 SaaS 多租户场景,这意味着运营人员看到某个站点报错时,不用再找运维 SSH 登服务器翻 log 文件。
如果你需要把日志流接入自己的监控体系,可以配合 Spring Boot 的 logback 配置把关键日志同时输出到文件和 stdout:
<!-- logback-spring.xml 片段 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/data/logs/jprocms.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/data/logs/jprocms.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
CONSOLE 输出会被 JPROCMS 的实时日志功能捕获并推送到后台页面;FILE 输出留给长期归档和 ELK 采集。
升级与部署 Checklist
从 1.6 升级到 1.7,建议按以下步骤操作:
- 数据库迁移:执行官方提供的增量 SQL,新增栏目纯文本字段和白名单配置表。
- 上传目录迁移:把现有
/upload/下的文件按站点 ID 移入子目录,开启site-isolated: true。 - 模板改造:把公共插件引用从站点变量替换为
${globalRes},上传一份全局资源到共享目录。 - 白名单配置:梳理当前内容中常用的外链图片域名,填入
remote-fetch.whitelist,先开白名单再上线。 - 静态化策略调整:把定时任务从全站生成改为按栏目增量生成,减少发布耗时。
- 依赖升级:1.7 升级了 Spring Boot / Cloud 及其他 jar 版本,检查你自定义扩展的依赖兼容性,尤其是 MyBatis、Redis 客户端等。
JPROCMS 1.7 的改动集中在 SaaS 多站点运维效率和安全边界上,没有大的架构重构,升级风险可控。如果你正在评估 Java CMS 做 SaaS 内容平台,这版的站点隔离、全局资源、白名单和按栏目静态化组合起来,已经能覆盖大部分多租户场景的日常需求。