Evitando criar o mesmo objeto duas vezes na atualização em JSF

votos
3

Digamos que temos um formulário de adicionar novo objeto em AddObject.jspx, e uma página Confirm.jsp (dizendo algo como objeto com ID de NN foi adicionado ao banco de dados ...)

em faces-config.xml:

<navigation-rule>
    <from-view-id>/AddObject.jsp</from-view-id>
    <navigation-case>
        <from-outcome>add</from-outcome>
        <to-view-id>/Confirm.jsp</to-view-id>
    </navigation-case>
</navigation-rule>

Assim, o usuário abre AddObject.jsp, preenche o formulário e clica no botão 'adicionar' que desencadeia um manipulador de eventos no bean de apoio do AddObject. O bean de apoio insere o novo objeto no banco de dados e retorna o resultado add. Então vamos acabar na tela de Confirmar.

Agora, se eu bater F5 (atualizar o navegador) um novo objeto será criado ea tela de confirmação mostrada com o novo ID do novo objeto. Posso continuar batendo F5 e obter tantos novos objetos como eu gostaria.

Eu não quero isso. Eu quero detectar tais situações. Evite adicionar o mesmo objeto várias vezes (gerando muitas linhas no banco de dados que diferem apenas por ID).

Posso fazer isso com JSF? Por que ele me pedir de-view-id / resultado /-to view-id se ele não parece fazer qualquer bom uso desta informação?

Publicado 27/08/2009 em 07:35
fonte usuário
Em outras línguas...                            


1 respostas

votos
3

Há duas partes para este problema.

Primeiro, você precisa para evitar ter de atualização do broswer da página de confirmação reenviar o pedido. Assim, uma abordagem se para a história do brower não dizer

 POST this request

e em vez disso dizer

 GET this confirmation page

Nós cam fazer isso usando a

 <redirect/>

declaração na navegação JSF. Agora, isso significa que uma resposta de redirecionamento é enviado para o navegador. O navegador, em seguida, pedir JSF para a página de conformação. NOTA: esta é agora uma nova solicitação da perspectiva de JSF, então todos os dados que deseja exibir precisa estar no escopo da sessão não solicitar escopo.

Este "Use um redirecionamento para ações que fazer mudanças" abordagem é bastante uma linguagem comum. No entanto, não resolve o problema "fogo rápido User". O que aconteceria se o usuário atingiu o "Enviar" duas vezes muito rapidamente? Você pode chegar a uma situação em que o navegador enviou dois pedidos. Há outras situações em que isso pode acontecer - falha de rede na primeira solicitação, o usuário fica impaciente, envia o pedido novamente.

Por isso, precisamos de alguma forma para lidar com essas apresentações duplas. Este não é um problema específico do JSF. Uma solução típica é para o backend para enviar um sinal quando a página solicitação original é preenchida. Esta é realizada em um campo oculto. Quando o pedido for apresentado aquele sinal (algum número único) é enviada de volta para o aplicativo que registra que ele foi usado, portanto, uma submissão dupla é detectado.

Você também pode usar JavaScript no navegador para evitar o envio de casal. Isto deve dar ao usuário uma experiência mais amigável, mas eu não recomendo contando apenas com controle do lado do navegador. O servidor deve ter respsonbility final.

Respondeu 27/08/2009 em 08:34
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more