下面列出了怎么用javax.ws.rs.container.ContainerResponseContext的API类实例代码及写法,或者点击链接到github查看源代码。
@Test
public void corsResponseFilter_AnyOriginAndDisallowCredentialsGiven_AddsAnyOriginAndNoVaryHeader() throws IOException {
CorsFilter filter = new CorsFilter.Builder()
.disallowCredentials()
.build();
ContainerRequestContext request = createActualRequestMock(DEFAULT_HOST, DEFAULT_ORIGIN, HttpMethod.GET);
ContainerResponseContext response = mock(ContainerResponseContext.class);
MultivaluedMap<String, Object> headers = new MultivaluedHashMap<>();
when(response.getHeaders()).thenReturn(headers);
filter.filter(request, response);
assertEquals("*", headers.getFirst(CorsHeaders.ACCESS_CONTROL_ALLOW_ORIGIN));
assertNull(headers.getFirst(HttpHeaders.VARY));
verify(response).getHeaders();
verifyZeroInteractions(response);
}
@Test
public void corsResponseFilter_OriginAndAllowCredentialsGiven_AddsPassedOriginAndVaryHeader() throws IOException {
CorsFilter filter = new CorsFilter.Builder()
.allowOrigin(DEFAULT_ORIGIN)
.allowCredentials()
.build();
ContainerRequestContext request = createActualRequestMock(DEFAULT_HOST, DEFAULT_ORIGIN, HttpMethod.GET);
ContainerResponseContext response = mock(ContainerResponseContext.class);
MultivaluedMap<String, Object> headers = new MultivaluedHashMap<>();
when(response.getHeaders()).thenReturn(headers);
filter.filter(request, response);
assertEquals(DEFAULT_ORIGIN, headers.getFirst(CorsHeaders.ACCESS_CONTROL_ALLOW_ORIGIN));
assertEquals(CorsHeaders.ORIGIN, headers.getFirst(HttpHeaders.VARY));
verify(response).getHeaders();
verifyZeroInteractions(response);
}
@Override
public void processResponse(ContainerRequestContext requestContext,
ContainerResponseContext responseContext,
ResourceInfo resourceInfo) {
MediaType mediaType = responseContext.getMediaType();
if (mediaType != null && MediaType.APPLICATION_JSON_TYPE.equals(mediaType)) {
Object responseData = responseContext.getEntity();
WrapperResponseEntity jsonResponse;
if (responseData instanceof WrapperResponseEntity) {
jsonResponse = (WrapperResponseEntity) responseData;
} else {
jsonResponse = new WrapperResponseEntity(ResponseCode.OK);
jsonResponse.setData(responseData);
}
responseContext.setStatus(ResponseCode.OK.getCode());
responseContext.setEntity(jsonResponse);
}
}
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
Long requestTime = requestTimestamps.remove(servletRequest);
Duration requestDuration = null;
if (requestTime != null) {
long responseTime = System.nanoTime();
requestDuration = Duration.nanos(responseTime - requestTime);
}
String method = requestContext.getMethod();
boolean isInteresting = !UNINTERESTING_METHODS.contains(method.toUpperCase())
|| (requestDuration != null && requestDuration.isLongerThan(REQUEST_DURATION_LOG_POINT));
LogLevel logLevel = isInteresting ? LogLevel.DEBUG : LogLevel.TRACE;
logResponse(requestContext, responseContext, requestDuration, logLevel);
}
@Override
public void filter(ContainerRequestContext containerRequestContext, ContainerResponseContext containerResponseContext) throws IOException {
if (containerResponseContext.getStatus() == Response.Status.OK.getStatusCode()) {
Object o = containerResponseContext.getEntity();
JsonResponseWrapper wrapper;
Class clazz = o.getClass();
if (List.class.isAssignableFrom(clazz)) {
wrapper = new JsonResponseWrapper((List) o);
} else if (SearchResult.class.isAssignableFrom(clazz)) {
wrapper = new JsonResponseWrapper((SearchResult) o);
} else {
wrapper = new JsonResponseWrapper(o);
}
containerResponseContext.setEntity(wrapper, containerResponseContext.getEntityAnnotations(), containerResponseContext.getMediaType());
}
}
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
throws IOException {
final String origin = requestContext.getHeaderString("Origin");
if (originMatchUtil.matches(origin)) {
MultivaluedMap<String, Object> headers = responseContext.getHeaders();
headers.add("Access-Control-Allow-Origin", origin);
headers.add("Access-Control-Allow-Credentials", String.valueOf(corsConfig.getAllowCredentials()));
headers.add("Access-Control-Allow-Methods", String.join(",", corsConfig.getAllowedMethods()));
final String allowedHeaders;
if (corsConfig.getAllowedHeaders() != null) {
allowedHeaders = String.join(",", corsConfig.getAllowedHeaders());
} else {
allowedHeaders = requestContext.getHeaderString("Access-Control-Request-Headers");
}
headers.add("Access-Control-Allow-Headers", allowedHeaders);
}
}
@Override
public void filter(ContainerRequestContext req, ContainerResponseContext res) {
int status = res.getStatus();
// We are only interested in recording the response status if it was an error
// (either a 4xx or 5xx). No point in counting the successful responses
if (status >= 400) {
PrometheusExporter.instance().recordResponseError(status, req.getMethod());
}
// Record request duration if timestamp property is present
// and only if it is relevant (skip pictures)
if (req.getProperty(METRICS_REQUEST_TIMESTAMP) != null &&
contentTypeIsRelevant(res)) {
long time = (long) req.getProperty(METRICS_REQUEST_TIMESTAMP);
long dur = System.currentTimeMillis() - time;
LOG.trace("Duration is calculated as " + dur + " ms.");
PrometheusExporter.instance().recordRequestDuration(dur, req.getMethod());
}
}
@Test
public void corsResponseFilter_ExposedHeadersGiven_AddsExposeHeadersHeader() throws IOException {
CorsFilter filter = new CorsFilter.Builder()
.exposeHeader("h1")
.exposeHeader("h2")
.build();
ContainerRequestContext request = createActualRequestMock(DEFAULT_HOST, DEFAULT_ORIGIN, HttpMethod.GET);
ContainerResponseContext response = mock(ContainerResponseContext.class);
MultivaluedMap<String, Object> headers = new MultivaluedHashMap<>();
when(response.getHeaders()).thenReturn(headers);
filter.filter(request, response);
assertEquals("h1,h2", headers.getFirst(CorsHeaders.ACCESS_CONTROL_EXPOSE_HEADERS));
verify(response).getHeaders();
verifyZeroInteractions(response);
}
/**
* Clean up after the request
*/
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
throws IOException {
_LOG.debug("Cleaning up the Shiro Security Context");
Subject subject = ThreadContext.getSubject();
ThreadContext.unbindSecurityManager();
ThreadContext.unbindSubject();
if(subject != null && !subject.isAuthenticated()) {
// Not authenticated. Check for incoming session cookie
Cookie cookie = requestContext.getCookies().get(SESSION_COOKIE_NAME);
// If we have a session cookie then it should be deleted
if(cookie != null) {
_LOG.debug("The subject associated with this request is not authenticated, removing the session cookie");
responseContext.getHeaders().add(SET_COOKIE, getDeletionCookie(requestContext));
}
}
}
@Test
public void shouldNotSetContentTypeOnResponseWithoutMediaType_onFilter() throws Exception {
// Given
final ContainerRequestContext mockContainerRequestContext = mock(ContainerRequestContext.class);
final ContainerResponseContext mockContainerResponseContext = mock(ContainerResponseContext.class);
when(mockContainerResponseContext.getMediaType()).thenReturn(null);
final MultivaluedMap<String, Object> mockHeadersMap = mock(MultivaluedMap.class);
when(mockContainerResponseContext.getHeaders()).thenReturn(mockHeadersMap);
final CharsetResponseFilter charsetResponseFilter = new CharsetResponseFilter();
// When
charsetResponseFilter.filter(mockContainerRequestContext, mockContainerResponseContext);
// Then
verifyZeroInteractions(mockHeadersMap);
}
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
throws IOException {
if(responseContext.getEntityClass() == Template.class) {
SuspendableContainerResponseContext ctx = (SuspendableContainerResponseContext) responseContext;
ctx.suspend();
Template template = (Template) responseContext.getEntity();
try {
template.render(requestContext.getRequest())
.subscribe(resp -> {
// make sure we avoid setting a null media type because that causes
// an NPE further down
if(resp.getMediaType() != null)
ctx.setEntity(resp.getEntity(), null, resp.getMediaType());
else
ctx.setEntity(resp.getEntity());
ctx.setStatus(resp.getStatus());
ctx.resume();
}, err -> {
ctx.resume(err);
});
}catch(Throwable t) {
ctx.resume(t);
}
}
}
@Test
public void corsResponseFilter_AnyOriginAndAllowCredentialsGiven_AddsPassedOriginAndVaryHeader() throws IOException {
CorsFilter filter = new CorsFilter.Builder()
.allowCredentials()
.build();
ContainerRequestContext request = createActualRequestMock(DEFAULT_HOST, DEFAULT_ORIGIN, HttpMethod.GET);
ContainerResponseContext response = mock(ContainerResponseContext.class);
MultivaluedMap<String, Object> headers = new MultivaluedHashMap<>();
when(response.getHeaders()).thenReturn(headers);
filter.filter(request, response);
assertEquals(DEFAULT_ORIGIN, headers.getFirst(CorsHeaders.ACCESS_CONTROL_ALLOW_ORIGIN));
assertEquals(CorsHeaders.ORIGIN, headers.getFirst(HttpHeaders.VARY));
verify(response).getHeaders();
verifyZeroInteractions(response);
}
@Override
public void filter(
ContainerRequestContext requestContext, ContainerResponseContext responseContext) {
MultivaluedMap<String, Object> headers = responseContext.getHeaders();
// allow AJAX from everywhere
headers.add("Access-Control-Allow-Origin", component.getAPIAllowedOrigin());
headers.add("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE");
headers.add("Access-Control-Allow-Headers", "Authorization,Content-Type");
}
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
throws IOException {
Object entity = responseContext.getEntity();
if (entity instanceof AsyncResponse) {
AsyncResponse asyncResponse = (AsyncResponse) entity;
Class<?> returnType = asyncResponse.returnType;
MultivaluedMap<String, Object> httpHeaders = responseContext.getHeaders();
if (AsyncUtil.isOSGIAsync(registration.getReference()) && AsyncReturnUtil.isAsyncType(returnType)) {
httpHeaders.add(JaxRSConstants.JAXRS_RESPHEADER_ASYNC_TYPE, returnType.getName());
}
responseContext.setEntity(asyncResponse.response);
}
}
@Override
public void filter(final ContainerRequestContext req, final ContainerResponseContext res) {
if ((GET.equals(req.getMethod()) || HEAD.equals(req.getMethod()))
&& SUCCESSFUL.equals(res.getStatusInfo().getFamily()) && maxAge > 0) {
final CacheControl cc = new CacheControl();
cc.setMaxAge(maxAge);
cc.setMustRevalidate(mustRevalidate);
cc.setNoCache(noCache);
res.getHeaders().add(CACHE_CONTROL, cc);
}
}
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
String origin = requestContext.getHeaderString("Origin");
if (ALLOWEDHOSTSLIST != null) {
if (ALLOWEDHOSTSLIST.contains(origin)) {
responseContext.getHeaders().putSingle("Access-Control-Allow-Origin", origin);
responseContext.getHeaders().putSingle("Access-Control-Allow-Methods", ALLOWEDMETHODS);
responseContext.getHeaders().putSingle("Access-Control-Allow-Headers", ALLOWEDHEADERS);
responseContext.getHeaders().putSingle("Vary", "Origin");
}
}
}
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
String origin = requestContext.getHeaderString("Origin");
if (ALLOWEDHOSTSLIST != null) {
if (ALLOWEDHOSTSLIST.contains(origin)) {
responseContext.getHeaders().putSingle("Access-Control-Allow-Origin", origin);
responseContext.getHeaders().putSingle("Access-Control-Allow-Methods", ALLOWEDMETHODS);
responseContext.getHeaders().putSingle("Access-Control-Allow-Headers", ALLOWEDHEADERS);
responseContext.getHeaders().putSingle("Vary", "Origin");
}
}
}
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
throws IOException {
MultivaluedMap<String, Object> headers = responseContext.getHeaders();
headers.add("Access-Control-Allow-Origin", "*");
headers.add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
headers.add("Access-Control-Allow-Headers", "Content-Type");
}
@Test
public void shouldCopyAccessControleHeadersToResponse() {
CorsFilter filter = new CorsFilter();
ContainerRequestContext reqContext = mock(ContainerRequestContext.class);
when(reqContext.getHeaderString("Access-Control-Request-Headers")).thenReturn("*");
ContainerResponseContext resContext = mock(ContainerResponseContext.class);
MultivaluedMap<String, Object> resHeaders = mock(MultivaluedMap.class);
when(resContext.getHeaders()).thenReturn(resHeaders);
filter.filter(reqContext, resContext);
verify(resHeaders).add("Access-Control-Allow-Headers", "*");
}
@Override
public void filter(ContainerRequestContext requestContext,
ContainerResponseContext responseContext) {
Scope scope = (Scope)requestContext.getProperty(TRACING_SCOPE);
if (scope != null) {
scope.close();
}
Span span = (Span) requestContext.getProperty(TRACING_SPAN);
if (span != null) {
span.finish();
}
finishAndCloseActiveSpan();
}
/**
* Post-processes all the REST requests. Remove tenant's information from thread
*/
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
logger.debug("IN");
TenantManager.unset();
logger.debug("OUT");
}
@Override
public void filter(ContainerRequestContext request, ContainerResponseContext response)
{
// destroy identity if identity is still attached to the request
Optional.ofNullable(request.getProperty(AUTHENTICATED_IDENTITY))
.map(Identity.class::cast)
.ifPresent(Identity::destroy);
}
@Test
public void responseFilter_NoOriginGiven_NoCorsHeadersAdded() throws IOException {
CorsFilter filter = new CorsFilter.Builder().build();
ContainerRequestContext request = mock(ContainerRequestContext.class);
ContainerResponseContext response = mock(ContainerResponseContext.class);
filter.filter(request, response);
verifyZeroInteractions(response);
}
@Test
public void testFilterContainerETagSet() {
ContainerResponseContext containerResponse = getContext("etag");
ETagFilter eTagFilter = new ETagFilter();
eTagFilter.filter(null, containerResponse);
EntityTag eTag = (EntityTag) containerResponse.getHeaders().getFirst(HttpHeaders.ETAG);
assertNotNull(eTag);
assertEquals(eTag.getValue(), "etag");
}
/**
* {@inheritDoc}
*/
@Override
public void filter(ContainerRequestContext requestContext,
ContainerResponseContext responseContext) throws IOException {
int status = responseContext.getStatus();
if (status == 404 || status == UnprocessableEntityException.STATUS) {
String path = mappedViewPath();
if (path != null) {
responseContext.setEntity(Viewables.newDefaultViewable(path),
new Annotation[0], MediaType.TEXT_HTML_TYPE);
responseContext.setStatus(Response.Status.OK.getStatusCode());
}
}
}
@Override
public void filter(ContainerRequestContext reqC, ContainerResponseContext respC)
throws IOException {
if (mc.getUriInfo().getQueryParameters().containsKey("_format")) {
mc.put(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
}
}
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
throws IOException {
// in case the filter aborts the request, we never arrive here, but if it is not aborted
// there is case when pac4j sets things on the response, this is the role of this method.
// unfortunately, if skipResponse is used, we can't do that because pac4j considers
// its abort response in the same way as the normal response
if (skipResponse == null || !skipResponse) {
new RequestJaxRsContext(providers, requestContext).contextOrNew().getResponseHolder()
.populateResponse(responseContext);
}
}
/**
* Allows the request to go through as an exception
*
* @param requestContext the request context
* @param responseContext the response context
* @param origin the request's origin
*/
private void allowExceptionCors(ContainerRequestContext requestContext, ContainerResponseContext responseContext, String origin) {
//Gets the method header
String methodHeader = requestContext.getHeaderString("Access-Control-Request-Method");
//Gets the request headers
String requestHeaders = requestContext.getHeaderString("Access-Control-Request-Headers");
//Get the headers from the response context
MultivaluedMap<String, Object> headers = responseContext.getHeaders();
//Set multiple fields in the header
headers.putSingle("Access-Control-Allow-Origin", origin);
headers.putSingle("Access-Control-Allow-Credentials", "true");
headers.putSingle("Access-Control-Allow-Methods", methodHeader);
headers.putSingle("Access-Control-Allow-Headers", "x-requested-with," + (requestHeaders == null ? "" : requestHeaders));
}
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
throws IOException {
MultivaluedMap<String, Object> headers = responseContext.getHeaders();
headers.add("Access-Control-Allow-Origin", "*");
headers.add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
headers.add("Access-Control-Allow-Headers", "Content-Type");
}
@Override
public void filter(ContainerRequestContext req, ContainerResponseContext res) throws IOException {
MultivaluedMap<String, Object> headers = res.getHeaders();
headers.add("Access-Control-Allow-Origin", "*");
headers.add("Access-Control-Allow-Methods", "GET, POST");
headers.add("Access-Control-Max-Age", "86400");
headers.add("Access-Control-Allow-Credentials", "true");
headers.add("Access-Control-Allow-Headers", "Content-Type");
}