Web 地图选项(WebMap)

基本信息

属性 值
配置文件 journeymap.webmap.config
宿主类 journeymap.client.properties.WebMapProperties(WebMapProperties.java:20)
继承链 WebMapProperties → MapProperties → PropertiesBase
@Config 字段数 2(本 mod 最小的配置类)
所属页签 WebMap(2 项,全部)
界面入口 OptionSlotFactory.addSlots(..., Config.Category.WebMap, getWebMapProperties())(OptionSlotFactory.java:46)
HTTP 服务器 内嵌 Javalin 4.6.8(dependencies.gradle,shadowImplementation)
默认状态 关闭(enabled 默认 false)

功能

Web 地图选项只控制两件事:是否启用与监听哪个端口。它继承 MapProperties 的 11 项图层开关(详见 地图显示选项),因此 Web 地图的显示内容与游戏内全屏地图共用同一套配置语义,只是持久化在不同文件里。

两项配置

语言键 字段 类型 默认 范围 说明
jm.webmap.enable enabled bool false — 启用浏览器 Web 地图(master = true,作为本分类的主开关)
jm.advanced.port port int 8080 80–10000 HTTP 监听端口

(行号:WebMapProperties.java:22-26。)

注意 port 的语言键是 jm.advanced.port 而非 jm.webmap.port —— 它归在 WebMap 分类但键名前缀是 advanced,这是源码中的实际写法(WebMapProperties.java:25)。

preferredMapType(WebMapProperties.java:28,默认 MapType.Name.day)是非 @Config 字段,不显示在选项界面。

端口占用回退逻辑

WebMap.findPort(boolean tryCurrentPort)(webmap/WebMap.java:138-187)在启动时探测端口,行为分两级:

  1. 第一次尝试(tryCurrentPort = true):用配置端口 new ServerSocket(port) 试绑定。
    • 成功 → 取 socket.getLocalPort() 后立即关闭,用该端口启动
    • 失败(IOException)→ 打警告日志后递归调用 findPort(false)
  2. 第二次尝试(tryCurrentPort = false):用 new ServerSocket(0) 请求系统分配的任意空闲端口,取回后关闭 socket 并使用
    • 若连这一步也失败 → 记录错误并调用 stop(),Web 地图不启动

⚠️ 端口回退是静默降级:配置里写 8080 而 8080 被占用时,服务器会改用随机端口,只在日志里留下 Configured port {} could not be bound 的警告。浏览器端因此可能连不上配置端口,需查日志确认实际端口。

客户端实例为 null(开发环境类加载问题)时直接回落到 8080(:144-147),并在注释中明确说明"这只是在开发环境压制异常,并不修复该问题"。

数值

数值名 值
@Config 字段数 2
默认端口 8080
端口合法范围 80–10000
端口被占用时的回退 系统分配的随机空闲端口(ServerSocket(0))
静态资源根目录 <游戏目录>/journeymap/web/(Constants.WEB_DIR,Constants.java:66)

交互

触发 行为
游戏启动且 enabled = true JourneymapClient.postInitialize() 中 if (webMapProperties.enabled.get()) 启动 Web 服务器(JourneymapClient.java:311)
启动成功 日志输出 Webmap is now listening on port: {}(WebMap.java:51)
配置端口被占用 自动改用随机端口,仅记警告日志(:164-168)
修改端口设置 需重启 Web 服务器(findPort 的注释指出端口只在 port == 0 时才重新读取配置,:140、:150)
浏览器访问 见 Web 地图服务器 的 9 条路由

安全提示

服务器对所有响应统一追加两个头(WebMap.java:105-108):

  • Access-Control-Allow-Origin: * —— 允许任意来源跨域读取
  • Cache-Control: no-cache

且内置 HTTP 服务器无任何身份验证。在共享网络下启用等于把地图数据对同网段完全开放,建议仅在本地或可信局域网使用。

相关条目