SpringBoot + ActiveMQ - 如何设置可信包?

Posted

技术标签:

【中文标题】SpringBoot + ActiveMQ - 如何设置可信包?【英文标题】:SpringBoot + ActiveMQ - How to set trusted packages? 【发布时间】:2016-08-05 18:58:31 【问题描述】:

我正在创建两个使用 JMS 进行通信的 springboot 服务器和客户端应用程序,并且对于 activemq 的发布 5.12.1 一切正常,但是一旦我更新到 5.12.3 版本,我就会得到以下信息错误:

org.springframework.jms.support.converter.MessageConversionException: Could not convert JMS message; nested exception is javax.jms.JMSException: Failed to build body from content. Serializable class not available to broker. Reason: java.lang.ClassNotFoundException: Forbidden class MyClass! 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.

我继续提供的the URL,我发现我的问题与 ActiveMQ 的5.12.2 版本中实现的新安全性有关,我知道我可以通过定义受信任的包来解决它,但是我不知道在我的 SpringBoot 项目中将这样的配置放在哪里。

我在客户端和服务器中对 JMS 队列的唯一参考是在 application.properties 中设置它的 URI,并使用 @EnableJms 在我的“主”类上启用 JMS,这是我在单独的配置经纪人:

@Configuration
@ConfigurationProperties(prefix = "activemq")
public class BrokerConfiguration 

    /**
     * Defaults to TCP 10000
     */
    private String connectorURI = "tcp://0.0.0.0:10000";
    private String kahaDBDataDir = "../../data/activemq";

    public String getConnectorURI() 
        return connectorURI;
    

    public void setConnectorURI(String connectorURI) 
        this.connectorURI = connectorURI;
    

    public String getKahaDBDataDir() 
        return kahaDBDataDir;
    

    public void setKahaDBDataDir(String kahaDBDataDir) 
        this.kahaDBDataDir = kahaDBDataDir;
    

    @Bean(initMethod = "start", destroyMethod = "stop")
    public BrokerService broker() throws Exception 
        KahaDBPersistenceAdapter persistenceAdapter = new KahaDBPersistenceAdapter();
        persistenceAdapter.setDirectory(new File(kahaDBDataDir));

        final BrokerService broker = new BrokerService();
        broker.addConnector(getConnectorURI());
        broker.setPersistent(true);
        broker.setPersistenceAdapter(persistenceAdapter);
        broker.setShutdownHooks(Collections.<Runnable> singletonList(new SpringContextHook()));
        broker.setUseJmx(false);

        final ManagementContext managementContext = new ManagementContext();
        managementContext.setCreateConnector(true);
        broker.setManagementContext(managementContext);

        return broker;
    

所以我想知道我应该在哪里指定受信任的包。

谢谢:)

【问题讨论】:

【参考方案1】:

如果还有人在寻找答案,下面的 sn-p 对我有用

@Bean
public ActiveMQConnectionFactory connectionFactory() 
    ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
    connectionFactory.setBrokerURL(BROKER_URL);
    connectionFactory.setPassword(BROKER_USERNAME);
    connectionFactory.setUserName(BROKER_PASSWORD);
    connectionFactory.setTrustAllPackages(true); // all packages are considered as trusted 
    //connectionFactory.setTrustedPackages(Arrays.asList("com.my.package")); // selected packages
    return connectionFactory;

【讨论】:

【参考方案2】:

我正在设置类似于下面的 Java_opts 并传递给 java 命令及其为我工作。

JAVA_OPTS=-Xmx256M -Xms16M -Dorg.apache.activemq.SERIALIZABLE_PACKAGES=*
java $JAVA_OPTS -Dapp.config.location=/data/config -jar <your_jar>.jar --spring.config.location=file:/data/config/<your config file path>.yml

【讨论】:

【参考方案3】:

方法:public void setTrustedPackages(List&lt;String&gt; trustedPackages)

描述:添加所有用于发送和接收Message对象的包。

代码:connectionFactory.setTrustedPackages(Arrays.asList("org.api","java.util"))

实现代码:

private static final String DEFAULT_BROKER_URL = "tcp://localhost:61616";

private static final String RESPONSE_QUEUE = "api-response";

@Bean
public ActiveMQConnectionFactory connectionFactory()
    ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
    connectionFactory.setBrokerURL(DEFAULT_BROKER_URL);
    connectionFactory.setTrustedPackages(Arrays.asList("org.api","java.util"));
    return connectionFactory;


@Bean
public JmsTemplate jmsTemplate()
    JmsTemplate template = new JmsTemplate();
    template.setConnectionFactory(connectionFactory());
    template.setDefaultDestinationName(RESPONSE_QUEUE);
    return template;

【讨论】:

【参考方案4】:

是的,我在新版本中找到了它的配置

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.0.RELEASE</version>
</parent>

spring:
profiles:
    active: @profileActive@
cache:
  ehcache:
    config: ehcache.xml
activemq:
  packages:
    trusted: com.stylrplus.api.model

【讨论】:

【参考方案5】:

您可以在application.properties 中设置以下 Spring Boot 属性之一来设置受信任的包。

spring.activemq.packages.trust-all=true

spring.activemq.packages.trusted=&lt;package1&gt;,&lt;package2&gt;,&lt;package3&gt;

【讨论】:

我认为它只在较新的 Spring-Boot 版本中可用?【参考方案6】:

添加以下 bean:

@Bean
public ActiveMQConnectionFactory activeMQConnectionFactory() 
    ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("your broker URL");
    factory.setTrustedPackages(Arrays.asList("com.my.package"));
    return factory;

下一个版本添加了通过配置属性执行此操作的功能: https://github.com/spring-projects/spring-boot/issues/5631

【讨论】:

谢谢 :) 我只需要编辑你的答案,因为 setTrustedPackage 只接受 List&lt;String&gt; 作为参数,而不是 String 噢!对不起,当然可以。 ActiveMQConnectionFactory 也有一个 setTrustAllPackages(boolean) 方法,所以你不必单独设置它们。 我尝试了相同的解决方案,但它不适合我 setTrustedPackages 和 setTrustedPackage 在 2020 年不存在

以上是关于SpringBoot + ActiveMQ - 如何设置可信包?的主要内容,如果未能解决你的问题,请参考以下文章

springboot入门_ActiveMq

SpringBoot整合ActiveMQ

SpringBoot + ActiveMQ - 如何设置可信包?

Springboot activemq 对象传递

SpringBoot------ActiveMQ安装

Springboot1.5.10整合ActiveMq5.14