下面列出了怎么用javax.ws.rs.core.CacheControl的API类实例代码及写法,或者点击链接到github查看源代码。
@Path("/{s:.+}")
@GET
public Response image() {
String requestPath = uriInfo.getPath();
Matcher matcher = IMAGE_PATTERN.matcher(requestPath);
if (!matcher.matches()) {
throw new NotFoundException(requestPath);
}
CacheControl cacheControl = new CacheControl();
cacheControl.setMaxAge(Integer.MAX_VALUE);
String filePath = matcher.group(2);
Optional<Resource> resource = cache.get(requestPath);
if (resource.isPresent()) {
return Response.ok(resource.get()).cacheControl(cacheControl).build();
}
Resource file = fileRepository.get(filePath).orElseThrow(() -> new NotFoundException("missing file, requestPath=" + filePath));
java.nio.file.Path targetPath = cache.path().resolve(requestPath);
imageScalar.scale(file, new ImageSize(matcher.group(1)), targetPath);
resource = cache.get(requestPath);
if (resource.isPresent()) {
return Response.ok(resource.get()).type(MediaTypes.getMediaType(filePath)).cacheControl(cacheControl).build();
}
throw new NotFoundException("missing image, requestPath=" + requestPath);
}
@Path("/{s:.+}")
@GET
public Response image() {
String requestPath = uriInfo.getPath();
Matcher matcher = IMAGE_PATTERN.matcher(requestPath);
if (!matcher.matches()) {
throw new NotFoundException(requestPath);
}
CacheControl cacheControl = new CacheControl();
cacheControl.setMaxAge(Integer.MAX_VALUE);
String filePath = matcher.group(2);
Optional<Resource> resource = cache.get(requestPath);
if (resource.isPresent()) {
return Response.ok(resource.get()).cacheControl(cacheControl).build();
}
Resource file = fileRepository.get(filePath).orElseThrow(() -> new NotFoundException("missing file, requestPath=" + filePath));
java.nio.file.Path targetPath = cache.path().resolve(requestPath);
imageScalar.scale(file, new ImageSize(matcher.group(1)), targetPath);
resource = cache.get(requestPath);
if (resource.isPresent()) {
return Response.ok(resource.get()).type(MediaTypes.getMediaType(filePath)).cacheControl(cacheControl).build();
}
throw new NotFoundException("missing image, requestPath=" + requestPath);
}
/**
* Apply cache policy to a response.
*
* @param response The response builder.
* @param eTag The ETag of the resource.
* @param lastModified The last modified date of the resource.
* @param isToBeCached Boolean to set whether we should define maxage of cache control
* @return The response builder with the cache policy.
*/
private static Response.ResponseBuilder applyCachePolicyToResponse(Response.ResponseBuilder response, EntityTag eTag, Date lastModified, boolean isToBeCached) {
if (isToBeCached) {
CacheControl cc = new CacheControl();
cc.setMaxAge(CACHE_SECOND);
cc.setNoTransform(false);
cc.setPrivate(false);
Calendar expirationDate = Calendar.getInstance();
expirationDate.add(Calendar.SECOND, CACHE_SECOND);
response.cacheControl(cc)
.expires(expirationDate.getTime());
}
return response.lastModified(lastModified)
.tag(eTag);
}
/**
* If request was authenticated via JSON Web Token add a new token if <code>aud</code> was
* {@link MCRRestAPIAuthentication#AUDIENCE}.
*
* If the response has a status code that represents a client error (4xx), the JSON Web Token is ommited.
* If the response already has a JSON Web Token no changes are made.
*/
private static void addJWTToResponse(ContainerRequestContext requestContext,
ContainerResponseContext responseContext) {
MCRSession currentSession = MCRSessionMgr.getCurrentSession();
boolean renewJWT = Optional.ofNullable(requestContext.getProperty(PROP_RENEW_JWT))
.map(Boolean.class::cast)
.orElse(Boolean.FALSE);
Optional.ofNullable(requestContext.getHeaderString(HttpHeaders.AUTHORIZATION))
.filter(s -> s.startsWith("Bearer "))
.filter(s -> !responseContext.getStatusInfo().getFamily().equals(Response.Status.Family.CLIENT_ERROR))
.filter(s -> responseContext.getHeaderString(HttpHeaders.AUTHORIZATION) == null)
.map(h -> renewJWT ? ("Bearer " + MCRRestAPIAuthentication
.getToken(currentSession.getUserInformation(), currentSession.getCurrentIP())
.orElseThrow(() -> new InternalServerErrorException("Could not get JSON Web Token"))) : h)
.ifPresent(h -> {
responseContext.getHeaders().putSingle(HttpHeaders.AUTHORIZATION, h);
//Authorization header may never be cached in public caches
Optional.ofNullable(requestContext.getHeaderString(HttpHeaders.CACHE_CONTROL))
.map(CacheControl::valueOf)
.filter(cc -> !cc.isPrivate())
.ifPresent(cc -> {
cc.setPrivate(true);
responseContext.getHeaders().putSingle(HttpHeaders.CACHE_CONTROL, cc);
});
});
}
private Response showViewer(HttpServletRequest request, Request jaxReq) throws Exception {
MCRContent content = getContent(request);
String contentETag = content.getETag();
Response.ResponseBuilder responseBuilder = null;
EntityTag eTag = contentETag == null ? null : new EntityTag(contentETag);
if (eTag != null) {
responseBuilder = jaxReq.evaluatePreconditions(eTag);
}
if (responseBuilder == null) {
responseBuilder = Response.ok(content.asByteArray(), MediaType.valueOf(content.getMimeType()));
}
if (eTag != null) {
responseBuilder.tag(eTag);
}
if (content.isUsingSession()) {
CacheControl cc = new CacheControl();
cc.setPrivate(true);
cc.setMaxAge(0);
cc.setMustRevalidate(true);
responseBuilder.cacheControl(cc);
}
return responseBuilder.build();
}
@Test
public void testCustomerResource() throws Exception
{
System.out.println("*** Create a new Customer ***");
Customer newCustomer = new Customer();
newCustomer.setFirstName("Bill");
newCustomer.setLastName("Burke");
newCustomer.setStreet("256 Clarendon Street");
newCustomer.setCity("Boston");
newCustomer.setState("MA");
newCustomer.setZip("02115");
newCustomer.setCountry("USA");
Response response = client.target("http://localhost:8080/services/customers")
.request().post(Entity.xml(newCustomer));
if (response.getStatus() != 201) throw new RuntimeException("Failed to create");
String location = response.getLocation().toString();
System.out.println("Location: " + location);
response.close();
System.out.println("*** GET Created Customer **");
response = client.target(location).request().get();
CacheControl cc = CacheControl.valueOf(response.getHeaderString(HttpHeaders.CACHE_CONTROL));
System.out.println("Max age: " + cc.getMaxAge());
}
@javax.ws.rs.GET public Response method() {
Response.ResponseBuilder responseBuilder = Response.ok();
responseBuilder.header("X-Test", "Hello");
responseBuilder.cacheControl(CacheControl.valueOf(""));
responseBuilder.contentLocation(URI.create(""));
responseBuilder.cookie();
responseBuilder.entity(12d);
responseBuilder.expires(new Date());
responseBuilder.language(Locale.ENGLISH);
responseBuilder.encoding("UTF-8");
responseBuilder.lastModified(new Date());
responseBuilder.link(URI.create(""), "rel");
responseBuilder.location(URI.create(""));
responseBuilder.status(433);
responseBuilder.tag(new EntityTag(""));
responseBuilder.type(MediaType.APPLICATION_JSON_TYPE);
responseBuilder.variants(new LinkedList<>());
return responseBuilder.build();
}
@GET
@Path("/books/response3/{bookId}/")
@Produces("application/xml")
public Response getBookAsResponse3(@PathParam("bookId") String id,
@HeaderParam("If-Modified-Since") String modifiedSince
) throws BookNotFoundFault {
Book entity = doGetBook(id);
EntityTag etag = new EntityTag(Integer.toString(entity.hashCode()));
CacheControl cacheControl = new CacheControl();
cacheControl.setMaxAge(1);
cacheControl.setPrivate(true);
if (modifiedSince != null) {
return Response.status(304).tag(etag)
.cacheControl(cacheControl).lastModified(new Date()).build();
} else {
return Response.ok().tag(etag).entity(entity)
.cacheControl(cacheControl).lastModified(new Date()).build();
}
}
@Test
public void testCreateHeaderProvider() throws Exception {
assertSame(MediaTypeHeaderProvider.class,
new RuntimeDelegateImpl().
createHeaderDelegate(MediaType.class).getClass());
assertSame(EntityTagHeaderProvider.class,
new RuntimeDelegateImpl().
createHeaderDelegate(EntityTag.class).getClass());
assertSame(CacheControlHeaderProvider.class,
new RuntimeDelegateImpl().
createHeaderDelegate(CacheControl.class).getClass());
assertSame(CookieHeaderProvider.class,
new RuntimeDelegateImpl().
createHeaderDelegate(Cookie.class).getClass());
assertSame(NewCookieHeaderProvider.class,
new RuntimeDelegateImpl().
createHeaderDelegate(NewCookie.class).getClass());
}
@Test
public void testFromComplexStringWithSemicolon() {
CacheControlHeaderProvider cp = new CacheControlHeaderProvider() {
protected Message getCurrentMessage() {
Message m = new MessageImpl();
m.put(CacheControlHeaderProvider.CACHE_CONTROL_SEPARATOR_PROPERTY, ";");
return m;
}
};
CacheControl c = cp.fromString(
"private=\"foo\";no-cache=\"bar\";no-store;no-transform;"
+ "must-revalidate;proxy-revalidate;max-age=2;s-maxage=3");
assertTrue(c.isPrivate() && c.isNoStore()
&& c.isMustRevalidate() && c.isProxyRevalidate() && c.isNoCache());
assertTrue(c.isNoTransform() && c.getNoCacheFields().size() == 1
&& c.getPrivateFields().size() == 1);
assertEquals("foo", c.getPrivateFields().get(0));
assertEquals("bar", c.getNoCacheFields().get(0));
}
private long computeExpiry(CacheControl cacheControl, MultivaluedMap<String, String> responseHeaders) {
// if a max-age property is set then it overrides Expires
long expiry = cacheControl.getMaxAge();
if (expiry == -1) {
//TODO: Review if Expires can be supported as an alternative to Cache-Control
String expiresHeader = responseHeaders.getFirst(HttpHeaders.EXPIRES);
if (expiresHeader.length() > 1 && expiresHeader.startsWith("'") && expiresHeader.endsWith("'")) {
expiresHeader = expiresHeader.substring(1, expiresHeader.length() - 1);
}
try {
expiry = (Headers.getHttpDateFormat().parse(expiresHeader).getTime()
- System.currentTimeMillis()) / 1000L;
} catch (final ParseException e) {
// TODO: Revisit the possibility of supporting multiple formats
}
}
return expiry;
}
public CacheControl build() {
CacheControl cacheControl = new CacheControl();
cacheControl.setMustRevalidate(mustRevalidate);
cacheControl.setProxyRevalidate(proxyRevalidate);
cacheControl.setMaxAge(maxAge);
cacheControl.setSMaxAge(sMaxAge);
cacheControl.setNoCache(noCache);
cacheControl.setPrivate(privateFlag);
cacheControl.setNoTransform(noTransform);
cacheControl.setNoStore(noStore);
if (privateFields != null) {
cacheControl.getPrivateFields().addAll(privateFields);
}
if (noCacheFields != null) {
cacheControl.getNoCacheFields().addAll(noCacheFields);
}
if (cacheExtension != null) {
cacheControl.getCacheExtension().putAll(cacheExtension);
}
return cacheControl;
}
@Test
public void testToStringCacheControlWithAllArguments() throws Exception {
CacheControl cacheControl = aCacheControl()
.withMaxAge(60)
.withMustRevalidate(true)
.withNoCache(true)
.withNoStore(true)
.withNoTransform(true)
.withPrivate(true)
.withProxyRevalidate(true)
.withSMaxAge(60)
.withPrivateFields(newArrayList("aaa"))
.withNoCacheFields(newArrayList("bbb"))
.withCacheExtension(ImmutableMap.of("foo", "bar"))
.build();
assertEquals("private=\"aaa\", no-cache=\"bbb\", no-store, no-transform, must-revalidate, proxy-revalidate, 60, 60, foo=bar",
cacheControlHeaderDelegate.toString(cacheControl));
}
@GET
@Produces(MediaType.TEXT_HTML_UTF_8)
public Response getLoginStatusIframe(@QueryParam("version") String version) {
CacheControl cacheControl;
if (version != null) {
if (!version.equals(Version.RESOURCES_VERSION)) {
return Response.status(Response.Status.NOT_FOUND).build();
}
cacheControl = CacheControlUtil.getDefaultCacheControl();
} else {
cacheControl = CacheControlUtil.noCache();
}
InputStream resource = getClass().getClassLoader().getResourceAsStream("login-status-iframe.html");
if (resource != null) {
P3PHelper.addP3PHeader();
session.getProvider(SecurityHeadersProvider.class).options().allowAnyFrameAncestor();
return Response.ok(resource).cacheControl(cacheControl).build();
} else {
return Response.status(Response.Status.NOT_FOUND).build();
}
}
private Response getJs(String name, String version) {
CacheControl cacheControl;
if (version != null) {
if (!version.equals(Version.RESOURCES_VERSION)) {
return Response.status(Response.Status.NOT_FOUND).build();
}
cacheControl = CacheControlUtil.getDefaultCacheControl();
} else {
cacheControl = CacheControlUtil.noCache();
}
Cors cors = Cors.add(request).allowAllOrigins();
InputStream inputStream = getClass().getClassLoader().getResourceAsStream(name);
if (inputStream != null) {
return cors.builder(Response.ok(inputStream).type("text/javascript").cacheControl(cacheControl)).build();
} else {
return cors.builder(Response.status(Response.Status.NOT_FOUND)).build();
}
}
@GET
public Response getImage(@PathParam("vreName") String vreName) {
return transactionEnforcer.executeAndReturn(timbuctooActions -> {
final Vre vre = timbuctooActions.getVre(vreName);
if (vre == null) {
return TransactionStateAndResult.commitAndReturn(Response.status(Response.Status.NOT_FOUND).build());
}
final byte[] imageBlob = timbuctooActions.getVreImageBlob(vreName);
final MediaType mediaType = vre.getMetadata().getImageMediaType();
if (imageBlob != null && mediaType != null) {
final CacheControl cacheControl = new CacheControl();
cacheControl.setMaxAge(604800);
cacheControl.setPrivate(false);
return TransactionStateAndResult.commitAndReturn(Response
.ok(imageBlob).type(mediaType).cacheControl(cacheControl).build());
} else {
return TransactionStateAndResult.commitAndReturn(Response.status(Response.Status.NOT_FOUND).build());
}
});
}
private ResponseBuilder getBuilder(final String jsonEntity, final Date lastMod, final boolean includeEtag, final Request request) {
String etagSource = DominoUtils.md5(jsonEntity);
EntityTag etag = new EntityTag(etagSource);
ResponseBuilder berg = null;
if (request != null) {
berg = request.evaluatePreconditions(etag);
}
if (berg == null) {
berg = Response.ok();
if (includeEtag) {
berg.tag(etag);
}
berg.type(MediaType.APPLICATION_JSON_TYPE);
berg.entity(jsonEntity);
berg.lastModified(lastMod);
CacheControl cc = new CacheControl();
cc.setMustRevalidate(true);
cc.setPrivate(true);
cc.setMaxAge(86400);
cc.setNoTransform(true);
berg.cacheControl(cc);
}
return berg;
}
static Response.ResponseBuilder applyCacheControl(Response.ResponseBuilder response) {
CacheControl cacheControl = new CacheControl();
cacheControl.setPrivate(true);
cacheControl.setNoCache(true);
cacheControl.setNoStore(true);
return response.cacheControl(cacheControl);
}
private ResponseBuilder noCache(ResponseBuilder response) {
CacheControl cacheControl = new CacheControl();
cacheControl.setPrivate(true);
cacheControl.setNoCache(true);
cacheControl.setNoStore(true);
return response.cacheControl(cacheControl);
}
/**
* Edit the response headers to indicating no caching.
*
* @param response response
* @return builder
*/
protected ResponseBuilder noCache(final ResponseBuilder response) {
final CacheControl cacheControl = new CacheControl();
cacheControl.setPrivate(true);
cacheControl.setNoCache(true);
cacheControl.setNoStore(true);
return response.cacheControl(cacheControl);
}
@Path("/{s:.+}")
@GET
public Response file() {
String path = uriInfo.getPath().substring("/admin/file".length());
Optional<Resource> resource = fileRepository.get(path);
if (!resource.isPresent()) {
return Response.ok().status(Response.Status.NOT_FOUND).build();
}
CacheControl cacheControl = new CacheControl();
cacheControl.setMaxAge(Integer.MAX_VALUE);
return Response.ok(resource.get()).type(MediaTypes.getMediaType(path)).cacheControl(cacheControl).build();
}
@Path("/{s:.+}")
@GET
public Response file() {
String path = uriInfo.getPath().substring("file/".length());
Optional<Resource> resource = fileRepository.get(path);
if (!resource.isPresent()) {
return Response.ok().status(Response.Status.NOT_FOUND).build();
}
CacheControl cacheControl = new CacheControl();
cacheControl.setMaxAge(Integer.MAX_VALUE);
return Response.ok(resource.get()).cacheControl(cacheControl).type(MediaTypes.getMediaType(path)).build();
}
@Path("/{s:.+}")
@GET
public Response file() {
String path = uriInfo.getPath().substring("file/".length());
Optional<Resource> resource = fileRepository.get(path);
if (!resource.isPresent()) {
return Response.ok().status(Response.Status.NOT_FOUND).build();
}
CacheControl cacheControl = new CacheControl();
cacheControl.setMaxAge(Integer.MAX_VALUE);
return Response.ok(resource.get()).cacheControl(cacheControl).type(MediaTypes.getMediaType(path)).build();
}
@Path("/{s:.+}")
@GET
@Consumes
public Response get(@Context UriInfo uriInfo, @Context Request request) throws IOException {
String path = uriInfo.getPath();
Optional<ConsoleBundle> consoleBundleOptional = console.findByScriptFile(path);
Resource resource;
if (consoleBundleOptional.isPresent()) {
ConsoleBundle consoleBundle = consoleBundleOptional.get();
resource = new CombinedResource(path, resourcePaths(consoleBundle), webRoot);
} else {
Optional<Resource> optional = webRoot.get(path);
if (!optional.isPresent()) {
throw new NotFoundException(String.format("missing resource, path=%s", path));
}
resource = optional.get();
}
EntityTag eTag = new EntityTag(resource.hash());
Response.ResponseBuilder builder = request.evaluatePreconditions(eTag);
if (builder != null) {
return builder.build();
}
builder = Response.ok(resource).type(MediaTypes.getMediaType(Files.getFileExtension(path)));
builder.tag(eTag);
CacheControl cacheControl = new CacheControl();
cacheControl.setMustRevalidate(true);
builder.cacheControl(cacheControl);
return builder.build();
}
@Override
public Response getDictCollectionDetail(HttpServletRequest request, HttpHeaders header, Company company,
Locale locale, User user, ServiceContext serviceContext, String code, Request requestCC) {
DictcollectionInterface dictItemDataUtil = new DictCollectionActions();
long groupId = GetterUtil.getLong(header.getHeaderString("groupId"));
DictCollection dictCollection = dictItemDataUtil.getDictCollectionDetail(code, groupId);
EntityTag etag = new EntityTag(Integer.toString(Long.valueOf(groupId).hashCode()));
ResponseBuilder builder = requestCC.evaluatePreconditions(etag);
if (Validator.isNotNull(dictCollection)) {
DictCollectionModel dictCollectionModel = DataManagementUtils.mapperDictCollectionModel(dictCollection);
if (OpenCPSConfigUtil.isHttpCacheEnable() && builder == null) {
builder = Response.status(200);
CacheControl cc = new CacheControl();
cc.setMaxAge(OpenCPSConfigUtil.getHttpCacheMaxAge());
cc.setPrivate(true);
// return json object after update
return builder.entity(dictCollectionModel).cacheControl(cc).build();
}
else {
return builder.entity(dictCollectionModel).build();
}
} else {
return null;
}
}
@Override
public Response getDictItemByItemCode(HttpServletRequest request, HttpHeaders header, Company company,
Locale locale, User user, ServiceContext serviceContext, String code, String itemCode) {
DictcollectionInterface dictItemDataUtil = new DictCollectionActions();
long groupId = GetterUtil.getLong(header.getHeaderString("groupId"));
DictItem dictItem = dictItemDataUtil.getDictItemByItemCode(code, itemCode, groupId, serviceContext);
if (Validator.isNotNull(dictItem)) {
DictItemModel dictItemModel = DataManagementUtils.mapperDictItemModel(dictItem, dictItemDataUtil,
user.getUserId(), company.getCompanyId(), groupId, serviceContext);
CacheControl cc = new CacheControl();
cc.setMaxAge(86400);
cc.setPrivate(true);
return Response.status(200).entity(dictItemModel).cacheControl(cc).build();
} else {
ErrorMsg error = new ErrorMsg();
error.setMessage("not found!");
error.setCode(404);
error.setDescription("not found!");
return Response.status(409).entity(error).build();
}
}
@GET
@Path("version")
@Produces(MediaType.APPLICATION_JSON)
public Response getVersionInfo() {
CacheControl cc = new CacheControl();
cc.setMaxAge(60 * 60 * 24); // seconds
cc.setPrivate(true);
return Response
.status(Response.Status.OK)
.cacheControl(cc)
.entity(graphene.getVersionInfo())
.build();
}
@GET
@Path("examples")
@Produces(MediaType.APPLICATION_JSON)
public Response getExampleQueries() {
CacheControl cc = new CacheControl();
cc.setMaxAge(60 * 60 * 24); // seconds
cc.setPrivate(true);
return Response
.status(Response.Status.OK)
.cacheControl(cc)
.entity(EXAMPLE_QUERIES)
.build();
}
/**
* Edit the response headers to indicating no caching.
*
* @param response response
* @return builder
*/
protected Response.ResponseBuilder noCache(final Response.ResponseBuilder response) {
final CacheControl cacheControl = new CacheControl();
cacheControl.setPrivate(true);
cacheControl.setNoCache(true);
cacheControl.setNoStore(true);
return response.cacheControl(cacheControl);
}
@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);
}
}