ResFilterAspect.java
@Aspect
@Component
@Slf4j
public class ResFilterAspect {
@Pointcut("@annotation(com.aop.annotation.ResFilter)")
public void pointcut() {
}
@Around("pointcut()")
public Object around(ProceedingJoinPoint point){
long beginTime = System.currentTimeMillis();
Object data = null;
try {
data = point.proceed();
if (data == null){
return null;
}
if (data instanceof String){
data = ResFilterUtil.filter((String) data);
}
if (data instanceof RetData){
RetData retData;
retData = (RetData) data;
String s = ResFilterUtil.filter(JSON.toJSONString(retData.getExtra()));
retData.setExtra(JSONObject.parse(s));
data = retData;
}
} catch (Throwable e) {
log.error("response data filter fail:",e);
}
long time = System.currentTimeMillis() - beginTime;
log.info("response data filter success,use time:{}",time );
return data;
}
}
ResFilter注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ResFilter {
String value() default "b2b_response_data_filter";
}
ResFilterUtil .java
@Slf4j
public class ResFilterUtil {
private static final List<String> filterList = Lists.newArrayList("fareType","uniteFlightRebate","frDetailPriceMarkup","supplierMarkup","bookingIncentive", "frBasicPriceMarkup", "ticketSupplierCode", "rebateType", "policyRebate");
private static final List<String> ignoreFilterList = Lists.newArrayList( "policyRebate","ticketSupplierCode");
private static final String properties = "/unameDisplaySupplierCode.properties";
private static final String displaySupplierCodeList = "displaySupplierCodeList";
public static void main(String[] args) {
}
public static String filter(String data){
if (StringUtils.isEmpty(data)){
return new String();
}
Map dataMap = (Map) JSONObject.parse(data);
String cid = (String) dataMap.get("cid");
if (ReadPropertiesUtils.containContent(properties,displaySupplierCodeList, cid)){
filterList.removeAll(ignoreFilterList);
}
return JSON.toJSONString(doFilter(dataMap,filterList));
}
private static Map doFilter(Map dataMap,List<String> filterList){
try {
Iterator var = dataMap.entrySet().iterator();
while (var.hasNext()) {
Map.Entry<String, Object> entry = (Map.Entry<String, Object>) var.next();
String k = entry.getKey();
Object v = entry.getValue();
if (StringUtils.equals(k,"supplierChannel")){
SupplierChannelEnum channelEnum = SupplierChannelEnum.getByDesc((String) v);
dataMap.put(k,channelEnum == null ? v : channelEnum.getCode());
}
if (StringUtils.equals(k,"gdsType") || StringUtils.equals(k,"gds")){
try {
GdsType gdsType = GdsType.valueOf((String) v);
if (gdsType !=null){
dataMap.put(k,gdsType.getCode());
}
}catch (Exception e){
GdsType gds = GdsType.getByDesc((String) v);
if (gds !=null){
dataMap.put(k,gds.getCode());
}
}
}
if (filterList.contains(k)){
var.remove();
}else if (v instanceof Map){
doFilter((Map) v,filterList);
}else if (v instanceof List){
for (Object o : (List) v) {
if (o instanceof Map){
doFilter((Map)o,filterList);
}
}
}
}
}catch (Exception e){
log.error("vo data filter error:",e);
}
return dataMap;
}
public static String filter(String data,String filterStr,String ignoreFilterStr){
if (StringUtils.isEmpty(data)){
return new String();
}
if (StringUtils.isEmpty(filterStr)){
return data;
}
Map dataMap = (Map) JSONObject.parse(data);
List<String> filterList = Arrays.asList(filterStr.split(","));
if (StringUtils.isNotEmpty(ignoreFilterStr)){
List<String> ignoreFilterList = Arrays.asList(ignoreFilterStr.split(","));
String cid = (String) dataMap.get("cid");
if (ReadPropertiesUtils.containContent(properties,displaySupplierCodeList, cid)){
filterList.removeAll(ignoreFilterList);
}
}
return JSON.toJSONString(doFilter(dataMap,filterList));
}
}
将自定义注解作用在方法上进行返回数据过滤
问题点:作用在controller的方法不生效
解决办法:spring-mvc.xml中增加
<aop:aspectj-autoproxy proxy-target-class="true"/>