PostFilterForClientInfo.java
package cn.home1.oss.environment.admin;
import static com.google.common.base.Charsets.UTF_8;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.netflix.zuul.context.RequestContext;
import cn.home1.oss.lib.common.crypto.EncodeDecryptor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import java.io.InputStream;
import java.util.Map;
/**
* Created by leo on 16/11/7.
*/
@Slf4j
public class PostFilterForClientInfo extends AbstractZuulFilter {
@Autowired
private ObjectMapper objectMapper;
@Autowired
private ClientKeyStore clientKeyStore;
@Autowired
private EncodeDecryptor decryptor;
public PostFilterForClientInfo() {
super(0, "post");
}
@Override
public boolean shouldFilter() {
return RequestContext.getCurrentContext().getRequest().getRequestURL().toString().contains("/info");
}
@Override
@SneakyThrows
public Object run() {
final RequestContext currentContext = RequestContext.getCurrentContext();
final String requestUri = currentContext.getRequest().getRequestURI();
final String serviceId = ClientKey.serviceIdFrom(requestUri);
final InputStream responseDataStream = currentContext.getResponseDataStream();
final String json = IOUtils.toString(responseDataStream, UTF_8);
final Map<String, Object> infoObject = this.objectMapper.readValue(json, new TypeReference<Map<String, Object>>() {
});
final String[] usernamePassword = ClientKey.usernamePasswordFromInfoObject(infoObject, this.decryptor);
if (!this.clientKeyStore.isAvailable(serviceId) && usernamePassword != null) {
final ClientKey clientKey = new ClientKey(serviceId, usernamePassword[0], usernamePassword[1]);
this.clientKeyStore.save(clientKey);
}
currentContext.setResponseDataStream(IOUtils.toInputStream( //
this.objectMapper.writeValueAsString(infoObject), UTF_8));
return null;
}
}