PostFilterForClientInfo.java

  1. package cn.home1.oss.environment.admin;

  2. import static com.google.common.base.Charsets.UTF_8;

  3. import com.fasterxml.jackson.core.type.TypeReference;
  4. import com.fasterxml.jackson.databind.ObjectMapper;
  5. import com.netflix.zuul.context.RequestContext;
  6. import cn.home1.oss.lib.common.crypto.EncodeDecryptor;

  7. import lombok.SneakyThrows;
  8. import lombok.extern.slf4j.Slf4j;

  9. import org.apache.commons.io.IOUtils;
  10. import org.springframework.beans.factory.annotation.Autowired;

  11. import java.io.InputStream;
  12. import java.util.Map;

  13. /**
  14.  * Created by leo on 16/11/7.
  15.  */
  16. @Slf4j
  17. public class PostFilterForClientInfo extends AbstractZuulFilter {

  18.   @Autowired
  19.   private ObjectMapper objectMapper;

  20.   @Autowired
  21.   private ClientKeyStore clientKeyStore;

  22.   @Autowired
  23.   private EncodeDecryptor decryptor;

  24.   public PostFilterForClientInfo() {
  25.     super(0, "post");
  26.   }

  27.   @Override
  28.   public boolean shouldFilter() {
  29.     return RequestContext.getCurrentContext().getRequest().getRequestURL().toString().contains("/info");
  30.   }

  31.   @Override
  32.   @SneakyThrows
  33.   public Object run() {
  34.     final RequestContext currentContext = RequestContext.getCurrentContext();
  35.     final String requestUri = currentContext.getRequest().getRequestURI();
  36.     final String serviceId = ClientKey.serviceIdFrom(requestUri);

  37.     final InputStream responseDataStream = currentContext.getResponseDataStream();
  38.     final String json = IOUtils.toString(responseDataStream, UTF_8);
  39.     final Map<String, Object> infoObject = this.objectMapper.readValue(json, new TypeReference<Map<String, Object>>() {
  40.     });

  41.     final String[] usernamePassword = ClientKey.usernamePasswordFromInfoObject(infoObject, this.decryptor);
  42.     if (!this.clientKeyStore.isAvailable(serviceId) && usernamePassword != null) {
  43.       final ClientKey clientKey = new ClientKey(serviceId, usernamePassword[0], usernamePassword[1]);
  44.       this.clientKeyStore.save(clientKey);
  45.     }

  46.     currentContext.setResponseDataStream(IOUtils.toInputStream( //
  47.         this.objectMapper.writeValueAsString(infoObject), UTF_8));
  48.     return null;
  49.   }
  50. }