当前位置: 首页 > 面试题库 >

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

唐元青
2023-03-14
问题内容

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

例如:

@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<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());
            }
        }
    }

}

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

注意:这不会加快您的应用程序的速度。



 类似资料:
  • 我想验证一个发出请求的用户。为此,我有两个过滤器:AuthenticationFilter和authorizationfilter。AuthenticationFilter从请求中提取令牌并从数据库中查找用户。AuthorizationFilter检查该用户(由上一个筛选器检索)是否具有必要的权限。我有两个可能的解决方案,想知道每一个的利弊,我应该使用哪一个。我还需要访问实际业务逻辑中的用户。我的

  • 当im tryin通过我的JAX-RS API得到一个Post请求时,它总是发送一个空值。我不知道Jackson注释是否不正确,或者是否需要使用ObjectMapper。 以下是我的课程: 这是B班 我的JSON文件: 我想让Jackson读取该文件,然后将对象类型ClassA添加到列表中(问题是甚至没有读取它)。这是API代码: 我已经添加了文件

  • 问题内容: 我正在尝试使用HttpServletRequest从发布的表单中检索传递给jax- rs的一些参数。但是,我的请求对象始终为我的参数返回空值。我不是要这样做吗?我已经在下面发布了代码,并发送了示例请求。 这是我的服务: 请求示例: 问题答案:

  • 假设我有一个简单的Java数据类: 注意:在实践中,我使用不可变来生成这个,但是为了简单起见,我在这里显示了一个POJO。 要记录响应的模型,即使返回类型是,我也可以引用中的类: 基于此,斯威格将正确记录以下内容: 型号: 示例值: 为了记录主体的模型,我直接在代码中使用类,Swagger找到它并根据需要记录它: 我也想支持部分更新。我不能使用POJO本身,因为POJO中的所有字段都是强制性的,当

  • 我想通过Spring过滤器或方面记录超文本传输协议请求中的请求参数。我尝试了不同的方法,但请求参数为空或未调用方法。我使用的是POSTMAN,它是一个POST请求。 http://localhost:8080/available data 请求正文示例: {“keyUserAgent”:“CFNetwork/1209 Darwin/20.2.0”,“locale”:“en_US”,“eid”:“8

  • 直接打印axios的请求拦截的config时是包含那些值为undefined的参数的,但是在浏览器和服务端中却没有了,请问这是哪个环节的问题?应该如何避免这种情况? 打印config的时候params是包含latitude和longitude的 Chrome网络中却不包含这两个参数