首页 / 资讯中心 / 文章详情

eWebEditor v0.1.4 JSP集成指南:Tomcat部署与Jsoup XSS过滤

eWebEditor v0.1.4 JSP集成指南:Tomcat部署与Jsoup XSS过滤 ★ FEATURED ARTICLE
简介eWebEditor在线文本编辑器v0.1.4 For JSP是一套面向Java Web开发者的网页富文本编辑组件由吕海鹏在原版基础上修改优化适合需要在JSP项目中快速集成可视化编辑能力的开发者使用。它支持字体格式、颜色、加粗斜体等排版操作并可上传插入图片、音视频等多媒体资源内置超链接与邮件链接功能同时开放HTML源码编辑兼顾可视化操作与精细控制还提供API供开发者自定义按钮布局与插件扩展。资源包共264个文件以186个gif图标、27个css样式、21个htm页面及4个jsp示例为主另含class、js、xml、jar等运行与配置文件整体约796KB结构紧凑便于部署。目前已有169人学习下载。借助该组件开发者可省去从零构建编辑器的成本直接参考示例页面完成与Java后端的交互集成并关注XSS等安全处理提升内容创作效率。1. 从一份老 JSP 包说起eWebEditor v0.1.4 到底能解决什么问题如果你手上维护着一套跑在 Tomcat 上的老 JSP 系统后台需要一个能直接嵌进页面的富文本编辑器又不想引入 npm、Webpack 那一整套前端工程链那 eWebEditor 这个包大概率会被翻出来。它是一套纯 Java 服务端渲染的在线文本编辑器v0.1.4 这个版本以ewebeditor014jsp.rar的形式分发解压后是一堆 JSP 页面、JavaScript 脚本和图片资源丢进 Web 容器就能跑。它解决的核心诉求很具体让 JSP 页面里出现一个可视化编辑区用户能加粗、调色、插表格、传图片提交时拿到一段 HTML 字符串存库。适合谁适合还在用 JSP Servlet 做内部管理系统、OA、CMS 的团队尤其是那些服务器只装了 JDK 和 Tomcat、连 Maven 都不一定有的环境。不适合新项目也不适合对 XSS 防护有硬性要求的公网产品——这一点后面会专门讲。2. 拆包与部署把 eWebEditor 塞进 Tomcat 的最小路径2.1 先看清目录结构再动手拿到ewebeditor014jsp.rar之后别急着往webapps里扔。先解压到一个临时目录用tree或者文件管理器看一眼层级。常见的结构是顶层一个ewebeditor文件夹里面分js、css、images、jsp几个子目录外加一个ewebeditor.jsp作为入口页。这个入口页是整包的核心它负责输出编辑器的 HTML 骨架并通过iframe把工具栏和编辑区拼在一起。你要做的第一件事是确认jsp目录下有没有upload.jsp和filemanager.jsp这类文件——它们决定了图片上传和文件浏览能不能用。如果解压出来发现只有静态资源没有 JSP那说明拿到的是残缺包直接换源别浪费时间。2.2 部署到 Tomcat 的具体命令与参数假设你的 Tomcat 装在/opt/tomcatWeb 应用目录是/opt/tomcat/webapps/ROOT。把解压出来的ewebeditor整个文件夹复制进去# 进入解压目录确认 ewebeditor 文件夹存在 cd /tmp/ewebeditor014jsp ls -la # 复制到 Tomcat 的 Web 根目录下 cp -r ewebeditor /opt/tomcat/webapps/ROOT/ # 确认复制后的权限Tomcat 运行用户需要可读 chmod -R 755 /opt/tomcat/webapps/ROOT/ewebeditor复制完成后不需要重启 TomcatJSP 是即时编译的。直接在浏览器访问http://你的IP:8080/ewebeditor/ewebeditor.jsp如果能看到工具栏和空白编辑区说明部署成功。这里有个参数要注意ewebeditor.jsp通常接受一个id参数来区分同一页面里的多个编辑器实例比如ewebeditor.jsp?idcontent1。如果你在同一个表单里放两个编辑器必须传不同的id否则后一个会覆盖前一个的初始化状态。2.3 在业务 JSP 里嵌入编辑器的写法部署成功只是第一步真正要用起来得把它嵌进你自己的表单页面。常见做法是在 JSP 里用iframe引入编辑器入口然后通过 JavaScript 在提交前把编辑区内容同步到一个隐藏域。下面是一段可以直接抄的嵌入代码% page contentTypetext/html;charsetUTF-8 languagejava % html head title文章编辑/title /head body form actionsaveArticle.jsp methodpost onsubmitreturn syncContent() input typehidden namearticleContent idarticleContent / iframe srcewebeditor/ewebeditor.jsp?idmyEditor ideditorFrame frameborder0 stylewidth:100%;height:400px; /iframe input typesubmit value保存 / /form script typetext/javascript function syncContent() { // 通过 iframe 的 contentWindow 拿到编辑器内部的内容 var editorWin document.getElementById(editorFrame).contentWindow; // eWebEditor 通常暴露 getHTML() 或类似方法具体看入口页实现 var html editorWin.getEditorContent ? editorWin.getEditorContent() : editorWin.document.getElementById(editorBody).innerHTML; document.getElementById(articleContent).value html; return true; } /script /body /html这段代码的逻辑很直白表单提交时触发syncContent()它从iframe里把编辑器当前 HTML 取出来塞进隐藏域服务端saveArticle.jsp用request.getParameter(articleContent)就能拿到内容。参数说明idmyEditor是编辑器实例标识height:400px控制编辑区高度syncContent里的getEditorContent是常见命名如果你的包里方法名不同打开ewebeditor.jsp搜function关键字找实际暴露的函数名。这一步是整个集成里最容易翻车的地方——很多人忘了同步隐藏域结果提交上去是空字符串。3. 配置与定制让编辑器符合你的业务字段3.1 工具栏按钮的裁剪逻辑eWebEditor 默认工具栏塞了二十多个按钮但内部系统往往只需要加粗、斜体、列表、插链接这几个。裁剪按钮不是改 CSS 隐藏而是找到配置文件。常见做法是在ewebeditor目录下有一个config.js或者直接在ewebeditor.jsp顶部定义了一个toolbar数组。你打开入口页搜toolbar或btn关键字会看到类似这样的结构// 这是 eWebEditor 入口页里常见的工具栏定义片段 var toolbar [ [bold, italic, underline], [forecolor, backcolor], [insertorderedlist, insertunorderedlist], [link, unlink], [insertimage, inserttable] ];数组的每一项对应工具栏一行字符串是按钮标识。想删掉某个按钮就直接从数组里去掉对应字符串想调整顺序就挪位置。注意删按钮只是前端不显示对应的命令处理函数还在如果用户通过开发者工具手动调用仍然能执行。所以如果某个功能涉及安全风险比如插入脚本光删按钮不够还得在服务端做过滤。3.2 图片上传路径与大小限制图片上传是这类编辑器最常被问到的功能。eWebEditor 的上传逻辑一般放在upload.jsp里它接收iframe提交的文件流保存到服务器某个目录然后返回图片 URL 给编辑器插入。你需要改两个地方保存目录和大小限制。打开upload.jsp找到类似String savePath application.getRealPath(/) upload/的行改成你想要的物理路径。大小限制通常在FileUpload或MultipartRequest的初始化参数里常见写法是maxPostSize或maxFileSize单位是字节。比如限制 2MB 就设2097152。改完之后要确保目标目录对 Tomcat 运行用户可写否则上传会静默失败——编辑器不报错但图片就是插不进去这是血泪经验里排前三的坑。3.3 与后端字段的对接方式编辑器最终产出的是 HTML 字符串存库时字段类型选TEXT或CLOB别用VARCHAR(255)否则稍微长一点的文章就被截断。读取展示时如果你直接把这段 HTML 输出到 JSP 页面上必须用c:out value${article.content} escapeXmlfalse/或者out.print并自行做白名单过滤。这里有个选型理由要讲清楚eWebEditor 本身不做 XSS 过滤它信任用户输入。所以如果你的系统有普通用户投稿功能必须在服务端加一层 HTML 净化常见做法是用Jsoup.clean(html, Whitelist.basicWithImages())。如果只是内部管理员用风险相对可控但也不能完全裸奔。4. 避坑与排查五个真实翻车现场4.1 编辑器加载出来但按钮全是灰色现象页面能显示工具栏但所有按钮点不动编辑区也无法输入。原因通常是iframe的src路径不对导致内部脚本没加载完或者id参数重复导致初始化冲突。解决打开浏览器控制台看 Network 面板确认ewebeditor.jsp以及它引用的js文件是否全部 200。如果有 404检查复制目录时是否漏了js子目录。如果路径对但按钮仍灰检查同一页面是否有两个iframe用了相同id改成不同值。4.2 提交后内容为空字符串现象表单提交到服务端request.getParameter拿到null或空串。原因九成是隐藏域没同步或者同步函数在iframe还没加载完就执行了。解决把syncContent的调用时机从onsubmit改成编辑器onload之后绑定或者在syncContent里加一个if (!editorWin) return false;的保护。另一个可能是iframe跨域——如果你的业务页面和编辑器不在同一个域下contentWindow访问会被浏览器拦截这种情况只能把编辑器部署到同域。4.3 图片上传成功但编辑器里显示裂图现象upload.jsp返回了成功服务器目录里也有文件但编辑区插入的图片是破图。原因通常是返回的 URL 路径不对比如返回了物理路径D:\upload\1.jpg而不是 Web 路径/upload/1.jpg。解决打开upload.jsp找到拼接返回值的行确保返回的是相对于 Web 根目录的路径。另外检查 Tomcat 是否配置了该路径的静态资源映射如果上传目录在webapps之外需要在server.xml或context.xml里加Context docBase/data/upload path/upload/。4.4 中文内容保存后变成乱码现象编辑器里输入中文存库后读出来是????或æ–‡ç«。原因有两个层面JSP 页面没声明pageEncodingUTF-8或者upload.jsp读取参数时没设request.setCharacterEncoding(UTF-8)。解决在所有 JSP 顶部加% page contentTypetext/html;charsetUTF-8 pageEncodingUTF-8 %在upload.jsp和保存逻辑的第一行加request.setCharacterEncoding(UTF-8)。数据库连接串也要带useUnicodetruecharacterEncodingUTF-8。4.5 部署到 Linux 后上传目录权限报错现象Windows 下测试一切正常扔到 Linux 服务器后上传图片报 500日志里是Permission denied。原因Tomcat 以tomcat用户运行而上传目录属于root且没有写权限。解决chown -R tomcat:tomcat /opt/tomcat/webapps/ROOT/upload或者把上传目录设到/tmp下并确保tomcat用户可写。注意别用chmod 777那是给自己挖坑。5. 进阶技巧用 Jsoup 给 eWebEditor 的输出加一道过滤eWebEditor 本身不处理 XSS这是它作为老组件的硬伤。我一般会在服务端保存之前加一道 Jsoup 白名单过滤既保留富文本的排版能力又把脚本、事件属性、iframe这些危险标签干掉。下面是一段可以直接放进saveArticle.jsp的过滤代码// 引入 Jsoup 依赖后使用常见做法是放在保存逻辑的最前面 import org.jsoup.Jsoup; import org.jsoup.safety.Whitelist; // 从请求里拿到编辑器提交的原始 HTML String rawHtml request.getParameter(articleContent); // 自定义白名单允许常见排版标签和图片不允许 script、iframe、on* 事件 Whitelist whitelist Whitelist.basicWithImages() .addTags(table, thead, tbody, tr, td, th, span, div) .addAttributes(table, border, cellpadding, cellspacing) .addAttributes(span, style) .addAttributes(div, style) .addAttributes(img, src, alt, width, height); // 执行过滤第二个参数控制是否输出可读格式 String safeHtml Jsoup.clean(rawHtml, , whitelist, new org.jsoup.nodes.Document.OutputSettings().prettyPrint(false)); // 存库时用 safeHtml而不是 rawHtml这段代码的逻辑是Whitelist.basicWithImages()已经放行了b、i、u、a、img等基础标签我再手动加上表格和div、span因为 eWebEditor 的排版经常用到它们。addAttributes是给特定标签放行属性比如img的src和width。prettyPrint(false)是为了避免 Jsoup 在输出时插入多余换行影响编辑器回显时的格式。参数说明Whitelist的链式调用顺序不影响结果但addTags必须在clean之前完成。过滤之后即使有人在编辑器里通过开发者工具塞进scriptalert(1)/script存到库里的也只会是纯文本。验证方法很简单在编辑器里切到源码模式手动输入scriptalert(xss)/script和img srcx onerroralert(1)提交后查看数据库字段。如果script标签消失、onerror属性被剥离说明过滤生效。再输入一个正常的表格和加粗文本确认排版没被误杀。这个习惯我坚持了很多年——从那以后我每次集成任何富文本编辑器不管它宣称多安全都强制走一遍 Jsoup 过滤再入库。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站