简体   繁体   English

验证JAX-RS中的PUT,POST方法的空主体请求

[英]Validate empty body request of PUT, POST method in JAX-RS

I'm curious if there is an annotation/filter/interceptor capability in JAX-RS to detect if PUT or POST method contains an empty body. 我很好奇JAX-RS中是否有注释/过滤器/拦截器功能来检测PUT或POST方法是否包含空主体。

Currently I have method that, if request has empty body, possibly throws NPE. 目前,我有一种方法,如果请求的内容为空,则可能会抛出NPE。

@PUT
@Produces("application/json")
@Consumes("application/json")
@Path("/update/{id}")
public Response updateCustomer(@PathParam("id") final String customerIdStr, final CustomerJson customer) {
    // if request body is empty -> customer == null
    return Response.ok().build();
}

I can check customer for null . 我可以检查customer是否为 But since I have plenty of such methods, it's better to have filter to do such validation. 但是,由于我有很多这样的方法,因此最好使用过滤器进行这种验证。

Please! 请!

您是否尝试通过在CustomerJson方法参数上使用@NotNull批注来使用Bean验证?

Interceptors read the HTTP body and I dont find a way to send the body for further processing. 拦截器读取HTTP正文,但我没有找到发送正文进行进一步处理的方法。 But you can do this by Servlet Filter and HTTP servlet request wrapper, 但是您可以通过Servlet过滤器和HTTP Servlet请求包装器来完成此操作,

public class EmptyCheckFilter implements javax.servlet.Filter {

  @Override
  public void doFilter(ServletRequest request, ServletResponse response,
      FilterChain chain) throws IOException, ServletException {

    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;

    if (req.getMethod().equals("POST") || req.getMethod().equals("PUT")) {
      boolean dirty = false;
      HttpRequestWrapper wrapper = new MyHTTPRequestWrapper(req);
      try {
    // check body is empty by wrapper.getBody() and set dirty = true;
      } catch (Exception e) {
      }
      if (dirty) {
        res.sendError(400, "Invalid input");
      } else
        chain.doFilter(wrapper, response);
    } else
      chain.doFilter(request, response);
  }

  @Override
  public void destroy() {
  }

  @Override
  public void init(FilterConfig arg0) throws ServletException {
  }
}

public class MyHTTPRequestWrapper extends HttpServletRequestWrapper {

  private final String body;

  public MyHTTPRequestWrapper(HttpServletRequest request) throws IOException {
    super(request);
    StringBuilder stringBuilder = new StringBuilder();
    BufferedReader bufferedReader = null;
    try {
      InputStream inputStream = request.getInputStream();
      if (inputStream != null) {
        if (request.getCharacterEncoding() != null)
        bufferedReader = new BufferedReader(new InputStreamReader(inputStream, request.getCharacterEncoding()));
        else
          bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        char[] charBuffer = new char[128];
        int bytesRead = -1;
        while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
          stringBuilder.append(charBuffer, 0, bytesRead);
        }
      } else {
        stringBuilder.append("");
      }
    } catch (IOException ex) {
      throw ex;
    } finally {
      if (bufferedReader != null) {
        try {
          bufferedReader.close();
        } catch (IOException ex) {
          throw ex;
        }
      }
    }
    body = stringBuilder.toString();
  }

  @Override
  public ServletInputStream getInputStream() throws IOException {
    final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(
        body.getBytes());
    ServletInputStream servletInputStream = new ServletInputStream() {
      public int read() throws IOException {
        return byteArrayInputStream.read();
      }
    };
    return servletInputStream;
  }

  @Override
  public BufferedReader getReader() throws IOException {
    return new BufferedReader(new InputStreamReader(this.getInputStream()));
  }

  public String getBody() {
    return this.body;
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM