jsp - Tomcat : using double-quote character in a context parameter name

标签 jsp tomcat deployment-descriptor

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

这是 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 – Internal Server Errorh1 {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 {height:1px;background-color:#525D76;border:none;}

HTTP Status 500 – Internal Server Error

Type Exception Report

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

Description The server encountered an unexpected condition that prevented it from fulfilling the request.

Exception

org.apache.jasper.JasperException:
javax.servlet.ServletException:
javax.management.MalformedObjectNameException: Invalid character
'"' 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)

Root Cause

javax.servlet.ServletException:
javax.management.MalformedObjectNameException: Invalid character
'"' 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)

Root Cause

javax.management.MalformedObjectNameException:
  Invalid character '"' in value part of property
          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\""); %>

我是否漏掉了任何明显的东西?

最佳答案

您不必转义 "字符,如果它在标签之间。基本上是 <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>

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

This doesn't work, this time the exception is org.apache.jasper.JasperException: javax.servlet.ServletException: javax.management.MalformedObjectNameException: Key properties cannot be empty Did you try your suggestion on a Tomcat with JMX correctly configured and enabled ?

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

  • type=GlobalRequestProcessor
  • name="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);
        }
    }
%>

关于jsp - Tomcat : using double-quote character in a context parameter name,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56415447/

相关文章:

java - JSPServlet : URI remains that of controller servlet

java - 在 eclipse 中运行 tomcat 时,未从 WEB-INF/lib 中的 jar 文件加载 spring web 应用程序上下文

mysql - Apache 服务器和 tomcat 服务器

Java 和 Tomcat - CodeCache 已满。编译器已被禁用

servlets - 在哪里可以找到部署描述符(web.xml)的完整文档

ajax - Jquery Ajax 调用 servlet

java - 如何临时更改 System.out 属性

jsp - 如何使 JSTL 1.2.5 在 Tomcat 7 上运行

java - <context-param> 和 <init-param> 之间的区别