Tomcat在jsp中生成随机空间



我在工作中维护一个内部应用程序,由于未知来源的空白,我在jsp页面的javascript函数中面临随机中断问题。该应用程序在Tomcat V8.5.30和JRE 1.8.0_191上运行。

jsp页面看起来是正确的,Tomcat的编译看起来也是正确的。当Tomcat将页面提供给用户时,非代码中的空白会导致脚本块无法加载或HTML标记中断(例如:<input-type='hidden'>、<或<(。这个问题似乎一直都在发生,但空格似乎与输出的大小有关,输出长度的变化似乎会移动空格(两次出现之间大约有7600个字符(,并随机打断键标签的脚本块,有时是css或表格式。

我试图用Wireshark检查响应,怀疑在固定帧长度的传输中存在一些故障,但通过缝合传输的帧,我找不到任何错误。我搜索了空白、随机、tomcat的排列,但我能找到的只有tomcat的trimWhitespace指令(Web.XML和jsp中特定于页面的指令(和trimWhitespace Filter(https://balusc.omnifaces.org/2007/12/whitespacefilter.html)。

我试了一下过滤器,它做到了它所声称的,但这与我面临的问题不符。

这些是最新的阻止用户:

编辑:添加错误的屏幕截图错误屏幕截图

proreleaseedit.jsp?doaction=createRelease:673未捕获语法错误:无效或意外的令牌

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未捕获引用错误:未定义nline

</body>
<script>
CKEDITOR.disableAutoInline = true;
CKEDITOR.inline('r_comment');
CKEDITOR.i
nline('r_description');
</script>

如果我试图在表单末尾运行提交函数,所有这些错误都会阻止该函数的注册:proreleaseedit.jsp?doaction=createRelease:1078未捕获引用错误:doSave未定义

我发现我可以通过包围脚本块中的每个函数来避免一些错误,但我知道强烈建议不要这样做。

这是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){rn");
out.write("ttvar rowId = generatePrqNextRowId();rn");
out.write("ttvar tbody = document.getElementById("prqTable").getElementsByTagName("TBODY")[0];rn");
out.write("ttvar row = document.createElement("TR");rn");
out.write("ttrow.id = "prqrow_" + rowId;rn");
out.write("rn");
out.write("tt// deletern");
out.write("ttvar td1 = document.createElement("TD");rn");
out.write("tttd1.title = "Delete";rn");
out.write("tttd1.className = "ColCtr";rn");
out.write("tttd1.innerHTML = "<input type=\"checkbox\" name=\"prqcheckbox_" + rowId + "\" id=\"prqcheckbox_" + rowId + "\" value=\"true\" onClick=\"selectRow(this)\" >"rn");
out.write("ttttt+"<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 + "\">"rn");
out.write("ttttt+"<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 + "\">";tttttrn");
out.write("rn");

out.write("t<script>rn");
out.write("ttCKEDITOR.disableAutoInline = true;rn");
out.write("ttCKEDITOR.inline('");
out.print( ReleaseWebImpl.REL_COMMENT_F);
out.write("');rn");
out.write("ttCKEDITOR.inline('");
out.print( ReleaseWebImpl.REL_DESCRIPTION_F);
out.write("');rn");
out.write("t");
list = release.getDetails().iterator();
itemIndex = 0;
while (list.hasNext()) {
ReleaseDetail item = (ReleaseDetail)list.next();
itemIndex++;

out.write("rn");
out.write("tttCKEDITOR.inline('");
out.print( ReleaseWebImpl.DET_TITLE_F);
out.print( itemIndex);
out.write("');rn");
out.write("tttCKEDITOR.inline('");
out.print( ReleaseWebImpl.DET_DESCRIPTION_F);
out.print( itemIndex);
out.write("');rn");
out.write("t");
}//end of detailList 
out.write("rn");
out.write("t</script>rn");

在我看来,它就像您声称在JSP 中的函数

function addPrerequisiteRow(...

不是在服务器端进行解释,而是逐字逐句地发送给客户端。如果这是要在浏览器中执行的Javascript代码,那么它没有错。但是要注意,您在这些Javascript行的开头看到的空白实际上来自您的JSP。毕竟,您使用了whitespace来格式化代码,而这只是被保留了下来。

因此,如果您不喜欢空白,请将其从JSP中删除,它就会消失。

最新更新