使用 SpringBoot 1.3.2.RELEASE 时,通过 ActiveMQ 发送文件引用的最佳方式是啥?

Posted

技术标签:

【中文标题】使用 SpringBoot 1.3.2.RELEASE 时,通过 ActiveMQ 发送文件引用的最佳方式是啥?【英文标题】:What is the best way to send a file reference through ActiveMQ, when using SpringBoot 1.3.2.RELEASE?使用 SpringBoot 1.3.2.RELEASE 时,通过 ActiveMQ 发送文件引用的最佳方式是什么? 【发布时间】:2016-02-17 12:26:38 【问题描述】:

我使用的是 SpringBoot 1.3.1.RELEASE,通过 ActiveMQ 中的消息发送文件引用没有问题。

自从我更新到 SpringBoot 1.3.2.RELEASE 我一直在试验一个问题。 activemq客户端拒绝读取文件引用报如下错误:

Caused by: java.lang.ClassNotFoundException: Forbidden class java.io.File! 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.
at org.apache.activemq.util.ClassLoadingAwareObjectInputStream.checkSecurity(ClassLoadingAwareObjectInputStream.java:112) ~[activemq-client-5.12.2.jar:5.12.2]
at org.apache.activemq.util.ClassLoadingAwareObjectInputStream.resolveClass(ClassLoadingAwareObjectInputStream.java:57) ~[activemq-client-5.12.2.jar:5.12.2]
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1613) ~[na:1.8.0_05]
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518) ~[na:1.8.0_05]
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774) ~[na:1.8.0_05]
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351) ~[na:1.8.0_05]
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371) ~[na:1.8.0_05]
at org.apache.activemq.command.ActiveMQObjectMessage.getObject(ActiveMQObjectMessage.java:206) ~[activemq-client-5.12.2.jar:5.12.2]
... 16 common frames omitted

我解决这个问题的唯一方法是在创建 bean JmsTransactionManager 时添加前两行。

@Bean
public JmsTransactionManager jmsTransactionManager(ConnectionFactory cf)
    ActiveMQConnectionFactory amqCf = (ActiveMQConnectionFactory)cf;
    amqCf.setTrustAllPackages(true);                // Without this we are not able to send the object type File.class through a JMS message. This problem started when we migrated to Springboot 1.3.2-RELEASE
    JmsTransactionManager result = new JmsTransactionManager();
    result.setConnectionFactory(cf);
    return result;

有没有更推荐的方法来解决这个问题?

【问题讨论】:

为什么不只传递一个 URL? @user1581366 如您的问题中所述,您使用setTrustAllPackages 是否遇到过任何问题?我现在也在努力解决这个问题,并希望将您的解决方案与amqCf.setTrustAllPackages(true); 一起使用 @alexanoid,这种方法绝对没有问题。 【参考方案1】:

Java 序列化存在许多使您面临风险的安全漏洞。更新后的代理现在将大多数对象列入黑名单,并要求您创建要处理的事物的白名单。

ActiveMQ Website 上有相关文档。

【讨论】:

以上是关于使用 SpringBoot 1.3.2.RELEASE 时,通过 ActiveMQ 发送文件引用的最佳方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot.14.SpringBoot使用jsp模板打包成jar

SpringBoot.14.SpringBoot使用jsp模板打包成jar

SpringBoot.14.SpringBoot使用jsp模板打包成jar

SpringBoot.14.SpringBoot使用jsp模板打包成jar

SpringBoot.14.SpringBoot使用jsp模板打包成jar

SpringBoot专栏 -- 搭建第一个SpringBoot项目