Access to request headers

How to access request headers in a WriterInterceptor interface implementation in JAX-RS?

context.getHeaders(); //This line gives a set of response headers(not request headers) in the WriterInterceptor implementation. 

Full code below:

 public class GzipFilterWriterInterceptor implements WriterInterceptor { private static final Logger LOG = LoggerFactory.getLogger(GzipFilterWriterInterceptor.class); @Override public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException { MultivaluedMap<String,Object> headers = context.getHeaders(); headers.add("Content-Encoding", "gzip"); final OutputStream outputStream = context.getOutputStream(); context.setOutputStream(new GZIPOutputStream(outputStream)); context.proceed(); } } 
+8
java jax-rs
source share
4 answers

You can implement the code below, see a working example at http://jerseyexample-ravikant.rhcloud.com/rest/jws/say/Hello

 import java.io.IOException; import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerRequestFilter; import javax.ws.rs.container.ContainerResponseContext; import javax.ws.rs.container.ContainerResponseFilter; import javax.ws.rs.ext.Provider; @Provider public class SecurityInterceptor implements ContainerRequestFilter, ContainerResponseFilter { @Override public void filter(ContainerRequestContext reqCtx, ContainerResponseContext respCtx) throws IOException { long startTime=0; System.out.println("Adding ProcessingTime in response headers"); if(reqCtx.getHeaderString("startTime")!=null) startTime = Long.parseLong(reqCtx.getHeaderString("startTime")); respCtx.getHeaders().add("ProcessingTime", String.valueOf(System.currentTimeMillis() - startTime) + " millisecs"); } @Override public void filter(ContainerRequestContext reqCtx) throws IOException { System.out.println("Adding start time in request headers"); reqCtx.getHeaders().add("startTime", String.valueOf(System.currentTimeMillis())); } } 
+2
source share

You can simply enter HttpHeaders . It will be the local proxy as you type, so it is thread safe.

 @Context private HttpHeaders headers; 

He has methods


UPDATE (test)

 import org.glassfish.jersey.filter.LoggingFilter; import org.glassfish.jersey.server.ResourceConfig; import org.glassfish.jersey.test.JerseyTest; import org.junit.Test; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Context; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.Response; import javax.ws.rs.ext.Provider; import javax.ws.rs.ext.WriterInterceptor; import javax.ws.rs.ext.WriterInterceptorContext; import java.io.IOException; import java.util.logging.Logger; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; /** * Run like any other JUnit test. Only one required dependency: * * <dependency> * <groupId>org.glassfish.jersey.test-framework.providers</groupId> * <artifactId>jersey-test-framework-provider-inmemory</artifactId> * <scope>test</scope> * <version>${jersey.version}</version> * </dependency> */ public class HeadersTest extends JerseyTest { @Path("hello") public static class HelloResource { @GET public String get() { return "Hello"; } } @Override public ResourceConfig configure() { return new ResourceConfig(HelloResource.class) .register(HeaderWriter.class) .register(new LoggingFilter(Logger.getAnonymousLogger(), true)); } @Provider public static class HeaderWriter implements WriterInterceptor { @Context private HttpHeaders headers; @Override public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException { context.proceed(); final String header = headers.getHeaderString("X-Request-Header"); context.getHeaders().add("X-Response-Header", header); } } @Test public void doit() { final Response response = target("hello").request() .header("X-Request-Header", "BooYah") .get(); assertThat(response.getHeaderString("X-Response-Header"), is("BooYah")); } } 
+6
source share

This is probably not the best solution, but you can use your interceptor with a ReaderInterceptor. There you can get the headers and save them in the ThreadLocal variable so that you can then access the WriterInterceptor

Also, if you have an annotation-based configuration, you can try entering a ContainerRequestContext with the @Context annotation

+1
source share
 @Provider public class GzipFilterWriterInterceptor implements WriterInterceptor { private static final Logger LOG = LoggerFactory.getLogger(GzipFilterWriterInterceptor.class); // use a context injection @Context private HttpHeaders httpHeaders; @Override public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException { MultivaluedMap<String,Object> headers = context.getHeaders(); headers.add("Content-Encoding", "gzip"); // do stuff with headers if ("Basic Ym9iOnBhc3N3b3Jk".equals(httpHeaders.getRequestHeader("Authorization").get(0))) { //do stuff here, but be careful about the indexoutofbounds... } final OutputStream outputStream = context.getOutputStream(); context.setOutputStream(new GZIPOutputStream(outputStream)); context.proceed(); } } 

A context injection will be introduced for each request, see javadocs .

+1
source share

All Articles