import java.io.IOException; import java.nio.charset.Charset; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import org.apache.log4j.Logger; import org.springframework.util.StreamUtils; import org.springframework.util.StringUtils; import org.springframework.web.multipart.MultipartHttpServletRequest; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.parser.Feature; import com.alibaba.fastjson.serializer.SerializerFeature; import com.yundaex.common.basic.vo.RequestVO; import com.yundaex.common.basic.vo.UserContext; import com.yundaex.common.bidiboxing.constants.CommunicationConstants; import com.yundaex.common.bidiboxing.convert.PayloadConvertException; import com.yundaex.common.exception.WrappedIOException; import com.yundaex.utility.json.YDJSONConvertException; import com.yundaex.utility.protobuf.ProtobufUtils; import com.yundaex.utility.xml.XMLUtils; public class HttpHelper { //logger for class HttpHelper private static final Logger logger = Logger.getLogger(HttpHelper.class); /** * generate requestVO from http servlet request * */ public static RequestVO generateRequestVO(HttpServletRequest request) { RequestVO requestVO = null; // get request vo from request Object attribute = request.getAttribute("requestVO"); if (attribute != null && RequestVO.class.isInstance(attribute)) { requestVO = (RequestVO) attribute; } else { String payloadFormat = getPayloadFormat(request); String voStr = request.getParameter("payload"); if (null == voStr && !CommunicationConstants.DATA_DIALECT_PROTOBUF.equals(payloadFormat)) { try { Charset charset = Charset.forName("UTF-8"); ServletInputStream inputStream = request.getInputStream(); voStr = StreamUtils.copyToString(inputStream, charset); } catch (IOException e) { throw new YDJSONConvertException("payload convert exception,couldn't convert to bean"); } } if (null != voStr) { if (logger.isDebugEnabled()) { logger.debug(voStr); } if (StringUtils.isEmpty(voStr)) { requestVO = new RequestVO(); } if ( !StringUtils.isEmpty(voStr) && CommunicationConstants.DATA_DIALECT_JSON.equals(payloadFormat)) { try{ Feature[] features = {Feature.SortFeidFastMatch}; requestVO = JSONObject.parseObject(voStr, RequestVO.class, features); } catch(Exception e) { throw new PayloadConvertException("JSON数据不合法,无法解析。"); } } if (!StringUtils.isEmpty(voStr) && CommunicationConstants.DATA_DIALECT_XML.equals(payloadFormat)) { requestVO = XMLUtils.unmarshall(voStr, RequestVO.class); } } if (null == voStr && CommunicationConstants.DATA_DIALECT_PROTOBUF.equals(payloadFormat)) { ServletInputStream inputStream = null; try { inputStream = request.getInputStream(); } catch (IOException e) { throw new WrappedIOException(); } requestVO = ProtobufUtils.unmarshal(inputStream, RequestVO.class); } if (requestVO != null) { requestVO.setFormat(payloadFormat); if (null == requestVO.getUserContext()) { requestVO.setUserContext(UserContext.constructEmptyUserContext()); } requestVO.getUserContext().setDialect(payloadFormat); request.setAttribute("requestVO", requestVO); } else { throw new YDJSONConvertException("payload is blank,couldn't convert to bean"); } } return requestVO; } private static String getPayloadFormat(HttpServletRequest request) { if (request.getContentType() != null) { // System.out.println(request.getContentType()); if (request.getContentType().contains("application/json")) { return CommunicationConstants.DATA_DIALECT_JSON; } else if (request.getContentType().contains("application/xml")) { return CommunicationConstants.DATA_DIALECT_XML; } else if (request.getContentType().contains("application/x-protobuf")) { return CommunicationConstants.DATA_DIALECT_PROTOBUF; } else if (request.getContentType().contains("multipart/form-data")) { if(logger.isDebugEnabled()) { logger.debug(request.getClass()); } if(HttpServletRequestWrapper.class.isAssignableFrom(request.getClass())) { HttpServletRequestWrapper httpServletRequestWrapper = (HttpServletRequestWrapper) request; request = (HttpServletRequest) httpServletRequestWrapper.getRequest(); } if (MultipartHttpServletRequest.class.isAssignableFrom(request.getClass())) { MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request; String format = multiRequest.getParameter("format"); if (format == null || format.equalsIgnoreCase(CommunicationConstants.DATA_DIALECT_JSON)) { return CommunicationConstants.DATA_DIALECT_JSON; } if (format.equalsIgnoreCase(CommunicationConstants.DATA_DIALECT_XML)) { return CommunicationConstants.DATA_DIALECT_XML; } if (format.equalsIgnoreCase(CommunicationConstants.DATA_DIALECT_PROTOBUF)) { return CommunicationConstants.DATA_DIALECT_PROTOBUF; } } } } return CommunicationConstants.DATA_DIALECT_JSON; } }
import java.util.Date; public class RequestVO { private Object data; private String validation; private String format; private String username; private Date dateTime; private UserContext userContext; public String getFormat() { return format; } public void setFormat(String format) { this.format = format; } public String getValidation() { return validation; } public void setValidation(String validation) { this.validation = validation; } /** * @return the userContext */ public UserContext getUserContext() { return userContext; } /** * @param userContext the userContext to set */ public void setUserContext(UserContext userContext) { this.userContext = userContext; } /** * @return the username */ public String getUsername() { return username; } /** * @param username the username to set */ public void setUsername(String username) { this.username = username; } /** * @return the data */ public Object getData() { return data; } /** * @param data the data to set */ public void setData(Object data) { this.data = data; } public Date getDateTime() { return dateTime; } public void setDateTime(Date dateTime) { this.dateTime = dateTime; } }
public interface CommunicationConstants { public static final String DATA_DIALECT_JSON = "json"; public static final String DATA_DIALECT_XML = "xml"; public static final String DATA_DIALECT_PROTOBUF = "protobuf"; }
public class UserContext { //auto calculate private Long userId; //copy form request vo private String username; private String userProp; private Long domainId; //auto calculate private String userType; //auto calculate;from contentTypoe;never transform private String dialect; //optional ;support for multi-timezone private Integer timeZone; //required;transform private Integer curOrganization; //optional;support gb_rbac;transform private Integer curGroup; //auto calculate. default is RBAC,optional. private String pmModel; private String msg; private String appKey; // API 接口名称 private String method; //设备类型 private String deviceType; /** * @return the dialect */ public String getDialect() { return dialect; } /** * @param dialect the dialect to set */ public void setDialect(String dialect) { this.dialect = dialect; } /** * @return the timeZone */ public Integer getTimeZone() { return timeZone; } /** * @param timeZone the timeZone to set */ public void setTimeZone(Integer timeZone) { this.timeZone = timeZone; } /** * @return the userId */ public Long getUserId() { return userId; } /** * @param userId the userId to set */ public void setUserId(Long userId) { this.userId = userId; } public static UserContext constructEmptyUserContext(){ UserContext emptyContext = new UserContext(); return emptyContext; } /** * @return the username */ public String getUsername() { return username; } /** * @param username the username to set */ public void setUsername(String username) { this.username = username; } public String getUserProp() { return userProp; } public void setUserProp(String userProp) { this.userProp = userProp; } /** * @return the userType */ public String getUserType() { return userType; } /** * @param userType the userType to set */ public void setUserType(String userType) { this.userType = userType; } /** * @return the pmModel */ public String getPmModel() { return pmModel; } /** * @param pmModel the pmModel to set */ public void setPmModel(String pmModel) { this.pmModel = pmModel; } /** * @return the curGroup */ public Integer getCurGroup() { return curGroup; } /** * @param curGroup the curGroup to set */ public void setCurGroup(Integer curGroup) { this.curGroup = curGroup; } /** * @return the curOrganization */ public Integer getCurOrganization() { return curOrganization; } /** * @param curOrganization the curOrganization to set */ public void setCurOrganization(Integer curOrganization) { this.curOrganization = curOrganization; } /** * @return the msg */ public String getMsg() { return msg; } /** * @param msg the msg to set */ public void setMsg(String msg) { this.msg = msg; } /** * @return the appKey */ public String getAppKey() { return appKey; } /** * @param appKey the appKey to set */ public void setAppKey(String appKey) { this.appKey = appKey; } /** * @return the method */ public String getMethod() { return method; } /** * @param method the method to set */ public void setMethod(String method) { this.method = method; } /** * @return the domainId */ public Long getDomainId() { return domainId; } /** * @param domainId the domainId to set */ public void setDomainId(Long domainId) { this.domainId = domainId; } public String getDeviceType() { return deviceType; } public void setDeviceType(String deviceType) { this.deviceType = deviceType; } }