访问请求标头

Shu*_*mar 9 java jax-rs

如何在JAX-RS中实现WriterInterceptor接口时访问请求头?

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

完整代码如下:

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

}
Run Code Online (Sandbox Code Playgroud)

Pau*_*tha 8

你可以注射HttpHeaders.当它被注入时它将是一个线程本地代理,因此它是线程安全的.

@Context
private HttpHeaders headers;
Run Code Online (Sandbox Code Playgroud)

它有方法


更新(测试)

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"));
    }
}
Run Code Online (Sandbox Code Playgroud)


gla*_*tor 3

您可以实现以下代码来查看工作示例: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()));

    }

}
Run Code Online (Sandbox Code Playgroud)