跨域实现frame域POST参数传递

风清扬斈 8年前 (2011-11-15) 信息科技 3944 0

Http Post协议框架
1. 框架实现

a) 访问url配置:

ocswebservices/WebContent/WEB-INF/web.xml,中新增加了一个servlet和servlet-mapping配置:

<servlet>

<description>

</description>

<display-name>

HttpHandleServlet</display-name>

<servlet-name>HttpHandleServlet</servlet-name>

<servlet-class>

com.ztesoft.zsmart.bss.ws.servlet.HttpHandleServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>HttpHandleServlet</servlet-name>

<url-pattern>/HttpPost/*</url-pattern>根据不同的现场需求配置访问url

</servlet-mapping>


所有Http Post调用统一的HttpHandleServlet入口。

b) 配置加载

i. 新项目配置文件命名规则

Http Post接口配置文件采用“projectName_Http.xml”的命名规则,配置文件放入config/ccm/protocol/下,配置更新时不需要现场修改,直接覆盖。

ii. 配置参数说明(以塞内加尔项目配置为例)

<globle_vars>

<var key="CONTACT_CHANNEL_ID" value="11" comments="渠道ID"/>

<var key="ACTION_PARAM_NAME" value="RequestType" comments="指定http request param中哪个字段是表示action"/>

<var key="DEBUG_MODE" value="0" comments="1:调试环境,不校验用户名密码;0:生产环境,校验用户名密码"/>

<var key="USERNAME_PARAM_NAME" value="ReqCred.UserId" comments="指定http request param中哪个字段是表示action"/>

<var key="PASSWORD_PARAM_NAME" value="ReqCred.PIN" comments="指定http request param中哪个字段是表示action"/>

<var key="USERNAME" value="zsmart" comments="WebService请求header的认证用户名"/>

<var key="PASSWORD" value="zsmart" comments="WebService请求header的认证密码"/>



<var key="INFO_REQUEST_ON" value="2" comments="是否打印请求信息和返回信息到日志(2-打印请求与返回消息,1-打印请求消息,0-不打印)。"/>



<var key="ERROR_MESSAGE_FORMAT" value=(i)"*** ERROR ExecutionStatus={0} *** StatusMessage={1}"(i) comments="是否打印请求信息和返回信息到日志(2-打印请求与返回消息,1-打印请求消息,0-不打印)。"/>

</globle_vars>



2. 接口协议举例说明:

a) 请求消息:

i. Get方式

GET /ocswebservices/HttpPost?TransactionId=000000012345&ReqCred.Role=4&ReqCred.UserId=zsmart&ReqCred.PIN=zsmart&AccessFrontendId=JSUNICOM&ConsumerId=8613072506800&ConsumerAccountId=0&ConsumerPIN=1234&Purpose=cashin+Recharge&Money.Currency=RMB&Money.Amount=20000&ExpiryDate=1043977423&RequestType=chargeAmount1 HTTP/1.1

User-Agent: None

Host: localhost:7099



ii. Post方式

POST /ocswebservices/ETopupServlet HTTP/1.1

User-Agent: None

Content-Length: 294

Host: localhost:8380


TransactionId=24924012914524&ReqCred.Role=3&ReqCred.UserId=PSPLogin&ReqCred.PIN=&AccessFrontendId=%2F%2Fhttp%3A&ConsumerId=8613001114206&ConsumerAccountId=0&ConsumerPIN=&Purpose=Online+Recharging&Money.Currency=RMB&Money.Amount=10000&ExpiryDate =1014937200000&RequestType=rechargeAmount



b) 返回消息

i. 成功返回

HTTP/1.1 200 OK

Content-Type: text/plain

Connection: close

Date: Thu, 21 Mar 2002 09:53:03 GMT

Server: Apache Tomcat/4.0.4 (HTTP/1.1 Connector)

Response: TransactionID=100000000001 ExecutionStatus=1



ii. 失败返回

HTTP/1.1 200 OK

Content-Type: text/plain

Connection: close

Date: Thu, 21 Mar 2002 09:53:03 GMT

Server: Apache Tomcat/4.0.4 (HTTP/1.1 Connector)


"*** ERROR ExecutionStatus=<status> *** StatusMessage=<msg>"



3. 新增加业务接口

<!-- User Management -->

<action id="chargeAmount1" service="SenegalFT_ChargeAmount1"

validators="(N=TransactionId T=s R=1 L=1 B=20),(N=ReqCred.Role T=n R=1 L=-32768 B=32767),(N=ReqCred.UserId T=s R=1 L=1 B=30),

(N=ReqCred.PIN T=s R=0 L=1 B=20),(N=AccessFrontendId T=s R=1 L=1 B=80),(N=ConsumerId T=s R=1 L=1 B=30),

(N=ConsumerAccountId T=n R=0 L=-9223372036854775808 B=9223372036854775807),(N=ConsumerPIN T=s R=0 L=1 B=20),(N=MerchantId T=s R=0 L=1 B=30),

(N=ProductId T=s R=0 L=1 B=40),(N=Purpose T=s R=1 L=1 B=80),(N=Money.Currency T=s R=1 L=1 B=3),

(N=Money.Amount T=n R=1 L=0 B=9223372036854775807),(N=RoutingInfo T=s R=0 L=1 B=100),(N=AccountType T=n R=0 L=-32768 B=32767),

(N=ClusterName T=n R=0 L=1 B=10),(N=RequestType T=s R=1 L=1 B=100)"

comments="扣费接口" addCustContact="1"/>


a) Id:由ACTION_PARAM_NAME指定的参数名称从http request中获取参数值

b) Service:请求调用的业务服务

c) Validators:Http post 中的参数验证,与webservice接口中参数验证一致

d) addCustContact:是否增加客户接触记录的开关。

4. 实现接口调用的业务服务与实现webservice业务服务一致,需要注意的几个地方:

a) 输入http请求参数ReqCred.UserId=PSPLogin在调用业务服务时转换为bo中的一个多级参数:bo. ReqCred.UserId中,写代码时取参数值举例如下:

bo.get("ReqCred.UserId");


b) 接触渠道会在接口配置文件中配置,在业务服务中可取到该参数

bo.get("CONTACT_CHANNEL_ID");


c) 返回结果设置,业务服务执行结果值返回参数串由业务服务拼装,设置在返回的bo中,约定参数名为:HTTP_RESPONSE:

bo.set("HTTP_RESPONSE", respond); 



   
我个人觉得可以使用request.getParameterNames();这样获得页面Form里的所有具有name属性得标签,然后和request.getParameter()配合使用可以的得到Form所有的标签的name和value了,下面上段代码:
Java代码
  1. public Map<String,Object> getRequestData(HttpServletRequest request){   
  2.          Map<String, Object> map=null;   
  3.          Enumeration enumeration=request.getAttributeNames();//获取表单内所有元素   
  4.     if(enumeration.hasMoreElements()){   
  5.          map=new HashMap<String, Object>();   
  6.          while (enumeration.hasMoreElements()) {   
  7.             String inputName = (String) enumeration.nextElement();//获取元素名   
  8.              map.put(inputName,request.getParameter(inputName));//以表单名作为key   
  9.         }   
  10.         }   
  11.         return map;   
  12.     }  
"

相关推荐

  • 网友评论

    • (*)

    最新评论