문제

데이터베이스에 영향을 미치는 양식 (레코드 추가/ 삭제/ 업데이트)에 영향을 미치는 양식을 제출하고 있으며 이것이 다음과 같은 모습입니다.

이제 업데이트 작업을 수행하므로 사용자를 홈페이지로 가져 가고 싶습니다.

응답 .sendredirect /application /action = 홈

requestDispatcher.forward (/application/action = home)

업데이트를 완료 한 후 다른 종류의 오류 / 성공 메시지를 표시 해야하는 시나리오가 있기 때문에 게시 후 전진 할 가능성이 높습니다. 이러한 시나리오에서 두 번 업데이트 작업을 피하는 방법은 무엇입니까?

많은 보안 사이트 (은행) / 결제 게이트웨이가 화면에 텍스트를 배치하여 "백 / 새로 고침 버튼을 누르지 마십시오"와 같은 문자를 사용자에게 알리는 경향이 있다는 것을 알게됩니다.

이것을 처리하는 더 좋은 방법이 없습니까? 사용자 에게이 버튼을 누르지 말라고 요청하는 것 외에? 마지막으로 확인했을 때 '수직 응답 캐시'라는 것이있었습니다. 세션에서 요청의 고유성을 식별하고 요청이 복제 된 경우 캐시 된 응답을 보내려고하는 필터. 이 고전적인 문제를 해결하는 더 간단한 방법이 있습니까?

다음은 내가 말한 수직 응답 캐시 솔루션에 대한 링크입니다. http://www.fingo.info/en/articles/_1.html. I am, However, not sure as to how well this really works.

도움이 되었습니까?

해결책

편집하다: 주석에서 지적한 바와 같이, 데이터베이스에 트랜잭션 ID를 저장하면 많은 공간이 필요할 수 있지만 문제가 발생하면 모든 트랜잭션 ID의 메모리 캐시를 마지막 5 분/1 시간/1 시간/1 시간/1 시간/1 시간/1 시간/1 시간/1 시간/1 시간/1 시간/1 시간/1 시간/1 시간/입니다. 1 일/무엇이든. 결정된 해커에 반대하지 않는 한 작동해야합니다 ...

다른 팁

Response.SendRedirect는 실제로 작동하지만 Tecnically는이 목적을 위해 잘못된 HTTP 응답 코드를 보내고 있습니다. SendReverect는 302를 보내지 만 게시물을 GET로 변환하는 데 사용할 올바른 코드는 303입니다.

일반적으로 리디렉션이 사용자를 변경의 효과를 표시 할 수있는 견해로 사용자를 보낼 수 있기를 원합니다. 예를 들어, 위젯을 편집하면 해당 위젯의보기로 리디렉션해야합니다. 위젯을 삭제하면 위젯이 존재했을 때 (아마도 위젯 목록)가 나타났다는 견해로 리디렉션되어야합니다.

Sometimes it's nice to have a status message to further drive home the fact that an action occurred. A simple way to do this is to have a common parameter to your views that, when set, will display an action completed message. 예 :

/widget?id=12345&msg=Widget+modified.

Here the "msg" parameter contains the message "Widget modified". The one downside to this approach is that it may be possible for malicious sites to give your users confusing/misleading messages. 예 :

/account?msg=Foo+Corp.+hates+you.

이것에 대해 정말로 걱정된다면 메시지에 대한 만료 서명을 추가 매개 변수로 포함시킬 수 있습니다. 서명이 유효하지 않거나 만료 된 경우 메시지를 표시하지 마십시오.

게시물 후 리디렉션을 받기 위해 사용자에게 상태 메시지를 표시하는 문제를 해결하는 가장 좋은 솔루션은 사용자 세션을 사용하는 것입니다.

어떻게

표시 할 메시지 세트로 값을 가진 사용자 세션에 속성을 추가하십시오. 예를 들어.

userSession.put("success_messages", new HashSet<String>(){"Success", "Check your account balance"});
userSession.put("warning_messages", new HashSet<String>(){"Your account balance is low. Recharge immediately"});

많은 보안 사이트 (은행) / 결제 게이트웨이가 화면에 텍스트를 배치하여 "백 / 새로 고침 버튼을 누르지 마십시오"와 같은 문자를 사용자에게 알리는 경향이 있다는 것을 알게됩니다.

어떤 사람들은 "이 중요한 페이지에서 모든 것을 다시 비활성화하고 새로 고침하는 이벤트를 비활성화하는 것이 더 좋다"고 생각합니다. 이것이 좋은지 확실하지 않습니다.

그러나 당신의 해결 된 해결책 "수직 응답 캐시" 좋은 소리

조금은 은색이지만 :

  • 사용자 세션에서 키드 객체를 만듭니다.
  • 값은 결과에 대한 요청 + Java Future입니다.
  • 클라이언트 측 리디렉션으로 즉시 반환하십시오.

따라서 클라이언트 브라우저가 리디렉션을 완료하고 새 페이지의 이미지를 가져 오는 등을 완료 할 때까지 결과는 사용자를 기다리고 있습니다.

대안은 사용자가 데이터베이스의 시간을 고통스럽게 인식하도록하는 것입니다.

보안 업데이트 (2011 년 1 월 24 일) :

열쇠는 고객에 대한 응답의 일부이기 때문에 공격에 취약합니다.

  1. 임의의 키를 생성하십시오
  2. 사용자 세션 ID를 소금으로 사용하여 SHA-1을 만듭니다.
  3. 데이터베이스에 임의 키와 SHA-1을 기본 키로 저장하십시오. (랜덤 키에서 별도의 인덱싱이 없습니다.
  4. RandomKey와 SHA-1을 DB 조회로 사용하십시오.
  5. 세션 ID를 저장하지 마십시오 (동일한 사용자에게 많은 항목을 화합 할 수있는 개인 정보 보호 문제를 피하십시오).

이 방법을 사용하려면 해커가 세션 ID와 랜덤 키를 모두 알아야합니다.

이 접근법은 과잉처럼 보일 수 있지만 비밀번호 재설정과 같은 상황에는 리디렉션 강화 메커니즘이 사용될 수 있습니다.

Java Server Side Scripting과 함께 작업하고 Struts 2를 사용하는 경우 토큰 사용에 대한이 링크를 참조하십시오.

http://www.xinotes.org/notes/note/369/

요청이 처음으로 토큰과 함께 제출 될 때, 초기 페이지 렌더링을 위해 세션에서 토큰을 생성하고 유지해야합니다. Struts Action에서는 스레드 이름을 가진 스레드를 토큰 ID로 실행하고 클라이언트가 가지고있는 모든 논리를 실행합니다. 요청 된 클라이언트가 동일한 요청을 다시 제출할 때 스레드가 여전히 실행 중인지 확인한 경우 (thread.getCurrentThread (). Interrupted)가 여전히 실행중인 경우 클라이언트 503을 보내십시오.

Struts 2 코드의 ExecuteAndwaitinterceptor를보십시오. 토큰과 결합 된 논리는 빠른 클릭에 도움이됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top