java - ¿Cómo se filtra una solicitud que tiene un parámetro no válido en JAX-RS?
filter resteasy (2)
Por "inválido" me refiero a un parámetro que no se espera.
Por ejemplo:
@Path("/")
public interface ExampleInterface {
@GET
@Path("/example")
public Response test(
@QueryParam("param1") String param1,
@QueryParam("param2") String param2
);
}
Y luego llamo ".../example?param3=foo"
Puede verificar el uso de ContainerRequestFilter y comparar los parámetros pasados con los parámetros definidos:
@Provider
public class RequestParamFilter implements ContainerRequestFilter {
@Context
private ResourceInfo resourceInfo;
@Context
private HttpServletRequest servletRequest;
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
Set<String> validParams = new HashSet<String>();
Method method = resourceInfo.getResourceMethod();
for (Annotation[] annos : method.getParameterAnnotations()) {
for (Annotation anno : annos) {
if (anno instanceof QueryParam) {
validParams.add(((QueryParam) anno).value());
}
}
}
for (String param : servletRequest.getParameterMap().keySet()) {
if (!validParams.contains(param)) {
requestContext.abortWith(Response.status(Status.BAD_REQUEST).build());
}
}
}
}
No olvide que ServletRequest # getParameterMap devuelve un mapa que contiene ambos: parámetros de cadena de consulta y parámetros pasados en el cuerpo de la solicitud. Entonces quizás necesite analizar la cadena de consulta usted mismo.
Nota: Esto no acelerará su aplicación.
Gracias por la respuesta aceptada. Es muy útil y también lo uso. Proporciono una versión modificada, con los siguientes cambios:
- eliminó el servletRequest entrando a través de Annotation de contexto. Esto no es necesario ya que la solicitud es un parámetro del método de filtro en sí.
- agregó las importaciones, ya que puede haber mucho consumo sobre las diferentes clases con el mismo nombre (Método, Anotación, ContainerRequestContext, ...)
- también agregó el nombre del parámetro faltante al mensaje de error
-
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.QueryParam;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.container.ResourceInfo;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.ext.Provider;
@Provider
public class UnexpectedParameterFilter implements ContainerRequestFilter {
@Context
private ResourceInfo resourceInfo;
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
Set<String> validParams = new HashSet<String>();
Method method = resourceInfo.getResourceMethod();
for (Annotation[] annos : method.getParameterAnnotations()) {
for (Annotation anno : annos) {
if (anno instanceof QueryParam) {
validParams.add(((QueryParam) anno).value());
}
}
}
MultivaluedMap<String, String> queryParameters = requestContext.getUriInfo().getQueryParameters();
for (String param : queryParameters.keySet()) {
if (!validParams.contains(param)) {
requestContext.abortWith(Response.status(Status.BAD_REQUEST).entity("unexpected paramter: "+param).build());
}
}
}
}