JPROCMS 1.7:多站点 SaaS 与静态化能力再上一层

2026-06-03 29 预计阅读时间:1 分钟
来源:oschina.net AI 摘要 原文链接

免责声明:本文为 AI 摘要整理,建议结合原文阅读。摘要可能省略上下文、版本差异或边界条件,不作为官方说明。

预计阅读时间:7 分钟

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,建议按以下步骤操作:

  1. 数据库迁移:执行官方提供的增量 SQL,新增栏目纯文本字段和白名单配置表。
  2. 上传目录迁移:把现有 /upload/ 下的文件按站点 ID 移入子目录,开启 site-isolated: true
  3. 模板改造:把公共插件引用从站点变量替换为 ${globalRes},上传一份全局资源到共享目录。
  4. 白名单配置:梳理当前内容中常用的外链图片域名,填入 remote-fetch.whitelist,先开白名单再上线。
  5. 静态化策略调整:把定时任务从全站生成改为按栏目增量生成,减少发布耗时。
  6. 依赖升级:1.7 升级了 Spring Boot / Cloud 及其他 jar 版本,检查你自定义扩展的依赖兼容性,尤其是 MyBatis、Redis 客户端等。

JPROCMS 1.7 的改动集中在 SaaS 多站点运维效率和安全边界上,没有大的架构重构,升级风险可控。如果你正在评估 Java CMS 做 SaaS 内容平台,这版的站点隔离、全局资源、白名单和按栏目静态化组合起来,已经能覆盖大部分多租户场景的日常需求。


相关推荐