/* ================================================================== * Created [2009-4-27 下午11:32:55] by Jon.King * ================================================================== * TSS * ================================================================== * mailTo:jinpujun@hotmail.com * Copyright (c) Jon.King, 2009-2012 * ================================================================== */ package com.jinhe.tss.core.web.filter; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletInputStream; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import org.apache.log4j.Logger; import org.dom4j.Document; import com.jinhe.tss.core.Config; import com.jinhe.tss.core.exception.BusinessException; import com.jinhe.tss.core.exception.BusinessServletException; import com.jinhe.tss.core.sso.context.Context; import com.jinhe.tss.core.util.XMLDocUtil; import com.jinhe.tss.core.util.XmlUtil; import com.jinhe.tss.core.web.dispaly.xmlhttp.XmlHttpDecoder; /** * <p> XmlHttpDecodeFilter.java </p> * <p> * 将XmlHttp的XML数据解析成Request中的属性。 * 传入的XMLHttp的XML数据格式如:<Request><Param><Name><![CDATA[resourceId]]></Name><Value><![CDATA[2]]></Value></Param></Request>, * 需要解析成 request.put("resourceId", 2); * </p> */ public class XmlHttpDecodeFilter implements Filter { private static final Logger log = Logger.getLogger(XmlHttpDecodeFilter.class); public void init(FilterConfig arg0) throws ServletException { log.info("XMLHTTP请求解析服务初始化完成!appCode=" + Config.getAttribute(Config.APPLICATION_CODE)); } /** * 通过可重写的Request对象,将xml数据流解析成名值对,重写入Request对象中。 * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain) */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { try { HttpServletRequest httpRequest = (HttpServletRequest) request; if (Context.getRequestContext().isXmlhttpRequest()) { Document doc = null; ServletInputStream is = null; String requestBody = null; try { requestBody = getRequestBody(is = request.getInputStream()); doc = XMLDocUtil.dataXml2Doc(requestBody); } catch (IOException e) { throw new BusinessException("获取请求数据流失败", e); } catch (Exception e) { try { doc = XMLDocUtil.dataXml2Doc(XmlUtil.stripNonValidXMLCharacters(requestBody)); } catch (Exception e1) { throw new BusinessException("解析xml请求数据流失败", e1); } } finally { try { is.close(); } catch (Exception e) { throw new BusinessException("关闭请求数据流失败", e); } } httpRequest = XmlHttpDecoder.decode(doc.getRootElement(), httpRequest); // 返回RewriteableHttpServletRequestWrapper的request, 并传递给以后的filter和servlet } chain.doFilter(httpRequest, response); } catch (RuntimeException e) { throw new BusinessServletException(e); } } private static String getRequestBody(ServletInputStream sis) throws IOException, UnsupportedEncodingException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); int bLen = 0; byte[] buffer = new byte[8 * 1024]; while ((bLen = sis.read(buffer)) > 0) { baos.write(buffer, 0, bLen); } return new String(baos.toByteArray(), "UTF-8"); } public void destroy() { } }