Tenho um Controller com um método para deletar anotado com URI: /delete/id
No entanto, eu quero permitir acesso a ela somente internamente por JS, onde faço uma requisição delete.
Atualmente eu posso digitar no browser: www.dominio.com.br/delete/12 -> deleta o regsitro
Tem como bloaquear isso?
Não.
JS é Javascript né? Você quer que seja possível apenas por AJAX… é isso?
Então a resposta é: não.
Uma coisa que o Lucas da Caelum sempre me fala é para sempre que você for alterar o estado do objeto o GET não deve ser usado.
Para isso você deve anotar teu médodo com @Delete e usar um POST com o _method=DELETE.
[quote=garcia-jj]Uma coisa que o Lucas da Caelum sempre me fala é para sempre que você for alterar o estado do objeto o GET não deve ser usado.
Para isso você deve anotar teu médodo com @Delete e usar um POST com o _method=DELETE.[/quote]
É uma solução!!
Retiro meu não… ehehhehe
[quote=Lucas Emanuel]Tenho um Controller com um método para deletar anotado com URI: /delete/id
No entanto, eu quero permitir acesso a ela somente internamente por JS, onde faço uma requisição delete.
Atualmente eu posso digitar no browser: www.dominio.com.br/delete/12 -> deleta o regsitro
Tem como bloaquear isso?
[/quote]
http://vraptor.caelum.com.br/documentacao/resources-rest/
lfcdtv
Julho 8, 2011, 8:14pm
#6
é possível implementar um interceptor para verificar se o usuário está com o javascript ativado a cada request?
Se você está perguntando, se é impossivel implementar um interceptor que diga se a requisição veio da url, ou de um javascript… aí sim… a resposta é: impossível (se as duas forem GET)
Por isso respondi não a primeira pergunta… mas como garcia-jj sugeriu, uma reestruturação da app faz com que a requisição tenha que ser feita por código, pois não é possível enviar um comando por requisição DELETE ou POST por digitação na url do browser (pelo menos dos browsers populares)
Você continua não sabendo se veio do javascript ou url do browser… mas como esse tipo de requisição (POST) não vem da url nos browsers populares é possível chegar a um comportamento desejável.
lfcdtv
Julho 9, 2011, 6:27am
#8
Só quero verificar se o javascript está ativado no browser com um interceptor.
[quote=garcia-jj]Uma coisa que o Lucas da Caelum sempre me fala é para sempre que você for alterar o estado do objeto o GET não deve ser usado.
Para isso você deve anotar teu médodo com @Delete e usar um POST com o _method=DELETE.[/quote]
Você pode alterar quantos objetos quiser em um método GET, o que não deve alterar é o estado do resource.
[quote=Lucas Emanuel]Tenho um Controller com um método para deletar anotado com URI: /delete/id
No entanto, eu quero permitir acesso a ela somente internamente por JS, onde faço uma requisição delete.
Atualmente eu posso digitar no browser: www.dominio.com.br/delete/12 -> deleta o regsitro
Tem como bloaquear isso?
[/quote]
Só configurar o AJAX com o header User-agent e fazer a verificação do mesmo no lado servidor.
[quote=Renato Machado][quote=Lucas Emanuel]Tenho um Controller com um método para deletar anotado com URI: /delete/id
No entanto, eu quero permitir acesso a ela somente internamente por JS, onde faço uma requisição delete.
Atualmente eu posso digitar no browser: www.dominio.com.br/delete/12 -> deleta o regsitro
Tem como bloaquear isso?
[/quote]
Só configurar o AJAX com o header User-agent e fazer a verificação do mesmo no lado servidor.[/quote]
Oi Renato, deixa ver se entendi. Seria mais ou menos assim:
No meu JS:
//Ajax para deletar o registro selecionado
$.ajax({
beforeSend: function(xhr) {
xhr.setRequestHeader("Ajax","ajax");
},
type: "DELETE",
url: $(this).attr("href")
});
E no meu Controller faço a verificação:
if(request.getHeader("Ajax").equals("ajax")){
dao.delete(dao.byId(id));
}
Pelo menos deu certo, permitindo a exclusão somente por Ajax. Quando tento por URL ele retorna 500 causado por NullPointer na no getHeader.
Agora a pergunta: Essa solução seria a correta? OU a solução proposta por garciajj seria mais adequada? POG?
Eu não posso simplesmente anotar o método de remoção do Controller com @Delete ("/delete/{id}")
E no JS colocar:
//Ajax para deletar o registro selecionado
$.ajax({
type: "DELETE",
url: $(this).attr("href")
});
Dessa forma a tentativa de acessar por URL retorna 405, e por Ajax exclui normalmente.
ps. Só nao testei no IE
[quote=Lucas Emanuel]
Pelo menos deu certo, permitindo a exclusão somente por Ajax. Quando tento por URL ele retorna 500 causado por NullPointer na no getHeader.[/quote]
if(request.getHeader("Ajax") && request.getHeader("Ajax").equals("ajax")){
dao.delete(dao.byId(id));
}
[quote=Renato Machado][quote=Lucas Emanuel]
Pelo menos deu certo, permitindo a exclusão somente por Ajax. Quando tento por URL ele retorna 500 causado por NullPointer na no getHeader.[/quote]
if(request.getHeader("Ajax") && request.getHeader("Ajax").equals("ajax")){
dao.delete(dao.byId(id));
}
[/quote]
Bacana, deu certo.