2012-07-18 11 views
8

Estoy desarrollando servicios REST con dos tipos.Interceptación basada en el encabezado HTTP en RESTeasy

  • antes del inicio de sesión no se pasará el token de sesión al encabezado HTTP.
  • después de que se pase el token de sesión de inicio de sesión en cada solicitud.

No quiero incluir @HeaderParam en todos y cada uno de los métodos REST. Quiero interceptarlo primero y basándome en eso quiero verificar la validez de la sesión. Por favor, hágamelo saber

  1. cómo puedo interceptar base a la cabecera de RESTEasy
  2. Cómo evitar la interceptación de algunos métodos

Gracias.

Respuesta

7

He resuelto este problema utilizando PreProcessInterceptor

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.METHOD) 
public @interface Securable { 
    String header() default "session-token"; 
} 

@Provider 
@ServerInterceptor 
public class ValidationInterceptor implements PreProcessInterceptor, AcceptedByMethod { 

    @Context 
    private HttpServletRequest servletRequest; 

    @Override 
    public boolean accept(Class clazz, Method method) { 
    return method.isAnnotationPresent(Securable.class); 
    } 

    @Override 
    public ServerResponse preProcess(HttpRequest httpRequest, ResourceMethod resourceMethod) throws Failure, 
     WebApplicationException { 

    Securable securable = resourceMethod.getMethod().getAnnotation(Securable.class); 
    String headerValue = servletRequest.getHeader(securable.header()); 

    if (headerValue == null){ 
     return (ServerResponse)Response.status(Status.BAD_REQUEST).entity("Invalid Session").build(); 
    }else{ 
     // Validatation logic goes here 
    } 

    return null; 
    } 
} 

La anotación @Securable será utilizado en el servicio de descanso que necesita ser validado.

@Securable 
@PUT 
public Response updateUser(User user) 
+0

Si está usando Jersey, cree una anotación 'x' y en la anotación mencione @NameBinding. Cree ContainerRequestFilter y agregue la anotación 'x' a este filtro. Ahora decora tus servicios con la anotación 'x' – jaks

3

Hay dos enfoques

  1. Uso JAX-RS interceptors - tiene acceso a la solicitud objeto en el interceptor, para que pueda leer los encabezados

  2. Utilizar buenas JavaServlet viejos Filtros - no es un problema que está utilizando JAX-RS, también puede filtrar las solicitudes de REST. De manera similar a los interceptores, filtros tienen acceso al objeto de solicitud, que ha encabezado la información

En ambos casos se puede comprobar si existe HttpSession (request.getSession() método) y que ha requerido atributo.

Puede incluir/excluir solicitudes filtradas en configuración o programáticamente en código Java, mirando la ruta de solicitud.

Cuestiones relacionadas