2013-06-06 6 views
-3

У меня есть global variableloginAttempt в servlet class. Что будет с этим global variable, если два requests попадут в одно и то же время? Что произойдет, это непредвиденное событие.Использование глобальных переменных в сервлете зло?

Имеет ли глобальные переменные в сервлете зло?

Если я поставил loginAttempt, то это будет doPost() его инициализация каждый раз.

+1

Разве это не разные уровни контекста? К сожалению, давно не работал с сервлетами. Просто идея. – Fildor

+1

сохраните его в сеансе, в любом другом месте, которое будет использоваться всеми другими пользователями. – fmodos

+0

@fmodos вы имеете в виду это значение, разделяемое ко всем запросам, доступным для разных пользователей? –

ответ

4

Да.

  1. Ваша переменная читается/записывается любым другим классом. Вы не можете контролировать, чтобы все делали с ним разумные вещи. Один из них может перезаписать его/неправильно увеличить его, и т. Д.

  2. Один экземпляр сервлета, за JVM. Таким образом, потоки могут пытаться получить к нему доступ одновременно. Поскольку он является глобальным, и вы не предоставляете никакого управления синхронизацией/доступом, он не будет потокобезопасным. Кроме того, если вы когда-либо запускаете сервлет в каком-то кластере с разными JVM, тогда переменная не будет использоваться между ними, и вы будете иметь несколько переменных loginAttempt.

Если есть иметь его в сервлет, сделать его статическим, но не сделать его достоянием общественности. Предоставьте получателям/сеттерам доступ и обновление. Узнайте о потокобезопасном программировании, чтобы несколько потоков могли обновить его и безопасно прочитать.

Намного лучше, сохраните его в контексте сервлета. Это должно быть там, где вы храните данные в виде сервлета, подобные этому.

0

ДА.
Глобальные переменные передаются всем

+0

И решение? –

+0

@Baadshah: В соответствии с моим пониманием в вашем вопросе вы спрашиваете, являются ли глобальные переменные злыми, и мы должны пойти на это. ИМХО, я ответил на это. – xyz

0

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

0

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

2

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

Я предполагаю, что ваша глобальная переменная loginAttempt подсчитывает количество попыток входа в систему, если это делается безопасным потоком, поэтому было бы разумным способом подсчета количества попыток входа в этот сервлет. Это было бы для всех пользователей. Если вам нужны попытки входа на пользователя, вам, вероятно, потребуется создать сеанс и использовать контекст сеанса для хранения такого рода информации.

1

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

1,

public class loginAttempt extends HttpServlet implements SingleThreadModel { 
... 
} 

2, Второй метод: Используйте ключевое слово synchronized

3, Избегайте использования глобальной переменной

+0

Использование 'synchronized' в Servlets - это плохая практика –

1

сохранить его как атрибут сеанса. В противном случае концепция глобальной переменной полностью испортит вас. Использование сеанса является хорошей идеей, поскольку это 1) Если веб перезапуске службы, данные сеанса не потеряли

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

Таким образом, он доступен, но он скрыт.

0

Прежде всего, в Java нет терминологии global variable. Они называются переменной класса или переменной экземпляра.

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

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

Смежные вопросы