Java搭配H5实现前后端交互评论功能

前言

        最近有个朋友有偿让我帮他们将这个评论组件整合到他们的静态网页当中,并实现数据持久化。后来他觉得太麻烦,就放弃了。尽管没有拿到相应的报酬,但只是花了短短的时间写完了这个简单功能,并有机会将其分享给大家。内容不长,全是干货,请择需浏览。

一、框架介绍

        (1)后端采用 JPA + SpringWeb。这里选择 JPA 主要是因为 JPA 可以自动建表。

        (2)前端采用 H5 + JS。选择 H5 和原生 JS 主要是考虑到灵活性和兼容性。

        (3)源代码已上传到资源绑定,请按需下载

二、前端

        (一)、存在 XSS 漏洞的版本

                1、这个版本的代码,可以看这篇博文。与解决XSS漏洞版本不同的是,这个版本的样式在动态渲染时使用的是 innerHTML 赋值,这种赋值会有一个弊端,就是会对输入内容进行标签解析,如果用户输入了类似“<div>我是文本</div>”的内容,会被解析成H5标签,这将给不法分子攻击并窃取你网站信息制造良机,因此对于用户输入的内容,要做到敏感信息过滤并加以限制或对用户输入的内容采用文本解析的方式。以下是一个正面例子:

