根据表单数据过滤泽西请求

Mik*_*ike 11 jersey jersey-2.0

在Jersey 1.x中,您可以使用ContainerRequest.getFormParameters()对表单数据执行请求筛选,但我没有在Jersey 2.x中看到明显的等效项.我已经实现了ContainerRequestFilter界面,让我可以访问a ContainerRequestContext,但从那里如何获取表单数据?

泽西岛1.x例子:

public class MyFilter implements ContainerRequestFilter {
  public ContainerRequest filter(ContainerRequest request) {
    Form f = request.getFormParameters();

    // examine form data and filter as needed
  }
}
Run Code Online (Sandbox Code Playgroud)

泽西岛2.x例子:

public class MyFilter implements ContainerRequestFilter {
  public void filter(ContainerRequestContext context) {
    // how do I get to the Form data now?
  }
}
Run Code Online (Sandbox Code Playgroud)

Mik*_*ike 18

经过大量的搜索和反复试验后,我找到了一种在Jersey 2中执行此操作的合适方法.您必须手动使用请求实体主体,但是必须小心谨慎地执行此操作以防止后续过滤器和资源也消耗它.下面是一个将实体读入Form对象的简单示例:

@Provider
public class FormDataFilter implements ContainerRequestFilter
{
    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException
    {
        if (requestContext instanceof ContainerRequest)
        {
            ContainerRequest request = (ContainerRequest) requestContext;

            if ( requestContext.hasEntity()
              && MediaTypes.typeEqual(MediaType.APPLICATION_FORM_URLENCODED_TYPE,request.getMediaType()))
            {
                request.bufferEntity();
                Form f = request.readEntity(Form.class);
            }
        }
    } 
}
Run Code Online (Sandbox Code Playgroud)

关键是调用bufferEntity().如果没有这个,实体将被标记为已关闭,并在任何后续读取尝试中导致IllegalStateExceptions.