gpt4 book ai didi

java - 设置可信包(ActiveMQ)

转载 作者:行者123 更新时间:2023-12-02 01:00:15 24 4
gpt4 key购买 nike

我正在尝试发送接收 ActiveMQ 消息。但我看到消息返回时包含此消息。

JMSException in onMessage(): javax.jms.JMSException: Failed to build body from content. Serializable class not available to broker. Reason: java.lang.ClassNotFoundException: Forbidden class com.logicalprovisioning.common.gtc.shared.GTCMessage! This class is not trusted to be serialized as ObjectMessage payload. Please take a look at http://activemq.apache.org/objectmessage.html for more information on how to configure trusted classes.

所以我阅读了消息中的链接。我尝试按照说明进行操作。尽管我必须说它在配置的位置上写得不太好。

所以我所做的是:1.我将bin文件夹中的activemq.bat文件中的ACTIVEMQ_OPTS行编辑为

if "%ACTIVEMQ_OPTS%" == "" set ACTIVEMQ_OPTS=-Xms1G -Xmx1G -Djava.util.logging.config.file=logging.properties -Djava.security.auth.login.config="%ACTIVEMQ_CONF%\login.config" -Dorg.apache.activemq.SERIALIZABLE_PACKAGES=com.logicalprovisioning.common.gtc.shared.GTCMessage

没有成功。

  • 我也在 win64 文件夹的 activemq.bat 中添加了上面的行。没成功。

  • 我修改了订阅者对象的创建以添加受信任的包。喜欢:

    String providerEndpoints = "tcp://" + host + ":" + port + "?wireFormat.maxInactivityDuration=7200000";

    // Set the trusted packages/classes to move back and forth on the ActiveMQ JMS service.
    ArrayList<String> trustedClasses = new ArrayList<String>();

    trustedClasses.add("com.logicalprovisioning.common.gtc.shared.GTCMessage");

    // Obtain the factory
    ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory();

    activeMQConnectionFactory.setBrokerURL(providerEndpoints);

    // Add the trusted packages/classes to the ActiveMQ consumer.
    activeMQConnectionFactory.setTrustedPackages(trustedClasses);

    //Create the connection
    setConnection(activeMQConnectionFactory.createQueueConnection());
    getConnection().setClientID(this.getName());

    // Make a session
    setSession(getConnection().createQueueSession(false, Session.AUTO_ACKNOWLEDGE));

    getSession().createQueue(jmsDestination);

    // Create the destination
    Destination destination = getSession().createQueue(jmsDestination);

    String selector = "JMSCorrelationID = '" + getActionRequest().getOriginId() + "_" + getActionRequest().getRequestId() + "'" ;

    setConsumer(getSession().createConsumer(destination, selector));
    getConsumer().setMessageListener(new DefaultMessageListener(this));

    // Start ...
    gtcMessages = new GTCMessageQueue<GTCMessage>(); // We'll need a message store now
    getConnection().start();
  • 为了更好地衡量,我也在我的制作人中添加了类似的内容:

        Context initialContext = new InitialContext();
    Context environmentContext = (Context) initialContext.lookup("java:comp/env");

    String queueConnectionFactoryNameLookup = PalInit.getProperty("jms.queue.connection.factory");

    // Set the trusted packages/classes to move back and forth on the ActiveMQ JMS service.
    ArrayList<String> trustedClasses = new ArrayList<String>();

    trustedClasses.add("com.logicalprovisioning.common.gtc.shared.GTCMessage");

    ActiveMQConnectionFactory activeMQConnectionFactory = (ActiveMQConnectionFactory) environmentContext.lookup(queueConnectionFactoryNameLookup);

    activeMQConnectionFactory.setTrustedPackages(trustedClasses);
    // Create connection
    QueueConnection queueConnection = activeMQConnectionFactory.createQueueConnection();
    queueConnection.start();

    // Create session and producer
    setSession(queueConnection.createSession(false, Session.AUTO_ACKNOWLEDGE));

    String queueName = PalInit.getProperty("jms.destination");
    Queue jmsQueue = getSession().createQueue(queueName);

    setProducer(getSession().createProducer(jmsQueue));
    setQueueConnection(queueConnection);

    // Set Message "Time to Live" to the request timeout plus 10 minutes
    getProducer().setTimeToLive(getTimeout() + (10 * 60 * 1000L));

    但似乎没有任何作用。我的 Tomcat 的 lib 文件夹中有 ActiveMQ-All jar,GTCMessage 类所在的 jar 也是如此。谁能告诉我我做错了什么吗?是缺少类的问题还是我的配置错误?任何帮助,将不胜感激。谢谢!

    该应用程序在 Tomcat 9、JAVA 1.8 和 Active MQ 5.15.11 上运行。

    最佳答案

    我认为您的问题是您正在设置特定的名称,而不是该类的The code查看包名称,而不是类名称。试试这个:

    // Set the trusted packages to move back and forth on the ActiveMQ JMS service.
    ArrayList<String> trustedPackages = new ArrayList<String>();
    trustedPackages.add("com.logicalprovisioning.common.gtc.shared");
    ActiveMQConnectionFactory activeMQConnectionFactory = (ActiveMQConnectionFactory) environmentContext.lookup(queueConnectionFactoryNameLookup);
    activeMQConnectionFactory.setTrustedPackages(trustedPackages);

    我认为您不需要在代理本身上进行设置。

    除此之外,我强烈建议您不要使用 JMS ObjectMessage。它们依靠 Java 序列化来编码和解码其对象负载。此过程通常被认为是不安全的,因为恶意负载可以利用主机系统。 Lots of CVEs为此创建了这就是为什么大多数 JMS 提供程序强制用户显式地将可以使用 ObjectMessage 消息交换的包列入白名单。

    使用 JMS ObjectMessage 还存在许多与安全性无关的其他问题,您应该 read about 。本文对如何替换 ObjectMessage 提供了一个很好的建议 - 定义有效负载的数据表示形式(JSON、protobuf、XML)并使用 TextMessageBytesMessage 携带它。

    关于java - 设置可信包(ActiveMQ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60753035/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com