我没有SSL支持,ehcache复制正常工作。 我希望通过SSL支持我的ehcache复制,即我希望通过SSL使用RMI
我该怎么做?
以下是我正在使用的示例手动对等发现。
<cacheManagerPeerProviderFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
properties="peerDiscovery=manual,
rmiUrls=//10.100.10.12:40002/ssoSessionStore"/>
我可以为RMI调用提供一些SSL支持吗?
由于
答案 0 :(得分:2)
我不得不更改ehcache源代码并更改几个类来支持SSL。当ehcache通过rmi启动时,它会在rmiregistry上注册。我需要通过SSL上下文启动此注册
查看方法RMICacheManagerPeerListener.java
的课程startRegistry()
这是RMI注册表启动的主要类。修改代码的人需要先了解ehcache rmi代码流。下面的代码是必须完成的内容并分别更改其他方法的片段。
final String SSL= System.getProperty("isSSL");
protected void startRegistry() throws RemoteException {
try {
LOG.info("Trying to Get Exsisting Registry =========>> ");
if (SSL != null && SSL.equals("ssl"))
registry = LocateRegistry.getRegistry(hostName, port.intValue(),
new SslRMIClientSocketFactory());
else
registry = LocateRegistry.getRegistry(port.intValue());
try {
registry.list();
} catch (RemoteException e) {
// may not be created. Let's create it.
if (SSL != null && SSL.equals("ssl")) {
LOG.info("Registry not found, Creating New SSL =========>> ");
registry = LocateRegistry.createRegistry(port.intValue(),
new SslRMIClientSocketFactory(), new SslRMIServerSocketFactory(null, null, true));
} else {
LOG.info("Registry not found, Creating New Naming registry =========>> ");
registry = LocateRegistry.createRegistry(port.intValue());
}
registryCreated = true;
}
} catch (ExportException exception) {
LOG.error("Exception starting RMI registry. Error was " + exception.getMessage(), exception);
}
}
同样,我对方法
进行了更改bind()
notifyCacheAdded()
unbind()
disposeRMICachePeer()
populateListOfRemoteCachePeers()
bind()
init()
答案 1 :(得分:0)
要修补对使用自定义套接字工厂的支持,您应该删除全局默认值的使用。
上的静态方法调用java.rmi.Naming
应替换为
的三参数版本返回的注册表LocateRegistry.createRegistry
和
LocateRegistry.getRegistry
并在ConfigurableRMIClientSocketFactory.java中更改
getConfiguredRMISocketFactory
返回基于SSL的实现。
有关示例补丁,请参阅https://gist.github.com/okhobb/4a504e212aef86d4257c69de892e4d7d。