2014-12-01 1 views
3

У меня есть веб-сайт с несколькими страницами.
Некоторые из этих страниц нуждаются в userId и userName для любой обработки в контексте JavaScript.Шаблон, чтобы сделать userId доступным для JavaScript без перебора кеша

Примечание: идентификатор пользователя не используется для обеспечения безопасности и не отправляется обратно на сервер, поэтому спуфинг не является проблемой.

Вопрос: что такое хороший способ передать userId и userName в контексте JavaScript.

UPDATE В идеале я хотел бы общий шаблон, который может быть использован для передачи каких-либо данных (например, значения по умолчанию для списка сортировки и фильтрации настроек) с сервера кода JavaScript, так что я не решить USERID проблема иначе, чем проблема передачи значений initialSort и initialFilter.

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

1. Pass ID_пользователь и имя_пользователь от сервера в качестве несерверного печенья.
Против: cookie будет отправлен обратно на сервер с каждым запросом, который является отходами (хотя и не значительным).

2. Использование пользовательских заголовков
Минусы: заголовки не доступны JavaScript для первоначального запроса.

3. запрос Сделать AJAX, чтобы получить данные
Минусы: требует дополнительной поездки HTTP.

4. Визуализация данных в режиме онлайн в начальной страницы HTML
Минусы: бюсты кэш и делает страницы не-Cacheable.

5. Переключатель полярности (работает каждый раз, когда в Star Trek), мой любимый до сих пор
Вместо того, чтобы большинство HTML на начальной поездки - переписать страницу так, что начальная страница возвращает основном данные, в то время как разметка загружается (и кэшируется) отдельно. Например:

<html><body> 
    <div data-bind="template: 'pages/invoices'" /> <!-- using KO external template to load markup --> 
    <script src="require.js"></script> 
    <script> 
     require([...], function (...) { 
      var vm = new PageViewModel('userId-bob', 'Bob Smart'); // <-- content rendered by server 
      ko.applyBindings(vm); 
     }); 
</script></body></html> 

Против: страница поисковых роботов враждебна (не проблема в моем случае).

+0

Где большинство ваших данных, поступающих из на данный момент? Включается ли она на начальную страницу или загружается позже через AJAX? В зависимости от вашей ситуации *, что * данные вряд ли будут кэшируемыми в любом случае, поэтому я бы рекомендовал включить его с этим (также, вероятно, случай, когда userId бесполезен без данных, и наоборот, так что это решение еще более подходит). – Matt

+0

Является ли localStorage возможностью? – danronmoon

+0

Я думаю, что сделать дополнительный запрос для userId и что бы это было самое маленькое изменение кода, чтобы исправить эту конкретную проблему. Если эта же ситуация продолжает поступать, стоит обратиться по-другому: рендеринг встроенных данных в HTML или добавление промежуточного программного обеспечения учетных данных пользователя на серверный шаблон шаблонов. Для ситуации с 1-го или первого рода, я думаю, что запрос AJAX достаточно хорош. Возможно, измените конструктор PageViewModel, чтобы получить информацию о пользователе, если он не указан? Сначала исправьте его и разработайте шаблон, если ситуация повторяется. –

ответ

0

Учитывая ваш контекст, я бы, вероятно, положил его в файл cookie и не беспокоился о накладных расходах.

+1

Вы можете минимизировать накладные расходы, используя домен без файлов cookie для обслуживания ваших активов. – Matt

1

Что бы я сделал, это использовать sessionStorage.

Когда страница загружается, проверьте объект sessionStorage для данных, которые вам нужны.

Если данные не существуют в sessionStorage, то вы знаете, что это первый раз, когда страница загрузилась (по крайней мере, для этого сеанса). Затем вы можете выполнить вызов ajax для извлечения этих данных и их сохранения.

Если данные существуют в sessionStorage, то вам не нужно выполнять никаких дополнительных вызовов ajax.

Это должно сократить вас до одной и только одной дополнительной HTTP-поездки за сеанс, которая кажется мне разумной.

Что-то вроде

if(sessionStorage.userId && sessionStorage.userName) { 
    //the data exist, assign them to a global var or pass to the function that needs them 
} else { 
    //the data do not exist, make an ajax request to get the data and store them 
} 
Смежные вопросы