从 Solo v4.3.0 起,本地评论系统已经被彻底移除,以下内容已过时。
发布评论实现
发布评论的后端接口在 CommentProcessor.java 中:
- 请求路径:/article/comments
- HTTP 方法:POST
- Java 方法:CommentProcessor#addArticleComment
发布评论时会检查是否是登录用户,如果是登录用户发布评论,则不会校验验证码。
if (!Solos.isLoggedIn(httpServletRequest, httpServletResponse)) {
final String captcha = requestJSONObject.optString(CaptchaProcessor.CAPTCHA);
if (CaptchaProcessor.invalidCaptcha(captcha)) {
jsonObject.put(Keys.STATUS_CODE, false);
jsonObject.put(Keys.MSG, langPropsService.get("captchaErrorLabel"));
return;
}
}
发布评论分为对文章的评论和对页面的评论,处理流程基本类似。添加完数据记录后会在响应中填充 HTML 模板,方便前端做异步渲染。
// 添加评论优化 https://github.com/b3log/solo/issues/12246
try {
final String skinDirName = (String) httpServletRequest.getAttribute(Keys.TEMAPLTE_DIR_NAME);
final Template template = Skins.getSkinTemplate(httpServletRequest, "common-comment.ftl");
final JSONObject preference = preferenceQueryService.getPreference();
Skins.fillLangs(preference.optString(Option.ID_C_LOCALE_STRING), skinDirName, dataModel);
Keys.fillServer(dataModel);
final StringWriter stringWriter = new StringWriter();
template.process(dataModel, stringWriter);
stringWriter.close();
String cmtTpl = stringWriter.toString();
addResult.put("cmtTpl", cmtTpl);
} catch (final Exception e) {
// 1.9.0 向后兼容
}
发布评论大致需要进行如下处理:
- 填充默认值,比如设置文章 id、时间等
- 填充参数值,比如评论人信息、内容等
- 处理统计,比如文章评论计数、全局评论计数
- 发送邮件通知给管理员
评论发布完成后还会触发事件 发布评论
。内置的事件处理有两个:
- ArticleCommentReplyNotifier,如果该评论时针对另一条评论的回复,则会发送邮件给原评论人
- B3CommentSender,同步评论数据给黑客派社区,实现 B3log 构思
XSS 防御
评论内容支持 Markdown 语法,在入库保存时存的是 Markdown 文本。其中有可能包含一些不安全的脚步,在渲染评论时会进行 XSS 过滤处理。
不在发布时过滤是因为当前的过滤有可能存在漏洞,这样以后要更新数据就非常困难了。在渲染时可以随时调整过滤算法,直到排除隐患。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于