HTTP refresh

Caros amigos que sabem o protocolo HTTP.
Eu gostaria de saber se quando o botão de refresh do browser é pressionado se isso envia algum parametro no HTTP, indicando que um refresh é solicitado, ou esse controle é interno dos browser. Pedindo apenas a página novamente.

[quote=Akila]Caros amigos que sabem o protocolo HTTP.
Eu gostaria de saber se quando o botão de refresh do browser é pressionado se isso envia algum parametro no HTTP, indicando que um refresh é solicitado, ou esse controle é interno dos browser. Pedindo apenas a página novamente.

[/quote]

Por via das dúvidas, é melhor ter algum controle interno na sua aplicação Web para evitar que um mesmo comando (GET) seja submetido duas vezes, por algum motivo. (Pense em um comando do tipo “pagar uma conta”).
O controle é entre o browser (que pode ter o arquivo em cache, se ele obedeceu corretamente aos headers HTTP que foram enviados pelo servidor Web indicando se o conteúdo deve ser conservado em cache e sua respectiva expiração), e o web server.
Pode ser que o browser envie uma requisição HEAD em vez de GET (HEAD serve só para ver se o arquivo que ele tem em cache foi atualizado ou não), e pode ser que o web server responda 302 (FOUND) em vez de 200 (OK).
Como um refresh gatilha várias ações (solicitando a página, as figuras etc.), na prática não dá para dar uma resposta única para sua pergunta.

Caro amigo entendedor de HTTP. O meu problema é saber se op browser esta ou não requisitando um refresh. Se o usuário clicou no refresh. Mas como vc disse não tem como saber se foi um refresh certo :?:

no cabeçalho do HTTP não tem nenhum parametro que informe isso certo :?:

[quote=Akila]Caro amigo entendedor de HTTP. O meu problema é saber se op browser esta ou não requisitando um refresh. Se o usuário clicou no refresh. Mas como vc disse não tem como saber se foi um refresh certo :?:
[/quote]
Não, por isso é que é necessário ter um controle interno na sua aplicação. (como um parâmetro que é um “ID” associado à sua sessão e fica na query string. Se por acaso a aplicação receber dois requests com o mesmo ID, ele deve executar o primeiro - ou seja, pagar a conta do banco - e não efetuar o segundo - ou seja, no máximo mostrar a página mas não pagar a mesma conta duas vezes.
(Quando é via POST, o browser normalmente avisa que vai enviar os parâmetros do POSTDATA novamente, mas quando é via GET não avisa nada.)

[quote=Akila]
no cabeçalho do HTTP não tem nenhum parametro que informe isso certo :?: [/quote]
Não; se tiver alguma dúvida, tente pelo método científico (use alguma ferramenta como um “sniffer” de rede, tal como o pcap (Linux) ou Network Monitor (Windows), e veja se está sendo mandado algum header especial quando você dá um refresh). Pela minha experiência, pode ser que o browser mande HEAD em vez de GET (isso vale principalmente para .GIF e .JPG, que são partes “estáticas”) ou então o browser manda um GET mesmo, igualzinho ao que já tinha (depende de como você codificou o .jsp, se você usou Pragma:no-cache ou alguma coisa parecida ). Como não é muito “preciso” (tradução: não funciona sempre do mesmo jeito, as regras são um pouco complicadas), é melhor ter um controle interno na sua aplicação.

Caro amigo que sabe o que esta falando.

É então acho que não dará para fazer o que desejo. eu apenas queria saber se o botão de refresh foi pressionado. como vc disse GET não da para saber se foi ou não refresh e POST vc acha que dá? ele avisa que esta enviando novamente os paramtros do form?

Olá

Quando o thingol falou em controle interno acho que já estava dando toda a solução. Detalhando, acho que o negócio pode ser mais ou menos assim:

Mantenha uma variável hidden ÚNICA em cada formulário. Algo que mude a cada tela, que seja armazenada na session e que só possa chegar ao servlet uma única vez. Quando cada form é submetido, a variável vem pela primeira vez. O servlet controla se ela chega outra vez ou mesmo se foi usado o butão back do browser (chega outra variável). É possível usar filtros neste processo.

Caso você use o Struts (pronto, lá se vai mais uma foquinha… :oops: ), você pode ver o que foi feito em: http://www.javaworld.com/javatips/jw-javatip136_p.html

[]s
Luca

Caros colegas.

O problema não é em submeter um formulário mais de uma vez. O que eu realmente quero é saber quando o usuário clica em refresh. Pois tenho um portlet que só executa uma lógica a primeira vez que ele é exibido, armazendo o resultado na sessão e depois disso utiliza esse resultado da sessão. Mas ai quando ele clicar rem refresh eu quero que seja execuado novamente. Mas para isso tenho que saber se ele clicou no refresh certo. :wink:

Olá

Com refresh seu campo hidden vem igual. Faça o que bem lhe aprouver com ele, inclusive pode aceita-lo se quiser.

[]s
Luca

Caro colega você não esta entendento a minha dúvida.

Eu preciso saber quando o botão de refresh é precionado. Mesmo eu colocando um campo hidden na jsp não adiantaria.

Se, por exemplo, um GET fosse executado não teria como eu saber se foi um refresh ou um requisição comum

Nao tem como vc saber. Simples assim :wink:

Rafael

Olá

Talvez não tenha entendido mesmo. Estava pensando que se o botão refresh fosse pressionado o valor do campo hidden viria igual ao anterior e assim minha aplicação saberia facilmente que era um refresh.

Tudo o que falei que me parece que foi o mesmo que o thingol, são coisas tiradas de livros e de exemplos comuns na prática, não se aplicam a casos muito especiais.

[]s
Luca

Esta correto Luca, eh isso mesmo. Ai caberia a aplicacao verificar se o id ja nao foi processado.

Akila, nao eh enviado nenhum header adicional qdo o refresh eh pressionado. Se as dicas do Luca e do thingol nao lhe servirem, voce tera que pensar em outro meio :slight_smile:

Rafael

Quando nao ha uma solucao adequado para o problema, podemos mudar o problema. Voce tem um recurso (portlet) que executa uma certa logica e armazena o resultado na sessao. Se o usuario fizer refresh voce executa a logica novamente. Qual o problema de voce executar a mesma logica a cada requisicao, independente de ser via botao refresh ou nao? Afinal, que diferenca pratica faz se ele clicou novamente na URL ou se ele clicou no botao refresh?

Ou eu nao entendi direito o problema? :smiley:

Marcio Kuchma

Caro amigo que intendeu o meu problema.

Eu não posso no caso mudar o problema. Pq o que é feito não é um processamente muito leve, e a página onde esta o portlet é uma página que possui muita navegação… ai toda hora teria de executar minha lógica. Mas ja que não tem com saber se o botão de refresh foi pressionado, terei de procurar uma outra abordagem para solucionar…

A questão de usar o botão de refresh é que o usuário no meu caso ja esta acostumado a usar esse botão para “atualizar” a página… Mas tudo bem, obrigado a todos que ajudaram gostei muito das ajustas :smiley:

see you later.