package com.romeo.backbone.msg; import java.beans.IntrospectionException; import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import org.springframework.flex.core.MessageInterceptor; import org.springframework.flex.core.MessageProcessingContext; import com.romeo.backbone.untils.DangerString; import flex.messaging.messages.Message; /** * <h2>消息拦截器</h2> * <p> * 用于处理特殊逻辑在AMF传入传出java 表单的时候,用拦截器检查传入消息的内容,或者给返回信息进行额外统一的操作。 * </p> * * @author aGuang * */ public class CustomMessageInterceptor implements MessageInterceptor { /** * <h2>输入输出</h2> * <p> * 异常定位信息,后续扩展 , 跨站点脚本拦截在此处理 * </p> */ public Message postProcess(MessageProcessingContext context, Message inputMessage, Message outputMessage) { Object msgBody = inputMessage.getBody(); if (msgBody.getClass().isArray()) { Object[] params = (Object[]) msgBody; for (int i = 0; i < params.length; i++) { Object param = params[i]; // log.info("post Process ---: " + param + " " + // param.getClass()); if (typeConversion(param.getClass())) { // 如果等于自定义对象 Object conv = convString(param); params[i] = conv;// 填回去 } else if (stringConversion(param.getClass())) { // 如果等于字符类型 String conv = DangerString.filter(param.toString()); params[i] = conv;// 填回去 } } inputMessage.setBody(params); } // log.info("output Body: " + outMsgBody); return outputMessage; } /** * <p> * 异常定位信息,后续扩展 , 跨站点脚本拦截在此处理 * </p> */ public Message preProcess(MessageProcessingContext context, Message inputMessage) { Object msgBody = inputMessage.getBody(); /** * 反转所有参数,将字符对象的非法字符转换 反转对象参数,将对象的属性对象的非法字符转换 */ if (msgBody.getClass().isArray()) { Object[] params = (Object[]) msgBody; for (int i = 0; i < params.length; i++) { Object param = params[i]; if (typeConversion(param.getClass())) { // 如果等于自定义对象 Object conv = convString(param); params[i] = conv;// 填回去 } else if (stringConversion(param.getClass())) { // 如果等于字符类型 String conv = DangerString.filter(param.toString()); params[i] = conv;// 填回去 } } inputMessage.setBody(params); } return inputMessage; } /** * 将对象反转并过滤掉危险字符 */ private Object convString(Object obj) { Class<? extends Object> clazz = obj.getClass(); Field[] fields = obj.getClass().getDeclaredFields();// 获得属性 for (Field field : fields) { Object type = field.getType().getSimpleName(); if ("String".equals(type)) { PropertyDescriptor pd = null; try { pd = new PropertyDescriptor(field.getName(), clazz); } catch (IntrospectionException e) { pd = null; } Method getMethod = null; if (pd != null) { /** 获得get方法 */ getMethod = pd.getReadMethod(); } Object o = null; if (getMethod != null) { try { o = getMethod.invoke(obj); String value = "";// DangerString.filter(o.toString()); field.setAccessible(true); // 设置些属性是可以访问的 field.set(obj, value);// 给属性设值 } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** 把值反转后重新设置进去 */ } } return obj; } /** * <h2>返回映射对象的类型</h2> * <p> * 如果是八党员之一,则返回flase;否则返回true; * </p> * * @param cls * @return */ private boolean typeConversion(Class<?> cls) { String nameType = cls.getSimpleName(); // log.info(nameType); if ("Integer".equals(nameType)) { return false; } if ("String".equals(nameType)) { return false; } if ("Float".equals(nameType)) { return false; } if ("Double".equals(nameType)) { return false; } if ("Boolean".equals(nameType)) { return false; } if ("Long".equals(nameType)) { return false; } if ("Short".equals(nameType)) { return false; } if ("Character".equals(nameType)) { return false; } return true; } /** * <h2>返回映射对象的类型</h2> * <p> * 如果是String、Character,则返回flase;否则返回true; * </p> * * @param cls * @return */ private boolean stringConversion(Class<?> cls) { String nameType = cls.getSimpleName(); // log.info(nameType); if ("String".equals(nameType)) { return true; } else if ("Character".equals(nameType)) { return true; } else { return false; } } }
package com.romeo.backbone.untils; /** * 过滤危险的字符 * @author aGuang * */ public class DangerString { static public String filter(String param) { return param; } }