消息队列:第六章:ObjectMessage与MapMessage

javax.jms.jmsexception:无法从内容生成正文。可序列化类不可用于代理原因:java.lang.ClassNotFoundException:
禁止类com.javaliao.portal.model.TbLogVisit不信任将此类序列化为objectMessage负载。
有关如何配置受信任类的详细信息,请查看http://activemq.apache.org/objectmessage.html。

控制台打印:
javax.jms.JMSException: Failed to build body from content. Serializable class not available to broker.
Reason: java.lang.ClassNotFoundException: Forbidden class com.javaliao.portal.model.TbLogVisit!
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.JMSExceptionSupport.create(JMSExceptionSupport.java:36)
    at org.apache.activemq.command.ActiveMQObjectMessage.getObject(ActiveMQObjectMessage.java:213)
    at com.javaliao.portal.listener.LogVisitListener.consumePaymentResult(LogVisitListener.java:50)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:171)

出现这个问题是因为:

尽管通常不鼓励使用ObjectMessage,因为它在生产者和消费者之间引入了类路径的耦合,但ActiveMQ支持它们作为JMS规范的一部分。
安防
objectMessage对象依赖于marshal/unmarshal对象负载的Java序列化。此进程通常被认为是不安全的,因为恶意负载可以利用主机系统进行攻击。这就是为什么从版本5.12.2和5.13.0开始,ActiveMQ强制用户显式地列出可以使用ObjectMessages交换的包的白名单。
如果需要交换对象消息,则需要添加应用程序正在使用的包。通过使用org.apache.activemq.serializable_packages系统属性(由代理和activemq客户机库解释)可以做到这一点。您可以将此系统属性添加到${activemq_home}/bin/env脚本中的activemq_opts变量。
例如
-dorg.apache.activemq.serializable_packages=java.lang,javax.security,java.util,org.apache.activemq,org.fusesource.hawtbuf,com.thoughtworks.xstream.mapper,com.mycompany.myapp
将com.mycompany.myapp包添加到受信任包列表中注意,这里列出的其他包在默认情况下是启用的,因为它们是常规代理工作所必需的。如果您想简化此机制,可以使用通配符来信任所有包,如
-dorg.apache.activemq.serializable_包=

客户
在客户机端,您需要使用与在objectMessage.getObject()调用上反序列化恶意代码相同的机制,从而破坏应用程序的环境。您可以在代理上使用相同的配置机制,并使用系统属性配置受信任的类但是,这在客户端应用程序中通常不方便,因此在5.12.2和5.13.1中,我们引入了使用activemqconnectionfactory的附加配置机制。定义了两种附加方法:
setTrustedPackages()方法允许您设置要取消序列化的受信任包的列表,如
activemqconnectionfactory=new activemqconnectionfactory(“tcp://localhost:61616”);
factory.setTrustedPackages(新的ArrayList(Arrays.asList(“org.apache.activemq.test,org.apache.camel.test.split(“,”)));
setTrustAllPackages()允许关闭安全检查并信任所有类。它对测试很有用。
activemqconnectionfactory=new activemqconnectionfactory(“tcp://localhost:61616”);
factory.setTrustAllPackages(真);

更多请见:http://www.mark-to-win.com/tutorial/51232.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值