How to use Jersey interceptors to get request body

后端 未结 4 1987
一向
一向 2020-12-11 00:48

I am using REST-Jersey in my project. All the POST data is send in JSON format and unmarshalled at server-side into respective beans. Something lik

4条回答
  •  伪装坚强ぢ
    2020-12-11 01:53

    Here is one way you can implement, very similar to how Jersey implements its logging filters. You can read the entity and stick it back to the request, so you accidentally do not consume it in your filter.

    import com.sun.jersey.api.container.ContainerException;
    import com.sun.jersey.core.util.ReaderWriter;
    import com.sun.jersey.spi.container.ContainerRequest;
    import com.sun.jersey.spi.container.ContainerRequestFilter;
    
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    
    public class JerseyFilter implements ContainerRequestFilter {
    
        @Override
        public ContainerRequest filter(ContainerRequest request) {
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            InputStream in = request.getEntityInputStream();
            final StringBuilder b = new StringBuilder();
            try {
                if (in.available() > 0) {
                    ReaderWriter.writeTo(in, out);
    
                    byte[] requestEntity = out.toByteArray();
                    printEntity(b, requestEntity);
    
                    request.setEntityInputStream(new ByteArrayInputStream(requestEntity));
                }
                return request;
            } catch (IOException ex) {
                throw new ContainerException(ex);
            }
    
        }
    
        private void printEntity(StringBuilder b, byte[] entity) throws IOException {
            if (entity.length == 0)
                return;
            b.append(new String(entity)).append("\n");
            System.out.println("#### Intercepted Entity ####");
            System.out.println(b.toString());
        }
    }
    

提交回复
热议问题