当我尝试在具有Spring和Thymeleaf的Java项目中嵌入具有确切时间的YouTube视频时,我遇到了一个问题。
1 /工作方案:
当我尝试嵌入正常的YouTube视频时,它可以工作:
在控制器我有这个:
article.setVideo(视频);
视频是youtube视频的结束字符串:
视频链接示例:https://www.youtube.com/embed/s39mNwFuQDQ
此处视频的值为: s39mNwFuQDQ
现在在html Thymeleaf视图中我有: html Thymeleaf view
<iframe width="560" height="315" th:src="@{https://www.youtube.com/embed/{url} (url=${article.video})}" frameborder="0" alt="no video attached" allowfullscreen="1"></iframe>
它需要保存的视频字符串,将其连接到https://www.youtube.com/embed/
并且它正常工作。
2 /非工作方案 当我尝试做同样的事情,但是使用具有确切时间的YouTube视频时 - 它无效:
在控制器中我有这个:
article.setVideo(video +“?start =”+ extOptions);
其中:
video - 是一个字符串; extOptions 是一个字符串。
结果我得到了一个String
示例:https://www.youtube.com /embed/s39mNwFuQDQ?start=212
视频是 - s39mNwFuQDQ
extOptions 是 - 212
现在在article.getVideo()中我有: s39mNwFuQDQ?start = 212 - 这在数据库中保存得很好。
在Thymeleaf html视图中,我仍然使用相同的代码。 不幸的是,我的视频在浏览器中一直没有显示(试过不同的浏览器)。
当我尝试这样的视频的精确显示时:
<iframe width="560" height="315" th:src="@{https://www.youtube.com/embed/s39mNwFuQDQ?start=212}" frameborder="0" alt="no video attached" allowfullscreen="1">
工作正常,视频显示从212秒开始。
这可能是什么问题?
我试过逃跑了吗?标记,一些模式引用(正则表达式转义) - 但这没有帮助,这些只用不需要的字符填充字符串。
任何想法如何解决问题?
答案 0 :(得分:2)
Thymeleaf正在逃避问号(在这种情况下应该如此)。如果您查看来源,则会看到它正在将?
替换为%3F
。你应该这样做的方法是将开始保持在一个不同的变量中,并像这样构建url:
th:src="@{https://www.youtube.com/embed/{url} (url=${article.video}, start=${article.start})}"
如果这不是一个选项,您可以将您的网址创建为字符串,但是您可以自行开启某些攻击(如果您可以接收视频网址的不受信任的输入)。
th:src="${'https://www.youtube.com/embed/' + url}"
回答编辑 - 如果控制器选项设置如下:
article.setVideo(video); // example: video equals: s39mNwFuQDQ
article.setVideoLink(extOptions); // example: extOptions equals: 212
Thymeleaf的完整语法是:
<!-- Generated url: https://www.youtube.com/embed/s39mNwFuQDQ?start=212 -->
<iframe width="560" height="315" th:src="@{https://www.youtube.com/embed/{url}(url=${article.video}, start=${article.videoLink})}" frameborder="1" alt="no video attached" allowfullscreen="0"></iframe>