Apresentação da arquitetura de interceptors do Struts 2, que possibilita a programação orientada a aspectos. Os interceptors têm o objetivo de capturar as requisições feitas às actions antes que elas cheguem ao seu destino. Veremos como eles funcionam, como eles são configurados e o que fazer para customizá-los.
Para que serve:
Este artigo serve para desenvolvedores que têm interesse em conhecer como funcionam os interceptors do Struts 2 e em como desenvolver o seu próprio código para interceptar chamadas às actions. Os interceptors são a forma de programar orientado a aspectos usando o framework.
Em que situação o tema é útil:
As pessoas que desejam programar orientado a aspectos no Struts 2 e não conhecem a arquitetura dos interceptors encontrarão neste artigo uma abordagem simples e prática para entender, configurar e criar seu próprio código para interceptar requisições.
AOP com Struts 2:
O Struts 2 é um framework web que nasceu da fusão dos projetos Struts e WebWork. Dentre suas novas funcionalidades estão o suporte a interceptors, que são códigos executados depois que uma requisição é feita e antes que ela chegue à action à qual se destina. Os interceptors dão ao framework o suporte à programação orientada a aspectos (AOP), de forma que as actions não possuam qualquer referência a eles.
O Struts 2 é um framework MVC baseado em ações (action-based framework), nascido da união dos projetos Struts e WebWork. Mesmo tendo herdado o nome Struts, a maior parte das suas funcionalidades foram herdadas do WebWork, o que torna o Struts e o Struts 2 frameworks bastante diferentes.
Já a AOP permite “plugar” funcionalidades no código, também conhecidas como aspectos. A grande vantagem é que o código não possui conhecimento a respeito dos aspectos, o que permite habilitá-los e desabilitá-los sem que seja necessária qualquer alteração no código que é beneficiado pela sua presença. No Struts 2, o suporte à AOP é feito através do uso de interceptors.
Neste artigo será abordada a arquitetura de interceptors do Struts 2, de forma que o leitor entenderá seus conceitos e funcionamento, bem como a forma de configurá-los. O leitor também aprenderá a criar seus próprios códigos de interceptação como forma de habilitar o AOP em suas aplicações.
Interceptors
Um interceptor é um objeto que envolve a action, de forma que a requisição passa por ele antes de passar pela action e volta a passar por ele depois que a action é executada, antes que ocorra o redirecionamento para um result. Quem é responsável por fazer a chamada ao interceptor é o Struts 2.
A Figura 1 mostra onde o interceptor está posicionado quando uma requisição acontece.
Figura 1. Esquema mostrando a interceptação da chamada a uma action por um interceptor.
Na verdade, não existe a restrição de que apenas um interceptor pode capturar a invocação de uma action. Podem existir vários fazendo este papel, os quais executam em cadeia numa ordem definida. Cada interceptor é responsável por executar a sua tarefa e solicitar para o Struts 2 a invocação do próximo na sequência. Este fluxo ocorre até que não existam mais interceptors, e neste momento a action é invocada. A Figura 2 mostra como funciona o fluxo da requisição quando na presença de diversos interceptors. É importante perceber que a sequência de invocação passa pelos Interceptors 1, 2 e depois 3. Isto é, existe uma ordem bem definida e que sempre é seguida.
Figura 2. Esquema mostrando o fluxo da requisição a uma action passando por diversos interceptors.
A ordem de execução dos interceptors deve ser montada cuidadosamente. Em algumas situações, a execução de A é pré-requisito para a execução de B, o que obriga que A deve sempre ser executado antes de B. É importante também atentar para o detalhe de que um interceptor também pode interromper a chamada em cadeia, fazendo com que a requisição nem chegue à action. Imagine, por exemplo, um código que verifica se o usuário logado que fez a requisição pode executar o método da action. Caso ele não tenha autorização, este interceptor de segurança poderia interromper a chamada à action e redirecioná-lo automaticamente para uma página informando que o acesso foi negado.
...