【发布时间】:2021-08-13 21:06:44
【问题描述】:
我在工作中维护一个内部应用程序,但由于未知来源的空白,我在 jsp 页面的 javascript 函数中遇到了随机中断问题。该应用程序在 Tomcat V8.5.30 和 JRE 1.8.0_191 上运行。
jsp 页面看起来正确,Tomcat 的编译也看起来正确。当 Tomcat 将页面提供给用户时,不是来自代码的空格会导致脚本块无法加载或 HTML 标记中断(例如:“”、“”或“”)。这个问题似乎一直在发生,但空格似乎与输出的大小有关,输出长度的变化似乎改变了空格(出现之间似乎大约 7600 个字符)并随机破坏关键标签的脚本块,一些其他时候是 css 或表格格式。
我尝试使用 Wireshark 检查响应,怀疑在固定帧长度的传输中存在一些错误,但我无法通过拼接传输的帧来发现任何错误。 我搜索了空格、随机、tomcat 的排列,但我只能找到 Tomcat 的 trimWhitespace 指令(Web.XML 和 jsp 中特定的页面)和 TrimWhiteSpace 过滤器(https://balusc.omnifaces.org/2007/12/whitespacefilter.html)。
我尝试了过滤器,它实现了它声称的效果,但这与我面临的问题不符。
这些是最新的阻止用户:
编辑:添加错误截图 Screenshot of error
proreleaseedit.jsp?doaction=createRelease:673 Uncaught SyntaxError: Invalid or unexpected token
function addPrerequisiteRow(releaseId, releaseCode, releaseTitle, releaseDate, releaseVersion, releaseEdition){
var rowId = generatePrqNextRowId();
var tbody = document.getElementById("prqTable").getElementsByTagName("TBODY")[0];
var row = document.createElement("TR");
row.id = "prqrow_" + rowId;
// delete
var td1 = document.createElement("TD");
td1.title = "Delete";
td1.className = "ColCtr";
td1.innerHTML = "<input type=\"c
heckbox\" name=\"prqcheckbox_" + rowId + "\" id=\"prqcheckbox_" + rowId + "\" value=\"true\" onClick=\"selectRow(this)\" >"
+"<input type=\"hidden\" name=\"prq_id_" + rowId + "\" id=\"prq_id_" + rowId + "\" value=\"" + releaseId + "\">"
+"<input type=\"hidden\" name=\"prq_idx_" + rowId + "\" id=\"prq_idx_" + rowId + "\" value=\"" + rowId + "\">";
// move
proreleaseedit.jsp?doaction=createRelease:1121 Uncaught ReferenceError: nline is not defined
</body>
<script>
CKEDITOR.disableAutoInline = true;
CKEDITOR.inline('r_comment');
CKEDITOR.i
nline('r_description');
</script>
如果我尝试在表单末尾运行提交功能,所有这些错误都会阻止该功能被注册: proreleaseedit.jsp?doaction=createRelease:1078 Uncaught ReferenceError: doSave is not defined
我发现我可以通过在脚本块中包含每个函数来避免一些错误,但我知道强烈建议不要这样做。
这是jsp文件中写的代码:
function addPrerequisiteRow(releaseId, releaseCode, releaseTitle, releaseDate, releaseVersion, releaseEdition){
var rowId = generatePrqNextRowId();
var tbody = document.getElementById("prqTable").getElementsByTagName("TBODY")[0];
var row = document.createElement("TR");
row.id = "prqrow_" + rowId;
// delete
var td1 = document.createElement("TD");
td1.title = "Delete";
td1.className = "ColCtr";
td1.innerHTML = "<input type=\"checkbox\" name=\"prqcheckbox_" + rowId + "\" id=\"prqcheckbox_" + rowId + "\" value=\"true\" onClick=\"selectRow(this)\" >"
+"<input type=\"hidden\" name=\"<%= ReleaseWebImpl.PRE_REQUISITE_ID_F%>" + rowId + "\" id=\"<%= ReleaseWebImpl.PRE_REQUISITE_ID_F%>" + rowId + "\" value=\"" + releaseId + "\">"
+"<input type=\"hidden\" name=\"<%= ReleaseWebImpl.PRE_REQUISITE_IDX_F%>" + rowId + "\" id=\"<%= ReleaseWebImpl.PRE_REQUISITE_IDX_F%>" + rowId + "\" value=\"" + rowId + "\">";
// move
var td2 = document.createElement("TD");
td2.title = "Move";
td2.className = "ColCtr";
td2.innerHTML = "<a href=\"javascript:moveUpRow('" + row.id + "')\"><span class=LogoPrecSuiv title=\"Move Upd\">5</span></a>"
+"<a href=\"javascript:moveDownRow('" + row.id + "')\"><span class=LogoPrecSuiv title=\"Move Down\">6</span></a>";
// code
var td3 = document.createElement("TD");
td3.className = "ColGch";
td3.innerHTML = releaseCode;
// title
var td4 = document.createElement("TD");
td4.className = "ColGch";
td4.innerHTML = releaseTitle;
// date
var td5 = document.createElement("TD");
td5.className = "ColGch";
td5.innerHTML = releaseDate;
// version
var td6 = document.createElement("TD");
td6.className = "ColGch";
td6.innerHTML = releaseVersion;
// edition
var td7 = document.createElement("TD");
td7.className = "ColGch";
td7.innerHTML = releaseEdition;
row.appendChild(td1);
row.appendChild(td2);
row.appendChild(td3);
row.appendChild(td4);
row.appendChild(td5);
row.appendChild(td6);
row.appendChild(td7);
tbody.appendChild(row);
//
};
和
</body>
<script>
CKEDITOR.disableAutoInline = true;
CKEDITOR.inline('<%= ReleaseWebImpl.REL_COMMENT_F%>');
CKEDITOR.inline('<%= ReleaseWebImpl.REL_DESCRIPTION_F%>');
<%
list = release.getDetails().iterator();
itemIndex = 0;
while (list.hasNext()) {
ReleaseDetail item = (ReleaseDetail)list.next();
itemIndex++;
%>
CKEDITOR.inline('<%= ReleaseWebImpl.DET_TITLE_F%><%= itemIndex%>');
CKEDITOR.inline('<%= ReleaseWebImpl.DET_DESCRIPTION_F%><%= itemIndex%>');
<%}//end of detailList %>
</script>
这就是jsp编译的内容:
out.write("\tfunction addPrerequisiteRow(releaseId, releaseCode, releaseTitle, releaseDate, releaseVersion, releaseEdition){\r\n");
out.write("\t\tvar rowId = generatePrqNextRowId();\r\n");
out.write("\t\tvar tbody = document.getElementById(\"prqTable\").getElementsByTagName(\"TBODY\")[0];\r\n");
out.write("\t\tvar row = document.createElement(\"TR\");\r\n");
out.write("\t\trow.id = \"prqrow_\" + rowId;\r\n");
out.write("\r\n");
out.write("\t\t// delete\r\n");
out.write("\t\tvar td1 = document.createElement(\"TD\");\r\n");
out.write("\t\ttd1.title = \"Delete\";\r\n");
out.write("\t\ttd1.className = \"ColCtr\";\r\n");
out.write("\t\ttd1.innerHTML = \"<input type=\\\"checkbox\\\" name=\\\"prqcheckbox_\" + rowId + \"\\\" id=\\\"prqcheckbox_\" + rowId + \"\\\" value=\\\"true\\\" onClick=\\\"selectRow(this)\\\" >\"\r\n");
out.write("\t\t\t\t\t+\"<input type=\\\"hidden\\\" name=\\\"");
out.print( ReleaseWebImpl.PRE_REQUISITE_ID_F);
out.write("\" + rowId + \"\\\" id=\\\"");
out.print( ReleaseWebImpl.PRE_REQUISITE_ID_F);
out.write("\" + rowId + \"\\\" value=\\\"\" + releaseId + \"\\\">\"\r\n");
out.write("\t\t\t\t\t+\"<input type=\\\"hidden\\\" name=\\\"");
out.print( ReleaseWebImpl.PRE_REQUISITE_IDX_F);
out.write("\" + rowId + \"\\\" id=\\\"");
out.print( ReleaseWebImpl.PRE_REQUISITE_IDX_F);
out.write("\" + rowId + \"\\\" value=\\\"\" + rowId + \"\\\">\";\t\t\t\t\t\r\n");
out.write("\r\n");
和
out.write("\t<script>\r\n");
out.write("\t\tCKEDITOR.disableAutoInline = true;\r\n");
out.write("\t\tCKEDITOR.inline('");
out.print( ReleaseWebImpl.REL_COMMENT_F);
out.write("');\r\n");
out.write("\t\tCKEDITOR.inline('");
out.print( ReleaseWebImpl.REL_DESCRIPTION_F);
out.write("');\r\n");
out.write("\t");
list = release.getDetails().iterator();
itemIndex = 0;
while (list.hasNext()) {
ReleaseDetail item = (ReleaseDetail)list.next();
itemIndex++;
out.write("\r\n");
out.write("\t\t\tCKEDITOR.inline('");
out.print( ReleaseWebImpl.DET_TITLE_F);
out.print( itemIndex);
out.write("');\r\n");
out.write("\t\t\tCKEDITOR.inline('");
out.print( ReleaseWebImpl.DET_DESCRIPTION_F);
out.print( itemIndex);
out.write("');\r\n");
out.write("\t");
}//end of detailList
out.write("\r\n");
out.write("\t</script>\r\n");
【问题讨论】: