Сначала предупреждение: Быть осторожным при использовании FTP, потому что ни аутентификация, ни передача данных не шифруются.
Эта информация в основном компилируется от рассмотрения страниц справочника и не была протестирована, однако это должно разработать тот путь.
$ man vsftpd.conf
Добавляют следующие строки к Вашей vsftpd конфигурации:
chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot.list
Затем добавляют каждого пользователя, которого Вы хотите заблокировать к их homedir в chroot.list файл. Можно изменить пользователей homedir при помощи
$ sudo usermod -d /path/to/homedir user
, я надеюсь, что это помогает.
Если у них сильные связи, я бы поместил их в перечисление:
public enum Error {
ERROR_1("-1", "foo went wrong"),
ERROR_2("-2", "bar went wrong");
private final String id;
private final String message;
Error(String id, String message) {
this.id=id;
this.message=message;
}
public String getId() {
return id;
}
public String getMessage() {
return message;
}
}
Преимущество в том, что вы можете обеспечить безопасность типов в своем коде и что вы можете легко добавить на основе идентификаторов поиск (либо путем создания HashMap
в конструкторе, либо путем простого перебора значений ()
).
Некоторые люди считают постоянный интерфейс анти-шаблоном ( http://en.wikipedia.org/wiki/Constant_interface ).
Вы должны делать это в классе.
Интерфейс - это описание доступных методов, свойств и т. Д., К которым пользователи класса могут получить доступ - реализуя интерфейс, вы гарантируете, что члены, объявленные в интерфейс доступен пользователю.
Класс, с другой стороны, представляет собой описание объекта или (если вы не слишком строго придерживаетесь принципов объектно-ориентированного проектирования ...) заполнитель для статических членов. Лично я считаю, что в некоторых проектах очень полезно хранить кучу констант в классе Settings
, поэтому мне не нужно смотреть по всему проекту в поисках определений. Думаю, вам тоже нужен этот подход.
Это обсуждалось до :
Причина, по которой вам не нужны константы в интерфейсе, заключается в том, что это побуждает клиентские классы «реализовать» этот интерфейс (чтобы получить доступ к константам без добавления к ним имени интерфейса). Однако вам не следует этого делать - интерфейс на самом деле не является интерфейсом к возможностям объекта, а удобством времени компиляции, укоренившимся во внешнем типе класса.
Было время, когда «постоянный интерфейс» был очень удобен , но это всегда было «неправильно», и даже лень не может служить оправданием для его использования сейчас, когда у нас есть операторы import static
.
Изменить: Хотя я должен согласиться с тем, что для сценария, представленного в вашем вопросе, более подходят перечисления.
Здесь следует рассмотреть использование статического импорта (для импорта констант, определенных в классе) или типобезопасного Enum .
Размещение констант в интерфейсе было популярной техникой на заре Java, но сейчас многие считают это отвратительным использованием интерфейсов, поскольку интерфейсы должны иметь дело со службами, предоставляемыми объект, а не его данные .
Кроме того, константы, используемые классом, обычно являются деталями реализации, но размещение их в интерфейсе продвигает их в общедоступный API класса.
Я лично считаю, что константы должны быть определены в классе по тем же причинам, что описаны здесь выше. Тем более, что некоторые разработчики используют эти константы, реализуя интерфейс в классе, который хочет их использовать. Когда этот интерфейс содержит много констант, вы не хотите больше смотреть на javadoc этого конкретного класса, потому что он завален описаниями констант, которые, вероятно, даже не используются этим классом.
Вы должны поместить их в класс с помощью частного конструктора.
public class ErrorCodes {
private ErrorCodes() {} // prevents instantiation
public static final String ERROR_1 = "-1";
public static final String ERROR_2 = "-2";
}
Или еще лучше, используйте типизированное перечисление.
Значение типа
имеет формат {Class}, {assembly}
.
Таким образом, в вашем случае это должно быть MyHttpModule, MyDllName
Где MyDllName
- имя скомпилированной библиотеки DLL.
interface MoreConstants {
int MAGIC = 0xCAFEBABE;
interface PROPERTIES {
String NAME = "name";
}
enum ERRORS {
ON_FIRE, ASLEEP, BROKEN, UNSURE;
}
}
и получить к ним доступ таким образом, предполагая статический импорт интерфейса MoreConstants :
if (!PROPERTIES.NAME.equals(value)) {
return ERRORS.UNSURE;
}
Конечно, эти интерфейсы никогда не должны реализовываться, что я считаю плохой практикой. Однако единственный способ обеспечить это - строгие проверки кода ...