当前位置: 首页 > 知识库问答 >
问题:

基于表单数据筛选Jersey请求

艾修然
2023-03-14

在泽西1. x中,您可以使用ContainerRequest.getFormParameters()对表单数据进行请求过滤,但我在泽西2. x中没有看到明显的等效项。我已经实现了ContainerRequest estFilter接口,它让我可以访问ContainerRequest estContext,但是从那里如何获取表单数据呢?

泽西1. x示例:

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

    // examine form data and filter as needed
  }
}

球衣2。x示例:

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

共有3个答案

狄鸿禧
2023-03-14

这是一种在不依赖于特定实现类的情况下读取表单实体的方法,即它可以同时使用jer(v2)或CXF(v3)。

@Provider
public class AFilter implements ContainerRequestFilter {

    @Context
    private Providers providers;

    @Override
    public void filter(ContainerRequestContext request) throws IOException {
        if (!request.hasEntity() || !MediaTypes.typeEqual(APPLICATION_FORM_URLENCODED_TYPE, request.getMediaType())) {
            // if not a form ...
            return;
        }

        ByteArrayInputStream resettableIS = toResettableStream(request.getEntityStream());

        Form form = providers.getMessageBodyReader(Form.class, Form.class, new Annotation[0], APPLICATION_FORM_URLENCODED_TYPE)
                             .readFrom(Form.class, Form.class, new Annotation[0], APPLICATION_FORM_URLENCODED_TYPE, null, resettableIS);

        // do something with Form

        resettableIS.reset();
        request.setEntityStream(resettableIS);
    }

    @Nonnull
    private ByteArrayInputStream toResettableStream(InputStream entityStream) throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len;
        while ((len = entityStream.read(buffer)) > -1) {
            baos.write(buffer, 0, len);
        }
        baos.flush();
        return new ByteArrayInputStream(baos.toByteArray());
    }
}

这运行良好,并且具有仅使用JAX-RS API的好处,因此是可移植的。

然而,请注意CXF 2。x使用JAX-RS API 2.0-m10,它还没有类。在这种情况下,可以简单地替换形式。通过多值映射分类。以一些未检查/原始类型警告为代价。

穆睿才
2023-03-14

表单POST参数在http请求体中发送,因此使用ContainerRequestContext可以执行以下操作:

String q = IOUtils.toString(context.getEntityStream(), Charsets.UTF_8);
String[] params = q.split("&");  
Map<String, String> map = new HashMap<>();  
 for (String param : params)  
 {  
     String name = param.split("=")[0];  
     String value = param.split("=")[1];  
     map.put(name, value);  
 }  
阎宝
2023-03-14

经过大量的搜索和反复尝试,我在Jersey 2中找到了一种合适的方法。您必须手动使用请求实体主体,但您必须小心使用不会阻止后续过滤器和资源也使用它的方式。下面是一个将实体读入表单对象的简单示例:

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

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

 类似资料:
  • 我有一个带有键的HashMap,值是字符串。我想通过以字符串“locationid”开头的键值过滤HashMap,并将键中的值返回到字符串数组列表中。HashMap的填充方式如下: 我需要arraylist中的ORG_Id值。 我找不到可以将值放入字符串列表的位置。编译错误是它不识别values()方法。 更新还尝试将筛选后的Hashmap放入另一个Hashmap中,如下所示: 但得到的编译错误是

  • 我正在尝试用Angular 7建立一个动态研究。我正在用多个键从API中获取一个数组:[_id= 我用ngFor显示我所有的结果,我已经用我找到的教程创建了一个过滤管道… 这是我的研究部分: 这是我的过滤管功能: 但是这只会过滤这样的数组:[

  • 在Excel中,根据其他工作表中的列表筛选行非常容易。但是,GoogleSheets没有高级过滤选项。因此,不能像在Excel中那样按列表范围和条件范围过滤列。那么,如何根据Google Sheets中其他工作表的列表筛选行呢? 要筛选的工作表 带有筛选列表的工作表

  • 本文向大家介绍基于jQuery选择器之表单对象属性筛选选择器的实例,包括了基于jQuery选择器之表单对象属性筛选选择器的实例的使用技巧和注意事项,需要的朋友参考一下 注意: 在某些浏览器中,选择器:checked可能会错误选取到<option>元素,所以保险起见换用选择器input:checked,确保只会选取<input>元素 以上这篇jQuery选择器之表单对象属性筛选选择器实例就是小编分享

  • 选择数据表格头部 图标,可以选择表格内字段进行复杂条件筛选; 筛选结果在表格内显示; 选择: 选择图层内字段名称 约束条件: 对选择的该字段指定条件,条件一般有等于、小于、大于等(数值型字段)、或者包含、不包含等(文本型字段)... 约束值:输入需要限制的值 可以支持多种条件同时筛选、或者任选其一条件满足;

  • 我想从一个表中创建一个报告,该表的数据可以根据用户的请求进行排序,我尝试如下 suppliers.blade.php 路线 报告控制器。php 我尝试按Id(Desc)和名称(Z-A)排序,但结果总是按Id(Asc)排序,如下所示