|
|
|
как реализовать идемпотентность?
|
|||
|---|---|---|---|
|
#18+
Имеется приложение на основе spring-mvc. Есть страничка, на ней добавляется некоторая сущность(кандидат). Если я нажимаю на этой страничке save, а потом нажимаю refresh страницы, то кандидат добавится дважды. Как бы убить данные из request ? я пока решил это использованием redirect в теле обрабочика запроса, но как то это не по спринговому так делать, писать в сигнатуре response. посоветуете что нибудь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2013, 20:31:48 |
|
||
|
как реализовать идемпотентность?
|
|||
|---|---|---|---|
|
#18+
Гуглите по фразе "post-redirect-get". Это классический веб-паттерн. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2013, 21:06:41 |
|
||
|
как реализовать идемпотентность?
|
|||
|---|---|---|---|
|
#18+
Да, к идемпотентности это никакого отношения не имеет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2013, 21:07:23 |
|
||
|
как реализовать идемпотентность?
|
|||
|---|---|---|---|
|
#18+
DEVcoachДа, к идемпотентности это никакого отношения не имеет. я наверное чего-то не понимаю)) вроде повторная отправка) и состояние меняется. Или идемпотентность это когда запрос прошёл, но состояние не изменилось? насчёт паттерна нашёл что-то такое: http://stackoverflow.com/questions/5232789/post-redirect-get-design-pattern-in-spring-mvc Если я всё правильно понял, то идёт редирект из одного контроллера в другой. Но исходя из того, что они замаплены одинаково то по какому принципу определяется какой обработчик будет вызываться? а что я нашёл на русском: авторЧто бы решить данную проблему в веб-разработке приложений используют шаблон Post/Redirect/Get - после отправки данных на сервер, вместо возврата непосредственно страницы-ответа после POST-запроса осуществляется редирект посредством использование код HTTP 302 или 301 вместе с заголовком ответа «Location». Тем самым перенаправляя браузер на страницу-ответ используя GET-запрос. В результате этих действий пользователь получает страницу-ответ которую можно обновить или поместить в закладки браузера. При чем повторной отправки данных на сервер будет, т.к. дання страница получена посредством GET-запроса. Эти источники у меня в голове не кореллируют как-то. Объясните пожалуйста что к чему ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2013, 23:23:13 |
|
||
|
как реализовать идемпотентность?
|
|||
|---|---|---|---|
|
#18+
насчёт stackOverflow ссылки - наверное важно, что один метод get, а другой post? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2013, 23:32:21 |
|
||
|
как реализовать идемпотентность?
|
|||
|---|---|---|---|
|
#18+
redwhite90я наверное чего-то не понимаю)) вроде повторная отправка) и состояние меняется. Или идемпотентность это когда запрос прошёл, но состояние не изменилось? Совершенно верно - состояние не изменяется. Но я повторю еще раз - идемпотентность, это понятие досаточно абстрактное и относительное . Что значит "отностительное"? 1) Вот вы сделали сервлет, который обрабатывает GET запросы от клиента, и просто выдает ему страничку, ничего не изменяя внутри. Такое поведение будет идемпотентно и относительно клиента, так как он видит всегда одну и туже страницу, и относительно сервера, так как внутри системы ничего не меняется. 2) Теперь вы модифицировали этот сервлет таким образом, что каждый GET запрос теперь у вас логируется в базу. То есть на каждый GET у вас добавляется или обновляется запись в базе данных вида "страница X была запрошена Y раз". Такое поведение попрежнему идемпотентно относительно клиента - два последовательных запроса вернут одну и ту же страничку. Но оно уже неидемпотентно относительно сервера, так как на каждом запросе изменяется состояние счетчика. 3) Теперь вы модифицировали этот сервлет так, что значение счетчик стало уходить клиенту. Например, на сайтах объявлений часто есть счетчик "Количество просмотров", и с каждым кликом на F5 этот счетчик увеличивается. Такое поведение уже неидемпотентно ни относительно сервера, ни относительно клиента. Хотя это GET запрос, который по своему смыслу идемпотентен. Надеюсь, что-то у вас прояснилось теперь по идемпотентности. redwhite90Но исходя из того, что они замаплены одинаково то по какому принципу определяется какой обработчик будет вызываться?Во-первых, совершенно не обязательно мапить их одинаково. Например, вы можете делать POST по адресу /app/writeData.html, а потом редиректить на /app/getData.html?id=10, где id - какой-то идентификатор, значение которого вы изменили. Во-вторых, в том же Spring MVC можно мапить разные методы на один и тот же путь. То есть, при вызове GET на одном пути у вас будет отрабатывать один метод, а при вызове POST по этому же пути - другой. Так, например, работают многие REST-сервисы, вроде Amazon S3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2013, 12:14:00 |
|
||
|
как реализовать идемпотентность?
|
|||
|---|---|---|---|
|
#18+
cdtyjv, Да, с идемпотентостью Вы классно всё объяснили) Остался вопрос с реализацией.На stackOverflow человек пишет, что у него форма, отправляющая данные Post запросом. и соответственно вот ее обработчик(тоже POST). Тут всё понятно. Код: java 1. 2. 3. 4. 5. 6. В вышеприведенном обработчике делается редирект на signin.html. Вопрос: почему мы попадём в GET обработчик(код приведен ниже) этого урла а не в POST ? Код: java 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2013, 23:00:45 |
|
||
|
как реализовать идемпотентность?
|
|||
|---|---|---|---|
|
#18+
redwhite90 , Что бы это понимать, нужно знать, как работают редиректы в HTTP протоколе. Если на пальцах, то суть такая. Сначала вы отправляете серверу какой-то запрос (GET, POST, и т.д.). Сервер вам выдает ответ в специальном виде, где первой строкой идет статус запроса. Если все нормально, вы получаете статус 200 (хотя формально "нормальными" ответами считаются статусы 200-299). Если все плохо - вам вернется 4xx или 5xx. Но есть и статусы, которые имеют особое значение. Один вид таких статусов это редиректы - 301 (moved temporary) и 302 (moved permanent). Когда сервер выдает 301 или 302 он всегда в одном из заголовков также выдает адрес на который нужно сделать редирект. И все браузеры делают редирект методом GET, что эквивалентно тому, если бы вы вбили новый адрес руками и нажали Enter. То есть это просто соглашение , как должны работать браузеры: получил 301 или 302 - сделай GET на новый адрес. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2013, 23:21:13 |
|
||
|
как реализовать идемпотентность?
|
|||
|---|---|---|---|
|
#18+
DEVcoach redwhite90 , Что бы это понимать, нужно знать, как работают редиректы в HTTP протоколе. Если на пальцах, то суть такая. Сначала вы отправляете серверу какой-то запрос (GET, POST, и т.д.). Сервер вам выдает ответ в специальном виде, где первой строкой идет статус запроса. Если все нормально, вы получаете статус 200 (хотя формально "нормальными" ответами считаются статусы 200-299). Если все плохо - вам вернется 4xx или 5xx. Но есть и статусы, которые имеют особое значение. Один вид таких статусов это редиректы - 301 (moved temporary) и 302 (moved permanent). Когда сервер выдает 301 или 302 он всегда в одном из заголовков также выдает адрес на который нужно сделать редирект. И все браузеры делают редирект методом GET, что эквивалентно тому, если бы вы вбили новый адрес руками и нажали Enter. То есть это просто соглашение , как должны работать браузеры: получил 301 или 302 - сделай GET на новый адрес. спасибо, теперь понятно стало) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2013, 11:42:24 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38382979&tid=2128696]: |
0ms |
get settings: |
13ms |
get forum list: |
26ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
50ms |
get topic data: |
20ms |
get forum data: |
5ms |
get page messages: |
84ms |
get tp. blocked users: |
3ms |
| others: | 294ms |
| total: | 509ms |

| 0 / 0 |
