Лучшая практика, чтобы хранить временные данные для веб-приложения [дубликат]

Вам не нужны дополнительные пакеты, такие как предложенные в других ответах. Используйте RNFirebase.io, вы можете легко справиться с этим.

Если вы получаете уведомление, если приложение находится в фоновом режиме, вы должны обработать его самостоятельно, чтобы отобразить это уведомление. В качестве примера см. Мой метод init для Push-уведомлений.

  import firebase from 'react-native-firebase';
  const notifications = firebase.notifications();
  ....
  notifications.onNotification((notif) => {
    notif.android.setChannelId('app-infos');
    notifications.displayNotification(notif);
  });

Вы делаете это с displayNotification. Но убедитесь, что вы установили канал уведомлений перед вызовом, потому что иначе он не будет работать на> = Android 8.0

BTW : Убедитесь, что вы полностью настроить Firebase и предоставить все необходимые разрешения, чтобы иметь возможность прослушивать уведомления, если приложение закрыто или в фоновом режиме. ( https://rnfirebase.io/docs/v5.xx/notifications/android )

Приложение

Я добавляю это как пример, чтобы показать, как я Реализовал firebase -tification-stuff как крошечную библиотеку (удалите лишний материал, если он вам не нужен):

import firebase from 'react-native-firebase';
import { saveNotificationToken } from 'app/actions/firebase';
import reduxStore from './reduxStore';
import NavigationService from './NavigationService';

const messaging = firebase.messaging();
const notifications = firebase.notifications();
const crashlytics = firebase.crashlytics();

function registerNotifChannels() {
  try {
    // Notification-Channels is a must-have for Android >= 8
    const channel = new firebase.notifications.Android.Channel(
      'app-infos',
      'App Infos',
      firebase.notifications.Android.Importance.Max,
    ).setDescription('General Information');

    notifications.android.createChannel(channel);
  } catch (error) {
    crashlytics.log(`Error while creating notification-channel \n ${error}`);
  }
}

// This is the Promise object that we use to initialise the push
// notifications. It will resolve when the token was successfully retrieved. The
// token is returned as the value of the Promise.
const initPushNotifs = new Promise(async (resolve, reject) => {
  try {
    const isPermitted = await messaging.hasPermission();

    if (isPermitted) {
      registerNotifChannels();

      try {
        const token = await messaging.getToken();
        if (token) {
          resolve(token);
        }
      } catch (error) {
        crashlytics.log(`Error: failed to get notification-token \n ${error}`);
      }
    }
  } catch (error) {
    crashlytics.log(`Error while checking notification-permission\n ${error}`);
  }

  // If we get this far then there was no token available (or something went
  // wrong trying to get it)
  reject();
});

function init() {
  // Initialise the push notifications, then save the token when/if it's available
  initPushNotifs.then(token => reduxStore.dispatch(saveNotificationToken(token)));

  // Save the (new) token whenever it changes
  messaging.onTokenRefresh(token => reduxStore.dispatch(saveNotificationToken(token)));

  notifications.onNotification((notif) => {
    notif.android.setChannelId('app-infos');
    notifications.displayNotification(notif);
  });

  notifications.onNotificationOpened((notif) => {
    const { notification: { _data: { chatroom: chatRoomId } } = {} } = notif;

    if (chatRoomId) {
      NavigationService.navigate('ChatRoom', { chatRoomId });
    }
  });
}

export default {
  init,
};

При этом перейдите только к своему индексу. js-файл (или ваш корневой файл для вашего приложения, как бы он ни назывался) и вызовите метод init-Metod:

...
import LPFirebase from 'lib/LPFirebase';

LPFirebase.init();

28
задан Mr_and_Mrs_D 27 September 2013 в 20:41
поделиться

4 ответа

При хранении (чувствительных) пользовательских файлов в webapp, убедитесь, что вы храните их где-то в /WEB-INF и получите доступ к ним с помощью Servlet, который (косвенно) проверяет зарегистрированного пользователя, в противном случае он доступен любому пользователю/хакеру во всемирной сети Интернет. Преимущество заключается в том, что он легко доступен программно с помощью ServletContext#getResource() или #getRealPath(). Недостатком является то, что они будут потеряны всякий раз, когда вы переустанавливаете веб-приложение.

Вы также можете сохранить их во временной папке по умолчанию. Преимуществом является то, что они доступны через стандартные API типа File#createTempFile() или System.getProperty("java.io.tmpdir"). Недостатком временной папки является то, что очистка папок, управляемая операционной системой, не контролируется с Java, поэтому вы можете рисковать потерей данных, когда закрываете ресурс, но все равно нуждаетесь в них позже.

Вы также можете хранить их в фиксированной папке вне веб-приложения. Преимущество заключается в том, что они не теряются всякий раз, когда вы перемещаете веб-приложение. Недостатком является то, что вам нужно создать папку самостоятельно с достаточными правами операционной системы, что может быть неприменимо на сторонних хостах.

Очистка ваших собственных временных ресурсов, безусловно, принадлежит задачам, которые вам нужно выполнить самостоятельно. Я бы не стал рассматривать это как проблему.

Просто перевешивайте преимущества/недостатки.

.
34
ответ дан 28 November 2019 в 03:00
поделиться

Веб-контейнер предоставляет атрибут контекста, который указывает на временный каталог:

Спецификация сервлета SRV.3.7.1 Временные рабочие каталоги

Каталог временного хранения требуется для каждого контекста сервлета. Контейнеры сервлетов должны предоставлять личный временный каталог для контекста сервлета и делать его доступным через атрибут контекста ServletContext.TEMPDIR (javax.servlet.context.tempdir). Объекты, связанные с атрибутом, должны иметь тип java.io.File.

Пример:

File appTempDir = getServletContext().getAttribute(ServletContext.TEMPDIR);
File tempFile = File.createTempFile("process1", ".txt", appTempDir);
tempFile.deleteOnExit();
try {
    ...
} finally {
    tempFile.delete();
}
7
ответ дан LoganMzz 28 November 2019 в 03:00
поделиться

Я считаю, что временные файлы принадлежат временной папке. В вашем случае, вы сами удаляете файлы, но что делать, если в операции по удалению файлов есть ошибка? Или что, если перед удалением файлов произойдет остановка сервера? Если вы пишете во временную папку, есть, по крайней мере, некоторая надежда, что файлы будут очищены позже (вручную или каким-то процессом).

Даже если приложение хочет хранить постоянные данные (т.е. не временные), я думаю, что их все равно не следует хранить в каталоге Tomcat, потому что эти каталоги обычно удаляются или перезаписываются всякий раз, когда вы устанавливаете новую версию приложения (или даже устанавливаете новую версию Tomcat).

Полезные методы:

5
ответ дан 28 November 2019 в 03:00
поделиться
  • Хранение информации в папке веб-приложения не всегда работает . Некоторые серверы приложений не расширяют развернутый WAR-файл и, следовательно, нет "рабочей директории" для веб-приложения. Некоторые системные администраторы также препятствуют доступу к файловой системе веб-приложений (что зависит от политик менеджера безопасности).
  • Временные файлы должны использоваться для, ну, временных данных . Данные, которые могут быть восстановлены по требованию. Не используйте временные файлы, которые должны быть загружены пользователями. Например, когда ваша система считает, что она должна очистить временные файлы, или когда вы перезагружаете сервер приложения, пользователь все равно хочет скачать эти файлы, хотя они могут быть удалены в это время.
  • Правильным местом для хранения таких данных является база данных. Ваши документы на самом деле не являются временными в средствах временных файлов. Для хранения документов используйте базу данных, а для документов - кэш. Затем вы можете реализовать свою собственную стратегию очистки. Она также служит в качестве постоянного хранилища, так что вам не придется беспокоиться о перезагрузке сервера. Кроме того, там можно хранить дополнительные мета-данные, такие как время последнего доступа или счетчик доступа, и легко предоставлять пользователю список созданных им документов. Если для работы с вашей библиотекой обработки документов требуется файл java.io.File, то только после этого сохраните документ из базы данных в временный файл, начните обработку и прочтите его обратно в базу данных.
13
ответ дан 28 November 2019 в 03:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: