2012-01-19 3 views
6

es decir¿Cómo puedo ejecutar un código común para la mayoría de las solicitudes en mi Spring MVC Web App?

tengo varias direcciones URL asignadas mediante Spring MVC RequestMapping

@RequestMapping(value = "/mystuff", method = RequestMethod.GET) 
@RequestMapping(value = "/mystuff/dsf", method = RequestMethod.GET) 
@RequestMapping(value = "/mystuff/eee", method = RequestMethod.GET) 

etc

Quiero ejecutar alguna acción común antes de alrededor del 90% de mis peticiones. Estos se encuentran en varios controladores.

¿Hay alguna forma de hacerlo sin ahondar en AOP? Y si tengo que usar aspectos, cualquier orientación sobre cómo hacer esto?

Gracias!

Más información:

Es para ejecutar una cierta seguridad específica aplicación - estamos encadenados a una de seguridad de padres establecido, lo que tenemos que leer y poner en, y luego necesitamos acceder a una galleta antes de algunos más de nuestras llamadas, pero no todas.

+0

Por curiosidad, ¿qué es lo que quiere hacer antes de todas las solicitudes? Dependiendo de lo que sea, es probable que ya exista un buen lugar en la pila para ubicarlo. Además, ¿estás usando Spring Security? Eso tiene muchos buenos ganchos también. – cdeszaq

+0

gracias, he actualizado mi pregunta :) – laura

Respuesta

6
+0

Gracias, eso se ve muy útil. ¿Cómo excluiría ciertas URL del interceptor? Estamos usando la configuración de anotación. (Los documentos tienen un enlace roto que menciona espacios de nombres) – laura

+0

Bueno, como muestra el ejemplo aquí: http://www.vaannila.com/spring/spring-interceptor.html, tiene un método dentro del interceptor que le permite inspeccionar el Objeto HttpRequest y decida si se trata de un uri de solicitud que desea interceptar –

+0

¿Esto significa que tendremos que enumerar nuestras exclusiones en este método? Supongo que idealmente desearíamos poder especificar qué URL interceptar usando una anotación en el controlador. – laura

1

El método HandlerInterceptor.preHandle() le permite acceder a la petición y la respuesta y también el controlador de destino. En Spring 3.1, será del tipo HandlerMethod, que le da acceso a la clase y método del controlador objetivo. Si le ayuda, puede intentar excluir todas las clases de controlador por nombre de tipo, que se escribiría fuertemente y sin especificar URL explícitas.

Otra opción sería crear un interceptor asignado a un conjunto de patrones de URL. Consulte la sección sobre configuración de Spring MVC en la documentación de referencia.

3

Interceptor es la solución. Tiene los métodos preHandler y postHandler, que serán llamados antes y después de cada solicitud, respectivamente. Puede enganchar en cada objeto HTTPServletRequest y también pasar unos pocos cavando.

aquí es un ejemplo de código:

@Component 
public class AuthCodeInterceptor extends HandlerInterceptorAdapter { 

    @Override 
    public boolean preHandle(HttpServletRequest request, 
      HttpServletResponse response, Object handler) throws Exception { 

     // set few parameters to handle ajax request from different host 
     response.addHeader("Access-Control-Allow-Origin", "*"); 
     response.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS"); 
     response.addHeader("Access-Control-Max-Age", "1000"); 
     response.addHeader("Access-Control-Allow-Headers", "Content-Type"); 
     response.addHeader("Cache-Control", "private"); 

     String reqUri = request.getRequestURI(); 
     String serviceName = reqUri.substring(reqUri.lastIndexOf("/") + 1, 
       reqUri.length()); 
       if (serviceName.equals("SOMETHING")) { 

       } 
     return super.preHandle(request, response, handler); 
    } 

    @Override 
    public void postHandle(HttpServletRequest request, 
      HttpServletResponse response, Object handler, 
      ModelAndView modelAndView) throws Exception { 

     super.postHandle(request, response, handler, modelAndView); 
    } 
} 
Cuestiones relacionadas