踩坑:springboot+freemarker 第二个参数丢失变为FreeMarker

在使用SpringBoot和Freemarker构建的页面中,遇到一个问题:当请求URL如localhost:8080/content/123/456时,第二次请求自动变为localhost:8080/content/123/FreeMarker,第二个参数被替换成FreeMarker。原因是控制器内Freemarker参数赋值异常,导致在模板渲染时,图片src为空并触发错误,浏览器尝试加载错误信息作为src,从而触发新的请求。解决方案包括:1. 对资源如src做空值兼容处理;2. try...catch后确保模型参数不为空;3. 设计错误处理机制防止页面加载失败。

一个用springboot+freemarker做的页面,发生了一件奇怪的事。

页面出了问题后,自动第二次请求get,第一个参数保留,第二个参数被自动替换为FreeMarker

Controller的写法:

@RequestMapping("content/{order}/{district}")
public String getTravelPage(@PathVariable String order, @PathVariable String district, Map<String, Object> model) throws IOException {
    long orderId = 0;
    try {
        //...
        String picSrc = "";
        model.put("PicSrc", picSrc);
        //...
    } catch (Exception ex) {
        logger.warn("getContent Exception ", order, ex);
    }
    return "content";
}

第一遍请求url: localhost:8080/content/123/456

执行到return "content"这一句自动返回controller函数第一行,开始第二遍请求url: localhost:8080/content/123/FreeMarker

为什么会请求第二遍?

为什么第二个参数看起来是丢失赋了默认值?

看了页面的sourcecode, 原因:

content页面:

<img class="topicBox-img" src=${PicSrc}  />

这是第一个需要的参数,controller里面会对freemarker的所有参数赋值,但是由于程序异常,这里的赋值没有赋,直接跳到catch Exception里面执行。return 的页面里面PicSrc是空值。

页面渲染到src=null报错,提示信息:

<div class="topicBox">

<img class="topicBox-img" src=FreeMarker template error (DEBUG mode; use RETHROW in production!):

The following has evaluated to null or missing:
==> PicSrc  [in template "content.ftl" at line 12, column 41]

由于src是资源,浏览器要加载和访问资源,于是自动访问路径,但是由于报错的提示信息赋在了src后面,浏览器把第一个单词(空格分隔)认为是src的值,浏览器是层级访问,现在已经加载了第一层,也就是localhost:8080/content/123,img的src变为localhost:8080/content/123/FreeMarker

这时又命中的controller的规则,第二次进入controller, 且从int形的参数变成string,又出现错误,彻底加载不了了,页面变为一段报错信息:

PicSrc [in template "content.ftl" at line 12, column 41] ---- Tip: If the failing expression is known to be legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>

如果页面加载的第一个参数不是src的值,而是一段text则不会二次访问controller, 直接显示报错页面。

解决方法:

1. src等资源要做空的兼容

src=${PicSrc?default('/image/initial.jpg')}

2. try...catch之后也要对model赋值,保证页面需要的参数不是空的。

3. 即使页面失败,也需有失败的补偿。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值