const commentContent = document.createElement('div');
commentContent.style.display = 'block';
commentContent.style.marginTop = '8px';
commentContent.classList.add('comment');
commentContent.textContent = value.comment;

               2、该版本没有实现与后端交互,因此内容不会被持久化。

        (二)、解决了 XSS 漏洞的版本

              1、如何请求后端。下面会给出一段 JavaScript 中不使用 Ajax 请求后端的代码示例

    function createOrGetUserName() {let userName = localStorage.getItem('userName');if (!userName) {const url = "http://127.0.0.1:8080/comment/getRandomUserName";const req = new XMLHttpRequest();// open 函数第三个参数是 async, 是否同步req.open('get', url, true);// 根据请求后端的参数类型,设置请求头req.setRequestHeader('Content-Type', 'application/json')req.onreadystatechange = function () {if (req.readyState === 4) {if (req.status === 200 || req.status === 304) {const resp = JSON.parse(req.responseText);if (resp.code === 200) {localStorage.setItem('userName', resp.result);}}}}req.send();}return localStorage.getItem('userName');}

              2、请求后端我们一般都会使用 Ajax 或者 VUE 的 Axios 等等,这里可以使用  XMLHttpRequest 来替代,并设计“增删改查”相应的API。

三、后端

          后端这里只是对一些功能做简单介绍。具体代码可以下载源码自行研究。

        (一)、JPA 框架

            1、JPA自动建表。在properties文件中使用如下配置可以在实体(Entity)结构更新时,更新数据库中对应的表结构。

spring.jpa.hibernate.ddl-auto=update

            2、建表前,我们可以创建对应的实体,设计好表的字段与表名。实体创建好后,启动项目,当该实体被应用时,会自动在指定的数据库创建对应的表结构。

@Entity
@Table(name = "ATable")
public class TableName {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Integer id;@Column(name = "field_name")private String fieldName;// ... Too many fields
}

         3、JPA的功能很丰富,比如一对多的查询,可以使用 @oneToMany 注解来实现。自定义 SQL 查询可以在 @Query 注解中完成。这里就不多做介绍了,具体可以去看看相关的博文介绍。

      (二)、评论树的结构

         1、XSS 版本中已经介绍了评论树的结构怎样呈现最合宜。两层关系既直观又容易实现与维护。评论谁?我们会创建一个 Author 字段,来存储被评论者和被回复者的 ID。那么在构建这个3层的 N 叉树时,除去 root,对于每个直接对文章评论的用户放入一层列表,然后对这第一层列表进行递归,并将其所有一级或二级子节点放入这一层列表相应节点的 children 列表即可。下面是构建评论树的 Java 代码。

    public static List<Comment> treeify(List<Comment> res) {List<Comment> newRes = new ArrayList<>();// 构建关系表Map<Integer, List<Comment>> relations = new HashMap<>();for (Comment c : res) {c.setUuidList(UUIDUtil.getUUIDList(5));String admirers = c.getAdmirers();Map<String, Boolean> admirerStatus = new HashMap<>();if (admirers != null && !admirers.isEmpty()) {String[] split = admirers.split(",");for (String name : split)admirerStatus.put(name, true);}c.setAdmirerStatus(admirerStatus);// -1 是代表文章作者也就是 N 叉树的 rootif (-1 == c.getAuthorId())newRes.add(c);List<Comment> commentList = relations.getOrDefault(c.getAuthorId(), new ArrayList<>());commentList.add(c);// 保存关系relations.put(c.getAuthorId(), commentList);}for (Comment c : newRes) {c.setReply(new ArrayList<>());// 递归添加子节点recur(relations, c.getId(), c);}return newRes;}public static void recur(Map<Integer, List<Comment>> rel, Integer id, Comment father) {if (rel.containsKey(id)) {for (Comment c : rel.get(id)) {father.getReply().add(c);recur(rel, c.getId(), father);}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/811789.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从IoTDB的发展回顾时序数据库演进史

面向工业物联网时代&#xff0c;以 IoTDB 为代表的时序数据库加速发展。 时序数据的主要产生来源之一是设备与传感器&#xff0c;具有监测点多、采样频率高、存储数据量大等多类不同于其他数据类型的特性&#xff0c;从而导致数据库在实现高通量写入、存储成本、实时查询等多个…

第G2周:人脸图像生成(DCGAN)

第G2周&#xff1a;人脸图像生成&#xff08;DCGAN&#xff09; 第G2周&#xff1a;人脸图像生成&#xff08;DCGAN&#xff09;一、前言二、我的环境三、代码实现1、导入第三方库2、设置超参数3、导入数据 四、定义模型4.1 初始化权重4.2 定义生成器4.3 定义鉴别器 五、训练模…

蚂蚁云科技集团正式发布「以正」教育大模型

4月12日&#xff0c;蚂蚁云科技集团成功举办“智以育人、慧正无界——以正教育大模型产品发布会”&#xff0c;助力智慧教育变革&#xff0c;让因材施教成为可能。 蚂蚁云科技集团CEO蒋俊致辞并演讲 蒋俊对本次发布会的成功举办表达了最美好的祝愿&#xff0c;并回顾了蚂蚁云…

2024年蓝桥杯40天打卡总结

2024蓝桥杯40天打卡总结 真题题解其它预估考点重点复习考点时间复杂度前缀和二分的两个模板字符串相关 String和StringBuilderArrayList HashSet HashMap相关蓝桥杯Java常用算法大数类BigInteger的存储与运算日期相关考点及函数质数最小公倍数和最大公约数排序库的使用栈Math类…

Go语言图像处理实战:深入image/color库的应用技巧

Go语言图像处理实战&#xff1a;深入image/color库的应用技巧 引言image/color库基础颜色模型简介颜色类型和接口 image/color库实际应用基本颜色操作创建颜色颜色值转换颜色比较 颜色转换与处理与image库结合使用 性能优化和高级技巧性能考量避免频繁的颜色类型转换使用并发处…

web服务器是如何运行的?tomcat基本原理

tomcat基本流程 tomcat在启动时将webapps下的每个项目中的web.xml读取&#xff0c;获取相关信息。tomcat只关心Servlet 程序、Filter 过滤器、Listener 监听器&#xff0c;不关心其他类。 tomcat接收到请求后会将请求报文转换成一个httpServletRequest对象&#xff0c;包含请求…

【MATLAB源码-第45期】基于matlab的16APSK调制解调仿真,使用卷积编码软判决。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. 16APSK调制解调 16APSK (16-ary Amplitude Phase Shift Keying) 是一种相位调制技术&#xff0c;其基本思想是在恒定幅度的条件下&#xff0c;改变信号的相位&#xff0c;从而传送信息。 - 调制&#xff1a;在16APSK中&am…

在vue和 js 、ts 数据中使用 vue-i18n,切换语言环境时,标签文本实时变化

我的项目需要显示两种语言(中文和英文)&#xff0c;并且我想要切换语言时&#xff0c;页面语言环境会随之改变&#xff0c;目前发现&#xff0c;只能在vue中使用$t(‘’)的方式使用&#xff0c;但是这种方式只能在vue中使用&#xff0c;而我的菜单文件是定义在js中&#xff0c;…

修改当前Git仓库的地址、用户名、密码

1.修改仓库地址 git remote set-url origin 新的仓库地址2.修改用户名和密码 2.1 修改用户名和密码1 分两步操作&#xff1a; 修改用户名&#xff1a; git config --global user.name "Your New Name"修改密码&#xff1a; 如果是 HTTPS 访问方式&#xff0c;并…

gpt系列概述——从gpt1到chatgpt

GPT建模实战&#xff1a;GPT建模与预测实战-CSDN博客 OpenAI的GPT&#xff08;Generative Pre-trained Transformer&#xff09;系列模型是自然语言处理领域的重要里程碑。从2018年至2020年&#xff0c;该公司相继推出了GPT-1、GPT-2和GPT-3&#xff0c;这些模型在文本生…

CTFshow电子取证——内存取证1

关于内存与注册表 内存中的注册表项 当Windows操作系统启动时&#xff0c;它会将注册表的部分数据加载到内存中&#xff0c;以便系统和应用程序可以快速地访问这些信息。这些数据在内存中可以更快地被读取和修改&#xff0c;以便系统能够动态地调整其行为和配置。 系统性能和…

加权轮询负载均衡算法Golang实现

加权轮询负载均衡算法&#xff08;Weighted Round Robin Load Balancing Algorithm&#xff09;是一种常见的负载均衡策略&#xff0c;它结合了轮询调度和权重分配的特点&#xff0c;使得请求可以依据服务器的能力不同而被合理地分配。 在加权轮询算法中&#xff0c;每个服务器…

工业相机飞拍功能的介绍(转载学习)

转载至&#xff1a; https://baijiahao.baidu.com/s?id1781438589726948322&wfrspider&forpc

办公软件巨头CCED、WPS迎来新挑战,新款办公软件已形成普及之势

办公软件巨头CCED、WPS的成长经历 CCED与WPS&#xff0c;这两者均是中国办公软件行业的佼佼者&#xff0c;为人们所熟知。 然而&#xff0c;它们的成功并非一蹴而就&#xff0c;而是经过了长时间的积累与沉淀。 CCED&#xff0c;这款中国大陆早期的文本编辑器&#xff0c;在上…

【vue】购物车案例优化

对 购物车案例 进行优化 用watch实现全选/取消全选用watch实现全选状态的检查用computed计算总价格 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-w…

014:vue3 van-list van-pull-refresh实现上拉加载,下拉刷新

文章目录 1. 实现上拉加载&#xff0c;下拉刷新效果2. van-list&#xff0c;van-pull-refresh组件详解2.1 van-list组件2.2 van-pull-refresh组件 3. 完整案例4. 坑点&#xff1a;加载页面会一直调用加载接口 1. 实现上拉加载&#xff0c;下拉刷新效果 通过下拉刷新加载下一页…

淘宝扭蛋机小程序:扭出惊喜,乐享购物新体验

在快节奏的现代生活中&#xff0c;人们总是在寻找新鲜、有趣的娱乐方式。淘宝扭蛋机小程序应运而生&#xff0c;为您带来前所未有的购物与娱乐结合新体验。在这里&#xff0c;每一次的扭动都充满惊喜&#xff0c;每一次的点击都带来乐趣&#xff0c;让您在购物的同时&#xff0…

4.Labview簇、变体与类(上)

在Labview中&#xff0c;何为簇与变体&#xff0c;何为类&#xff1f;应该如何理解&#xff1f;具体有什么应用场景&#xff1f; 本文基于Labview软件&#xff0c;独到的讲解了簇与变体与类函数的使用方法和场景&#xff0c;从理论上讲解其数据流的底层概念&#xff0c;从实践上…

leetcode做题记录 1041 1647

1041. 困于环中的机器人 简单做法 &#xff08;python写多了c都不会写了qwq&#xff09;时间复杂度为4n class Solution { public:bool isRobotBounded(string is) {int x0,y0,m0;int dx[]{0,-1,0,1};int dy[]{1,0,-1,0};isisisisis;for (int i0;i<is.size();i)if (is[i]…

汽车维修类中译英的英语翻译

近年来&#xff0c;随着全球化的加速和汽车市场的不断扩大&#xff0c;汽车维修领域的交流与合作也日益频繁。汽车维修类中译英的英语翻译在汽车行业中扮演着至关重要的角色。那么&#xff0c;针对汽车维修类翻译&#xff0c;中译英的英语翻译有何技巧&#xff1f; 业内人士指出…