Tomcat: использование символа двойной кавычки в имени параметра контекста - PullRequest
0 голосов
/ 02 июня 2019

Я не могу найти правильный синтаксис для использования символа двойной кавычки в имени параметра контекста, который я хочу объявить в файле дескриптора развертывания.

Вот определение параметра в 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 Status 500 - Внутренняя ошибка сервераh1 {font-family: Tahoma, Arial, без засечек; цвет: белый; цвет фона: # 525D76; размер шрифта: 22px;} h2 {семейство шрифтов: Tahoma, Arial, без засечек; цвет: белый; цвет фона: # 525D76; шрифт-размер: 16px;} h3 {семейство шрифтов: Tahoma, Arial, без засечек; цвет: белый; цвет фона: # 525D76; размер шрифта: 14px;} body {семейство шрифтов: Tahoma, Arial, без засечек; цвет: черный; цвет фона: белый;} b {font-family: Tahoma, Arial, sans-serif; цвет: белый; цвет фона: # 525D76;} p {font-family: Tahoma, Arial, sans-с засечками; фон: белый; цвет: черный; размер шрифта: 12px;} a {цвет: черный;} a.name {цвет: черный;} .line {высота: 1px; цвет фона: # 525D76; рамка: нет;}

HTTP Status 500 - Внутренняя ошибка сервера

Тип Отчет об исключении

Сообщение javax.servlet.ServletException: javax.management.MalformedObjectNameException: Неверный символ '"'в значении часть свойства

Описание Сервер обнаружил непредвиденное состояние, которое не позволило ему выполнить запрос.

Исключение

org.apache.jasper.JasperException:
javax.servlet.ServletException:
javax.management.MalformedObjectNameException: Invalid character
&#39;"&#39; in value part of property
        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: Invalid character
&#39;"&#39; in value part of property
        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:
  Invalid character &#39;"&#39; in value part of property
          java.management&#47;javax.management.ObjectName.construct(ObjectName.java:621)
          java.management&#47;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)</p>
</blockquote>

<p>I have tried changing <a href="https://tomcat.apache.org/tomcat-8.0-doc/jasper-howto.html" rel="nofollow noreferrer">JASPER strictQuoteEscaping</a> value and different syntaxes without effect. I am running Tomcat 8.5.40 with Java 9 u181</p>

<p>By the way calling this JMX directly is working well :</p>

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

Я что-то упускаю из виду?

1 Ответ

1 голос
/ 03 июня 2019

Вам не нужно экранировать символы ", если они находятся между тегами. В основном строка между тегами <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: ключевые свойства не могут быть пустым Правильно ли вы определили предложение на Tomcat с JMX? настроен и включен?

key properties - это пары ключ-значение после двоеточия. В вашем примере у вас есть две клавиши:

  • Тип = GlobalRequestProcessor
  • имя = "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);
        }
    }
%>
...