2009-08-05 3 views
2

Когда я нажимаю ссылку, вызывающую сервлет. Когда я нажимаю эту ссылку несколько раз, когда сервлет выдает ошибку (сведения об ошибке не важны) Хотя для этого исправления существует другая работа (например, отключить ссылку после щелчка и т. Д.) Мне любопытно, есть ли способ контролировать это через объект запроса/ответа.Управление сервлетами с несколькими запросами

+2

Я думаю подробности об ошибках важно видеть, что вы пытаетесь исправить. Вы могли бы сохранить какое-то состояние в сеансе. – Tommy

ответ

3

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

+0

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

1

Деталь ошибки сервлета является потенциально интересной. API-интерфейсы сервлетов вообще не должны бросать ошибки, я предполагаю, что это некоторая прикладная ошибка.

Общий принцип, который я пытаюсь применить это:

1). Мы строим пользовательский интерфейс, чтобы сделать его затруднительным для того, чтобы пользователь непреднамеренно дважды отправлял один и тот же запрос (например, дебетовать мою учетную запись на сумму 100 фунтов стерлингов, действительно не хочу отправлять два таких запроса. Это может помочь какой-то javascript nift.

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

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

+0

Нет ли встроенного метода, который уже доступен при обновлении HttpResponseObject, эта проблема будет решена. – Madhu

+0

Когда пользователь нажимает на отправку, браузер отправляет объект запроса, сервлет переносит объект ответа. Браузер «знает», что второй клик имеет какое-либо отношение к первому, поэтому два запроса не имеют отношения - если вы не код что-то в Java Script. Сервлет, получающий запрос (который может даже работать на другом члене кластера), не может ничего о предыдущем reuqest (HTTP без гражданства), если вы что-то не кодируете. У таких структур, как Strust, есть функции для решения проблемы. – djna

+0

Имеют смысл. Но все-таки им googleing найти решение для этой проблемы – Madhu

0

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

Вам понадобится обработка ошибок в вашем сервлете, чтобы исключение ServletException не оставило установленный флаг.

+0

Концептуально, да, но может быть сложным при работе с кластерными экземплярами. Может быть проще использовать db для отслеживания недавних запросов, т.е. полиция дублирует запросы в бизнес-логике, а не на уровне сервлета. – djna

1

Ошибка действительно, действительно актуальна.

У вас могут возникнуть проблемы с безопасностью резьбы, но вы также можете иметь «условие гонки», то есть результат процесса зависит от порядка выполнения, один из которых может дать вам ошибку.

(состояние гонки: http://en.wikipedia.org/wiki/Race_condition)

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