2017-01-24 22 views
0

Обновление Java 8 121 добавляет фильтры части для десериализации, серийный фильтр RMI и фильтр RMI DGC Serail, см. here.Фильтр реестра RMI отклоняет Rmi Конфигурационный класс в java 8 update 121

В настоящее время я пытаюсь развязать класс, используемый для конфигурации Rmi, который мы создали. Без какого-либо системного свойства фильтр не позволяет его и используя системное свойство -Dsun.rmi.registry.registryFilter=<package_name>.**, он все равно отвергает класс. Сообщение журнала:

INFO: ObjectInputFilter REJECTED: class <package_name and class name>,  arraylength: -1, nRefs: 11, depth: 4, bytes: 837, ex: n/a 

Debugging это проблематично, поскольку я ищу код, который не имеет исходный код, поставляемый Oracle. Я могу видеть, что проверка была сделана, но я не в состоянии увидеть, что фильтр для классов является и то, что пороги для:

maxdepth=value - the maximum depth of a graph 
maxrefs=value - the maximum number of internal references 
maxbytes=value - the maximum number of bytes in the input stream 
maxarray=value - the maximum array length allowed 

Есть ли другой способ, которым я могу применить этот белый список правильно?

+0

Я предполагаю, что вы можете быть жертвой подстановки шаблона оболочки. Вы пробовали '-Dsun.rmi.registry.registryFilter =" <имя_пакета>. ** "'? – rkosegi

+0

Пока нет. Я отдам это. –

+0

И не повезло. По-прежнему такая же ошибка. –

ответ

1

Мы также запускаем сервер RMI. Я решил проблему в коде, а не в командной строке, но оба пути должны работать, я бы догадался, что оболочка на вашем пути.

java.lang.System.setProperty("sun.rmi.registry.registryFilter", "java.**;<our package base>.**") 

Значение по умолчанию (если не указать фильтр пропеллера) находится в источниках RMIRegistryImpl: RMIRegistryImpl.registryFilter() Это позволяет только подклассы 9 основных классов Java + примитивы должны быть зарегистрированы в RMI. Но весь этот сериализуемый граф объекта за зарегистрированным объектом проверяется с помощью этого фильтра. Предел массива равен 10000, максимальная глубина дерева равна 5.

Если кто-то пытается зарегистрировать фильтр, не назвав белый список классов (например, «maxdepth = 10000000»), тогда по умолчанию применяется белый список классов по умолчанию.