0

我没有找到在我想在部署描述符文件中声明的上下文参数名称中使用双引号字符的正确语法。

这是 web.xml 中的参数定义:

<context-param>
<param-name>Catalina:type=GlobalRequestProcessor,name=\"http-nio-8080\"</param-name>
<param-value>requestCount</param-value>
</context-param>

以下 JSP 代码:

<%@ page import="java.util.*,javax.management.*"%>
JMX testing
<%
  Enumeration ipn = application.getInitParameterNames();

  String ipnName = "";
  while(ipn.hasMoreElements()) {
    ipnName = (String)ipn.nextElement();

    ObjectName on = new ObjectName( ipnName );
  }
%>

触发此异常:

HTTP 状态 500 – 内部服务器错误h1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} h2 {font-family:Tahoma,Arial,sans- serif;color:white;background-color:#525D76;font-size:16px;} h3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px ;} body {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} b {font-family:Tahoma,Arial,sans-serif;color:white;background-color:# 525D76;} p {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;} a {color:black;} a.name {color:black;} .line {高度:1px;背景颜色:#525D76;边框:无;}

HTTP 状态 500 – 内部服务器错误

类型异常报告

消息 javax.servlet.ServletException: javax.management.MalformedObjectNameException: Invalid character '"' in value part of property

说明 服务器遇到了阻止它完成请求的意外情况。

例外

org.apache.jasper.JasperException:
javax.servlet.ServletException:
javax.management.MalformedObjectNameException:无效字符
'"' 在属性的值部分
        org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:598)
        org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:499)
        org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386)
        org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
        org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

根本原因

javax.servlet.ServletException:
javax.management.MalformedObjectNameException:无效字符
'"' 在属性的值部分
        org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:909)
        org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:838)
        org.apache.jsp.ko_jsp._jspService(ko_jsp.java:138)
        org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
        org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:476)
        org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386)
        org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
        org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

根本原因

javax.management.MalformedObjectNameException:
  属性值部分中的无效字符 '"'
          java.management/javax.management.ObjectName.construct(ObjectName.java:621)
          java.management/javax.management.ObjectName.<init>(ObjectName.java:1406)
          org.apache.jsp.ko_jsp._jspService(ko_jsp.java:122)
          org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
          javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
          org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:476)
          org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386)
          org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330)
          javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
          org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

我尝试更改JASPER strictQuoteEscaping值和不同的语法,但没有效果。我正在使用 Java 9 u181 运行 Tomcat 8.5.40

顺便说一下,直接调用这个 JMX 效果很好:

<%@ page import="java.util.*,javax.management.*"%> JMX testing <% ObjectName on = new ObjectName("Catalina:type=GlobalRequestProcessor,name=\"http-nio-8080\""); %>

我错过了什么明显的东西吗?

4

1 回答 1

1

"如果字符位于标签之间,则不必转义字符。<param-name>基本上是标签 之间的字符串:

<param-name>Catalina:type=GlobalRequestProcessor,name=\"http-nio-8080\"</param-name>

等于字符串(注意三个反斜杠):

Catalina:type=GlobalRequestProcessor,name=\\\"http-nio-8080\\\"

因此,当在 web.xml 中指定对象名称时,就像在纸上写下一样(即不带反斜杠):

<param-name>Catalina:type=GlobalRequestProcessor,name="http-nio-8080"</param-name>

更新(关于评论中的第二个问题)

这不起作用,这次异常是 org.apache.jasper.JasperException: javax.servlet.ServletException: javax.management.MalformedObjectNameException: Key properties cannot be empty 你在正确配置和启用 JMX 的 Tomcat 上尝试过你的建议吗?

是冒号后面的key properties键值对。在您的示例中,您有两个键:

  • 类型=全局请求处理器
  • 名称="http-nio-8080"

所以唯一的解释是这个异常是由于以下原因引起的:

  • 使用另一个构造函数(不太可能,问题中的代码使用正确的)
  • 您的上下文参数比显示的要多,其中一些在:. 请注意,您正在遍历所有上下文参数,其中一些可能不是对象名称:while(ipn.hasMoreElements())

您只需打印其名称即可找到导致问题的上下文参数:

<%
    Enumeration ipn = application.getInitParameterNames();

    String ipnName;
    while (ipn.hasMoreElements()) {
        ipnName = (String) ipn.nextElement();
        try {
            ObjectName on = new ObjectName(ipnName);
            out.println("<br>Good param: " + ipnName);
        }catch (Exception e){
            out.println("<br>Bad param: " + ipnName);
        }
    }
%>
于 2019-06-03T05:24:23.583 回答