Fix the meta description with special characters causing the page to display abnormally (#4031)

<!--  Thanks for sending a pull request!  Here are some tips for you:
1. 如果这是你的第一次,请阅读我们的贡献指南:<https://github.com/halo-dev/halo/blob/master/CONTRIBUTING.md>。
1. If this is your first time, please read our contributor guidelines: <https://github.com/halo-dev/halo/blob/master/CONTRIBUTING.md>.
2. 请根据你解决问题的类型为 Pull Request 添加合适的标签。
2. Please label this pull request according to what type of issue you are addressing, especially if this is a release targeted pull request.
3. 请确保你已经添加并运行了适当的测试。
3. Ensure you have added or ran the appropriate tests for your PR.
-->

#### What type of PR is this?

<!--
添加其中一个类别:
Add one of the following kinds:

/kind bug
/kind cleanup
/kind documentation
/kind feature
/kind improvement

适当添加其中一个或多个类别(可选):
Optionally add one or more of the following kinds if applicable:

/kind api-change
/kind deprecation
/kind failing-test
/kind flake
/kind regression
-->
/kind bug
/area core

#### What this PR does / why we need it:
Fix the problem that the meta description with special characters causes the page to display abnormally.
Use htmlEscape in org.springframework.web.util.HtmlUtils to escape the special characters contained in the original description.

see #4000 
#### Which issue(s) this PR fixes:

<!--
PR 合并时自动关闭 issue。
Automatically closes linked issue when PR is merged.

用法:`Fixes #<issue 号>`,或者 `Fixes (粘贴 issue 完整链接)`
Usage: `Fixes #<issue number>`, or `Fixes (paste link of issue)`.
-->
Fixes #4000

#### Special notes for your reviewer:

#### Does this PR introduce a user-facing change?

<!--
如果当前 Pull Request 的修改不会造成用户侧的任何变更,在 `release-note` 代码块儿中填写 `NONE`。
否则请填写用户侧能够理解的 Release Note。如果当前 Pull Request 包含破坏性更新(Break Change),
Release Note 需要以 `action required` 开头。
If no, just write "NONE" in the release-note block below.
If yes, a release note is required:
Enter your extended release note in the block below. If the PR requires additional action from users switching to the new release, include the string "action required".
-->

```release-note
NONE
```
pull/4023/head^2
contour 2023-06-04 10:15:21 +08:00 committed by GitHub
parent 430b5fb270
commit a56d4f2a92
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 5 additions and 3 deletions

View File

@ -10,6 +10,7 @@ import java.util.Map;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.util.HtmlUtils;
import org.thymeleaf.context.ITemplateContext;
import org.thymeleaf.model.IModel;
import org.thymeleaf.model.IModelFactory;
@ -70,18 +71,19 @@ public class ContentTemplateHeadProcessor implements TemplateHeadProcessor {
static List<Map<String, String>> excerptToMetaDescriptionIfAbsent(
List<Map<String, String>> htmlMetas,
String excerpt) {
final String excerptNullSafe = StringUtils.defaultString(excerpt);
String excerptNullSafe = StringUtils.defaultString(excerpt);
final String excerptSafe = HtmlUtils.htmlEscape(excerptNullSafe);
List<Map<String, String>> metas = new ArrayList<>(defaultIfNull(htmlMetas, List.of()));
metas.stream()
.filter(map -> Meta.DESCRIPTION.equals(map.get(Meta.NAME)))
.distinct()
.findFirst()
.ifPresentOrElse(map ->
map.put(Meta.CONTENT, defaultIfBlank(map.get(Meta.CONTENT), excerptNullSafe)),
map.put(Meta.CONTENT, defaultIfBlank(map.get(Meta.CONTENT), excerptSafe)),
() -> {
Map<String, String> map = new HashMap<>();
map.put(Meta.NAME, Meta.DESCRIPTION);
map.put(Meta.CONTENT, excerptNullSafe);
map.put(Meta.CONTENT, excerptSafe);
metas.add(map);
});
return metas;