【问题标题】:Tomcat generating random space in jspTomcat在jsp中生成随机空间
【发布时间】: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");

【问题讨论】:

    标签: java jsp tomcat


    【解决方案1】:

    它在我看来就像你声称在 JSP 中的功能

    function addPrerequisiteRow(...
    

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

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

    【讨论】:

    • 这不太对,我不明白的问题是 CKEDITOR.inline('r_description');在 jsp 代码和编译的 java 代码中不包含空格,但是当页面提供给访问者时,内联中间有一个空格。不是每个访问者都会收到相同的错误,但某个访问者会重复收到相同的中断空间,例如在 inline 中间。
    猜你喜欢
    • 1970-01-01
    • 2013-03-15
    • 2016-10-17
    • 2011-11-25
    • 2022-12-04
    • 2019-10-28
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多