Используйте ref для сохранения значений между вызовами функций без запуска рендера
class ClassExample extends React.Component {
_isAnimating = false;
_blockRef = null;
onBlockRef = (ref) => {
if (ref) {
this._blockRef = ref;
}
}
// Animate the block.
onClick = () => {
if (this._isAnimating) {
return;
}
this._isAnimating = true;
Velocity(this._blockRef, {
translateX: 500,
complete: () => {
Velocity(this._blockRef, {
translateX: 0,
complete: () => {
this._isAnimating = false;
}
},
{
duration: 1000
});
}
},
{
duration: 1000
});
};
render() {
console.log("Rendering ClassExample");
return(
{}
);
}
}
const FunctionExample = (props) => {
console.log("Rendering FunctionExample");
const isAnimating = React.useRef(false)
const blockRef = React.useRef(null);
// Animate the block.
const onClick = React.useCallback(() => {
if (isAnimating.current) {
return;
}
isAnimating.current = true
Velocity(blockRef.current, {
translateX: 500,
complete: () => {
Velocity(blockRef.current, {
translateX: 0,
complete: () => {
isAnimating.current = false
}
},
{
duration: 1000
});
}
},
{
duration: 1000
});
});
return(
{}
);
};
ReactDOM.render( , document.getElementById('root'));
Ну, вы можете переопределить SecurityManager.checkMemberAccess
и дать более строгое определение. Однако на самом деле это не так. Что происходит, например, если код определяет финализатор?
Пояснение: другие API используют рефлексию и другие API. Например, java.beans, LiveConnect и Rhino. Например, злоумышленник из сценария может создать новый контекст Rhino без затвора и, таким образом, загрузить его в полную версию JRE. С открытой системой черный список никогда не может быть закончен.
В итоге: для использования модели безопасности Java вам нужно работать с ней, а не с ней.
Это зависит от того, что вы пытаетесь ограничить.
В общем, общедоступный API не ограничен. Однако, если вы не предоставите ненадежному коду разрешение ReflectPermission ("suppressAccessChecks")
, оно не сможет получить доступ к непубличному API в другом пакете.
Если у вас есть список пакетов, к которым вы хотите ограничить весь доступ, есть два шага. Во-первых, в свойствах Security
включите ограниченный пакет в список package.access
. Затем передайте свой доверенный код RuntimePermission ("accessClassInPackage." + Pkg)
.
Распространенный способ отличить ненадежный код - загрузить его из другого места, и при предоставлении разрешений обращайтесь к различным кодовым базам в файле политики.
Архитектура безопасности Java очень мощная, но я знаю, что она также сложна; если вам нужен более конкретный пример, пожалуйста, опишите, какие именно вызовы вы хотите ограничить, и я постараюсь быть более точным.
Делать то, что вы хотите, без изменения файла java.policy
и / или файл java.security
будет очень сложным, возможно, невозможным. java.security.Policy
представляет информацию в java.policy
, но не предлагает доступа для записи. Вы можете создать свою собственную реализацию Policy
и установить ее во время выполнения, если это позволяет любой существующий SecurityManager
.
С другой стороны, вы можете указать пользовательский java. файл политики в качестве параметра командной строки. Если вы предоставляете законченное приложение с каким-то средством запуска, это может быть легко выполнено. Это также обеспечивает некоторую прозрачность для ваших пользователей. Опытный пользователь может просмотреть разрешения, которые вы хотели бы предоставить приложению.
Я написал замену ClassShutter, которая позволяет мелкозернистый контроль доступа, на экземпляр, на метод, на поле:
http://riven8192.blogspot.com/2010/07/java-rhino-fine-grained-classshutter.html