1.自动配置类
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package org.hzero.starter.keyencrypt;
import com.fasterxml.jackson.databind.ObjectMapper;
import feign.codec.Decoder;
import feign.optionals.OptionalDecoder;
import org.hzero.core.jackson.config.ObjectMapperPostProcess;
import org.hzero.core.message.MessageAccessor;
import org.hzero.core.util.ResponseUtils;
import org.hzero.starter.keyencrypt.core.EncryptProperties;
import org.hzero.starter.keyencrypt.core.EncryptionService;
import org.hzero.starter.keyencrypt.core.IEncryptionService;
import org.hzero.starter.keyencrypt.core.WebBeanPostProcessor;
import org.hzero.starter.keyencrypt.mvc.EncryptHeaderContextFilter;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.SmartInitializingSingleton;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.openfeign.support.ResponseEntityDecoder;
import org.springframework.cloud.openfeign.support.SpringDecoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.PriorityOrdered;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
@Configuration
@EnableConfigurationProperties({EncryptProperties.class})
public class EncryptConfiguration implements PriorityOrdered {
public EncryptConfiguration() {
}
@Bean
public SmartInitializingSingleton keyEncryptMessagesLoader() {
return () -> {
MessageAccessor.addBasenames(new String[]{"classpath:messages/messages_keyencrypt"});
};
}
@Bean
public EncryptHeaderContextFilter HeaderContextFilter() {
return new EncryptHeaderContextFilter();
}
@Bean
public IEncryptionService encryptionService(EncryptProperties encryptProperties) {
return new EncryptionService(encryptProperties);
}
@Bean
public WebBeanPostProcessor webBeanPostProcessor(ConfigurableBeanFactory beanFactory, IEncryptionService encryptionService, ObjectMapperPostProcess objectMapperPostProcess) {
return new WebBeanPostProcessor(beanFactory, encryptionService, this.customObjectMapper(objectMapperPostProcess));
}
@Bean
public Decoder feignDecoder(ObjectMapperPostProcess objectMapperPostProcess) {
ObjectMapper customObjectMapper = this.customObjectMapper(objectMapperPostProcess);
HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter(customObjectMapper);
ObjectFactory<HttpMessageConverters> objectFactory = () -> {
return new HttpMessageConverters(new HttpMessageConverter[]{jacksonConverter});
};
ResponseUtils.setObjectMapper(customObjectMapper);
return new OptionalDecoder(new ResponseEntityDecoder(new SpringDecoder(objectFactory)));
}
public ObjectMapper customObjectMapper(ObjectMapperPostProcess objectMapperPostProcess) {
return (ObjectMapper)objectMapperPostProcess.postProcessAfterInitialization(new ObjectMapper(), "customObjectMapper");
}
public int getOrder() {
return -2147483648;
}
}
2.EncryptHeaderContextFilter 拦截器
3.注解@ Encrypt
4.定制springmvc中ArgumentResolver参数解析器
- EncryptPathVariableMethodArgumentResolver
- EncryptRequestParamMethodArgumentResolver
- EncryptRequestResponseBodyMethodProcessor
- EncryptServletModelAttributeMethodProcessor
前面三个分别对@PathVariable,@RequestParam,@RequestBody,@ResponseBody注解标注的参数上的@Encrypt进行加密解析,主要调用EncryptionService类中的方法进行