【问题标题】:HttpServletRequest getParameterMap - Fetch the form parameters aloneHttpServletRequest getParameterMap - 单独获取表单参数
【发布时间】:2020-01-20 12:39:08
【问题描述】:

HttpServletRequest 的getParameterMap() 返回查询参数和发布的表单数据。

我可以单独从UriInfo.getQueryParameters() 获取查询参数。

但是我需要将表单参数单独作为MultivaluedMap 类似于查询参数,有没有办法获取它?

已编辑:

我很抱歉没有说清楚。我正在尝试在过滤器/拦截器中获取表单参数。

【问题讨论】:

  • 这能回答你的问题吗? Retrieve POST parameters only (Java)
  • 很遗憾,如果没有手动操作,您将无法做到这一点。
  • 你使用的是什么 JAX-RS 实现?
  • @PaulSamsotha 我正在使用泽西岛
  • 查看我的更新答案。

标签: java filter jax-rs


【解决方案1】:

您可以将MultivaluedMap 作为参数放在资源方法中。这将是请求的正文。 JAX-RS 会为您将所有参数放入地图中。

@POST
@Consumes("application/x-www-form-urlencoded")
public Response post(@Context UriInfo uriInfo, MultivaluedMap params) {}

更新(编辑后的帖子)

所以如果你想获取过滤器中的参数,你可以从ContainerRequestContext获取body。对于 Jersey,您可以将 ContainerRequestContext 转换为 Jersey 的 ContainerRequest 实现,而不是使用 context.getEntityStream() 获取 InputStream。这将使您可以访问方法bufferEntity()readEntity()。这些方法将允许您轻松获取表单参数。您需要缓冲实体,以便稍后在需要将其传递给您的资源方法时对其进行读取。

@Provider
public class MyFilter implements ContainerRequestFilter {

    @Override
    public void filter(ContainerRequestContext context) throws IOException {
        if (MediaTypes.typeEqual(MediaType.APPLICATION_FORM_URLENCODED_TYPE, context.getMediaType())) { {
            return;
        }
        ContainerRequest request = (ContainerRequest) context;
        request.bufferEntity();
        Form form = request.readEntity(Form.class);
        MultivaluedMap params<String, String> = form.asMap();
        MultivaluedMap<String, String> query = context.getUriInfo().getQueryParameters();
    }
}

如果您只想对特定资源方法使用过滤器,则可以使用Name BindingDynamic Binding

如果由于某种原因readEntity() 返回一个空地图(我见过很少有人遇到此问题),您可以尝试通过内部属性检索Form

Object formProperty = request.getProperty(InternalServerProperties.FORM_DECODED_PROPERTY);
if (formProperty != null) {
    Form for = (Form) formProperty;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 2014-05-19
    • 2017-03-21
    相关资源
    最近更新 更多