如何在JAX-RS中过滤具有无效参数的请求?

“无效”是指不期望的参数。

例如:

@Path("/") public interface ExampleInterface { @GET @Path("/example") public Response test( @QueryParam("param1") String param1, @QueryParam("param2") String param2 ); } 

然后我称之为".../example?param3=foo"

您可以检查使用ContainerRequestFilter并将传递的参数与定义的参数进行比较:

 @Provider public class RequestParamFilter implements ContainerRequestFilter { @Context private ResourceInfo resourceInfo; @Context private HttpServletRequest servletRequest; @Override public void filter(ContainerRequestContext requestContext) throws IOException { Set validParams = new HashSet(); 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()); } } } } 

不要忘记ServletRequest#getParameterMap返回一个Map,它包含 – 查询字符串参数和在请求正文中传递的参数。 所以也许你需要自己解析查询字符串。

注意:这不会加快您的申请。

谢谢你接受的答案。 它非常有用,我也使用它。 我正在提供修改后的版本,其中包含以下更改:

  • 删除了通过Context Annotation进入的servletRequest。 这不是必需的,因为请求是过滤方法本身的参数。
  • 添加了导入,因为可以有很多关于具有相同名称的不同类的使用(Method,Annotation,ContainerRequestContext,…)
  • 还将错误参数的名称添加到错误消息中

 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 validParams = new HashSet(); Method method = resourceInfo.getResourceMethod(); for (Annotation[] annos : method.getParameterAnnotations()) { for (Annotation anno : annos) { if (anno instanceof QueryParam) { validParams.add(((QueryParam) anno).value()); } } } MultivaluedMap 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()); } } } }