Post + HTTP 리디렉션 후 사용자에게 메시지를 표시하는 방법
-
21-08-2019 - |
문제
나는 사용하고있다 PRG 패턴 여러 양식 제출을 피하기 위해. 그러나 그것은 심각한 단점이 있습니다. 단순히 echo
사용자에게 확인 메시지가 표시됩니다 (분명히, 사용자는 페이지가 표시되지 않으며 다른 페이지로 리디렉션됩니다).
이 문제에 대한 해결책은 무엇입니까? 나는 그들 중 두 명을 알고 있지만, 그들 중 누구도 완벽 해 보입니다.
- 다음과 같은 사용자 정의 리디렉션 URL을 사용하십시오.
http://example.com/?msg=data-saved
. 그것은 상태가 없기 때문에 매우 신뢰할 수 있다고 생각합니다. 그러나 사용자가 링크를 복사하고 북마크 등 문제가 발생합니다. - 세션 변수/쿠키를 저장하고 모든 페이지로드에서 확인하십시오. 설정되면 지우고 메시지를 표시하십시오. 괜찮아 보이지만 이것에 대해 잘 모르겠습니다. 쿠키에 크게 의존하고 조금 더 복잡합니다.
아니면 내가 모르는 다른 방법이 있습니까? 세션과 URL 매개 변수의 일부 조합? Dunno.
당신의 의견에서 가장 좋은 방법은 무엇입니까? 어느 것이 가장 적은 단점이 있습니까? 장단점은 무엇입니까?
해결책
사용자가 로그인 할 수있는 거의 모든 웹 사이트는 쿠키에 의존하여 그렇게합니다. 완벽한 솔루션은 아니지만 우리가 얻은 최고입니다.
또한 세션 처리는 웹 개발 프레임 워크가 일반적으로 당신을 돌보는 것들 중 하나입니다.
다른 팁
이 문제를 해결하는 몇 가지 다른 스택 오버 플로우 질문이 있지만 문제를 명확하게 요약 한 적이 없다고 생각합니다. 다음은 다음과 같습니다.
- ASP.NET WebForms에서 Post/Redirect/Get 패턴을 구현하려면 어떻게합니까?
- 응답. GET 대신 게시물로 적용 되나요?
- 둘 다 HTTP는 요청 본문과 함께 얻습니다 그리고 HTTP에 법적으로 컨텐츠가 포함될 수 있습니까? 문제에 접근하면 토론은 읽을 가치가 있습니다.
- 리디렉션 연합을 사용할 때 ModelSTate 오류를 어떻게 유지합니까?
편리한 솔루션의 대부분은 세션 기반이거나 더 심각한 단점이 있습니다 (예 : QueryString에 메시지를 포함).
세션이 있다고 보장 할 수없는 경우, 또 다른 (비용이 많이 드는) 방법은 양식 제출 결과에 따라 다른 뷰로 리디렉션하는 것입니다. 예를 들어, 리디렉션 할 수 있습니다 EditWidgetView
, EditWidgetSaveSuccessfulView
, 또는 EditWidgetSaveErrorView
(또는 아마도 당신은 오류에 대해 리디렉션하지 않을 것입니다). 일부 언어와 프레임 워크에서는 확인 / 오류 메시지를 전혀 보여주는 것을 포기하는 시점에 비현실적이지만 다른 경우에는 그만한 가치가있을 수 있습니다.
어떤 이유로 든 세션에 의존하지 않으려면 get variable / custom URL을 사용할 수 있고 해당 변수가있는 경우 참조를 확인하십시오. 참조가 적절한 경우 메시지를 표시하십시오. 예, 이것은 확인 메시지를 표시하기 위해 전송되는 것을 참조하지만, 그렇지 않으면 세션에 의존하고 있습니다 (신뢰할 수 있지만 모든 솔루션에 100% 완벽하지는 않습니다.)
그리고 솔직히, 이런 종류의 것에 대해 일반적으로 좋은 일부 큰 사이트는 URL에 "actiondone = true"를 고정시킵니다. (Facebook이 어떤 곳에서 그것을하는 것을 보았습니다.)
그것은 당신이 실행중인 플랫폼에 따라 다릅니다.
Ruby on Rails는이 플래시를 호출합니다 [: cotent] = "귀하의 작업이 수행되었습니다", ASP.NET MVC는이 tempData를 호출합니다 [ "통지"] = "귀하의 동작이 수행되었습니다"...
기본적으로 그들은 단일 왕복을 위해 httpsession에 데이터를 저장합니다. 이렇게하면 다른 웹 요청에서 데이터를 검색 할 수 있습니다.
이 토론에 아주 늦었습니다 ..
제안 된 두 가지 옵션의 조합을 사용할 수 있습니다.
사후 요청 후 클라이언트가 리디렉션 (303)이 URL 로이 요청에 대한 응답 메시지가있을 수 있음을 나타내는 URL로 리디렉션됩니다.
Client: GET http://example.com/foo.cgi
Server: 200 Ok
Client: POST http://example.com/bar.cgi
Server: 303 http://example.com/foo.cgi?msg=true
만약 msg
논쟁은 true
메시지는 세션에서 찾아보고 클라이언트에 대한 응답에 포함됩니다 (발견 된 경우).
만약 msg
논쟁은 ! true
(또는 존재하지 않음), 조회 단계가 건너 뜁니다.
이 솔루션을 사용하면 실제 메시지가 URL에 표시되는 것을 방지하면 URL은 메시지가있을 수 있음을 나타냅니다. 또한 메시지는 필요할 때만 표시됩니다 (= 세션에서 찾을 때).
또 다른 장점은이 솔루션을 사용하면 적절한 현금 관리가 HTTP 응답에 포함될 수 있다는 것입니다.
세션 변수 방법을 사용합니다. URL에 표시하기 위해 오류 메시지를 포함시키는 것을 좋아하지 않습니다. 특히 URL 절약/공유 문제가 주목을받는 경우 사용자가 대상 페이지를 다시로드하면 깨끗한 인스턴스가됩니다.