XML、HTML、URL特殊字符的处理
不完全代码
form表单提交时,调用一个js函数将需要特殊处理的字段使用encodeURIComponent()方法进行编码。
<html> <form name="instantMgrSendForm" action="<%=path + jspCtxSer.getRequestServletUrl()%>" method="post" onsubmit="return validate()"> <%=jspCtxSer.getRequiredHtmlHiddenFields(null,"sendInstantMgrFlow")%> <textarea id="body" name="body" style="width: 300px; height: 80px"> </textarea> <input id="submit" value="发送" type="submit" /> </form></html>
<script language="JavaScript" src="<%=path%>js/jquery.js"></script><script language="javascript">function validate(){$('#body').val(encodeURIComponent($('#body').val())); return true;}</script>
form表单提交后,后续处理交由业务流程sendInstantMgrFlow来处理
业务流程sendInstantMgrFlow是处理一系列操作步骤的集合,在其中加入一步UrlDecodeStep
<?xml version="1.0" encoding="UTF-8"?><SelfDefTransFlow><TransactionFlow id="sendInstantMgrFlow"transFlowContext="sendInstantMgrCtx"refTransTemplate="authCheckTransTemplate"><transStep id="UrlDecodeStep" names="body" enCoding="UTF-8"dest="next" /><transition id="Other" dest="setErrorPageStep" /></transStep><transStep id="sendInstantMgrStep" fromNO="" funcode="SMS001"format="15"dest="next" /><transition id="Other" dest="setErrorPageStep" /></transStep><transStep id="sqlAccessTransStep" serviceName="getSYSData"targetScope="root"><transition id="0" dest="next" /><transition id="Other" dest="setErrorPageStep" /></transStep><transStep id="sendSMSBySocketStep" funcode="SMS001"dest="SetLogForSendInstantMgrStep" /><transition id="Other" dest="setErrorPageStep" /></transStep><transStep id="setSuccessPageStep"/><transStep id="setErrorPageStep"pageName="error.jsp" /><refFormat alias="inputSendMsgFmt" refId="inputSendMsgFmt" /><refFormat alias="outputSendMsgFmt" refId="outputSendMsgFmt" /></TransactionFlow><context id="sendInstantMgrCtx" type="transFlow"><refKColl refId="sendInstantMgrColl" /><refService refId="getSYSData" /></context><kColl id="sendInstantMgrColl"><iColl id="msgIColl"><kColl><field id="funcode" des="功能码" /><field id="id" des="短信渠道自动为每一条新的短信生成,方便查询" /><field id="channel" des="发送请求的渠道应用在短信平台注册的编号" /><field id="type" des="短信类型:100宣传短信,101业务短信" /><field id="prio" des="短信发送优先级 0:普通1:重要2:最高" /><field id="sdate" des="短信的发送开始日期" /><field id="edate" des="短信的最迟发送日期" /><field id="stime" des="短信的发送开始时间" /><field id="etime" des="短信的最迟发送时间" /><field id="to" des="短信接受人的手机号码(发送给多个手机号码时,号码之间用“,”号分隔)" /><field id="sp" des="接收短信运营商" /><field id="from" des="短信的发送人的手机号码" /><field id="sender" des="短信发送者" /><field id="format" des="信息格式:15为普通短信" /><field id="body" des="短信的内容" /></kColl></iColl></kColl><SQLAccessService id="getSYSData" dbResource="CBIFJDBC"><JDBCSQLStatementexp="select smshost, smsport from sms_sysdataconfig"><ResultMap columnName="smshost" dataName="SMSHost" /><ResultMap columnName="smsport" dataName="SMSPort" /></JDBCSQLStatement></SQLAccessService></SelfDefTransFlow>
/* * @(#)UrlDecodeStep.java 1.0 2011-12-09 * * Copyright (c) 2009 Sunyard System Engineering Co., Ltd. * All rights reserved. * * This software is the confidential and proprietary information of * Sunyard System Engineering Co., Ltd. ("Confidential Information"). * You shall not disclose such Confidential Information and shall use it * only in accordance with the terms of the license agreement you entered * into with Sunyard. */////////////////////////////////////////////////////////////////package com.sunyard.cbif.sms.transSteps;import java.io.UnsupportedEncodingException;import java.net.URLDecoder;import com.sunyard.cbif.etp.base.Context;import com.sunyard.cbif.etp.base.ETPConstance;import com.sunyard.cbif.etp.base.ETPObjectNotFoundException;import com.sunyard.cbif.etp.base.TransactionFailException;import com.sunyard.cbif.etp.base.TransactionStep;/** * 用于对页面送过来的经encodeURIComponent()的字段进行解码和 * 特殊字符的半全角转换 * @version 1.0 * @author Aaron * */public class UrlDecodeStep extends TransactionStep {private static final long serialVersionUID = 1L;private String enCoding = "UTF-8";public UrlDecodeStep() {super();}@Overridepublic int execute(Context context) throws TransactionFailException,Exception {try {enCoding = super.getParamValue("enCoding");String tnames = super.getParamValue("names");String[] names = tnames.split(",");for (int i = 0; i < names.length; ++i) {String value = (String) context.getValueAt(names[i]);if (value != null)if (!value.trim().equals(""))context.getElementAt(names[i]).setValue(Decode(value));elsecontext.getElementAt(names[i]).setValue("");}} catch (ETPObjectNotFoundException e) {ETPConstance.sendMessageToMonitor(e);return 1;} catch (UnsupportedEncodingException er) {ETPConstance.sendMessageToMonitor(er);return 1;}return 0;}/** * 根据enCoding解码 * * @throws UnsupportedEncodingException */private String Decode(String src) throws UnsupportedEncodingException {System.out.println("---UrlDecodeStep-1-解码前的短信内容---〉" + src);src = URLDecoder.decode(src, this.enCoding);System.out.println("---UrlDecodeStep-2-解码后的短信内容---〉" + src);/* 避免打乱xml报文将所有半角的xml标记替换为全角字符 */src = Half_shape_to_Full_shape(src);System.out.println("---UrlDecodeStep-3-替换xml特殊字符为全角字符的短信内容---〉" + src);return src;}/** * 特殊xml、html字符转换为全角字符 */private String Half_shape_to_Full_shape(String src) {src = src.replace('<', '<');src = src.replace('>', '>');src = src.replace('/', '/');src = src.replace('\\', '\');src = src.replace('&', '&');src = src.replace('|', '|');src = src.replace('#', '#');return src;}}
控制台输出
---UrlDecodeStep-1-解码前的短信内容---〉Hello%20World!%E4%BD%A0%E5%A5%BD%EF%BC%81%0D%0A%3Cbr%2F%3E%0D%0A%3Ca%20href%3D%22Hello.Action%3FName%3DAaron%26passwd%3D123456%22%3E%0D%0A%7C%40%7C%23%7C%24%7C%25%7C%5E%7C%26%7C*%7C!%7C-%7C%5C%7C%C2%B7%7C%C2%B7%7CEND---UrlDecodeStep-2-解码后的短信内容---〉Hello World!你好!<br/><a href="Hello.Action?Name=Aaron&passwd=123456">|@|#|$|%|^|&|*|!|-|\|||END---UrlDecodeStep-3-替换xml特殊字符为全角字符的短信内容---〉Hello World!你好!<br/><a href="Hello.Action?Name=Aaron&passwd=123456">|@|#|$|%|^|&|*|!|-|\|||END