xis 1.4 포 함 된 list 를 전달 하 는 복잡 한 대상

프로젝트 는 웹 서 비 스 를 발표 하고 클 라 이언 트 에 복잡 한 대상 을 전달 해 야 합 니 다.대상 은 list < > 를 포함 하여 반복 적 으로 연구 한 결과 웹 서 비 스 는 list 대상 을 직접 전달 할 수 없고 대상 배열 로 전환 해 야 전달 할 수 있 습 니 다.javaBean:
package com.wensi.service.server;

import java.io.Serializable;

public class LoginResponse implements Serializable{
	private boolean flag;//           :true       false     
	private OperatorBean operator;//             ,      null
	private AuthorityBean[] authorityArray;//             ,      null
	private String checkNum;//   
	
	public boolean isFlag() {
		return flag;
	}
	public void setFlag(boolean flag) {
		this.flag = flag;
	}
	public OperatorBean getOperator() {
		return operator;
	}
	public void setOperator(OperatorBean operator) {
		this.operator = operator;
	}
	public AuthorityBean[] getAuthorityArray() {
		return authorityArray;
	}
	public void setAuthorityArray(AuthorityBean[] authorityArray) {
		this.authorityArray = authorityArray;
	}
	public String getCheckNum() {
		return checkNum;
	}
	public void setCheckNum(String checkNum) {
		this.checkNum = checkNum;
	}
}

이것 은 복잡 한 사용자 정의 대상 입 니 다. 이 대상 은 기본 형식, 사용자 정의 대상, 사용자 정의 대상 배열 을 포함 하고 있 습 니 다.나머지 대상 은 자세히 말 하지 않 겠 습 니 다. axis 1.4 가 서 비 스 를 발표 하 는 wdd 파일 을 보 겠 습 니 다.
<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
 <handler type="java:org.apache.axis.handlers.http.URLMapper" name="URLMapper"/>
 <handler type="java:com.wensi.service.server.BSHeaderHandler" name="BSHeaderHandler"/>
 <service name="ZNWService" provider="java:RPC">
 
  <requestFlow>  
       <handler type="BSHeaderHandler"/>  
  </requestFlow> 
 
  <parameter name="className" value="com.wensi.service.server.ZNWService"/>
  <parameter name="allowedMethods" value="*"/>
  <parameter name="scope" value="session"/>
  	
<!--                 --> 
 <operation name="login" returnType="ns:LoginResponse">
  	<parameter name="userName" type="tns:string"/>
  	<parameter name="password" type="tns:string"/>
  </operation>

<!--               -->
  <typeMapping 
  	  qname="ns:OperatorBean"
  	  xmlns:ns="ZNWService"
  	  type="java:com.wensi.service.server.OperatorBean"
  	  deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"   
	  encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
	  serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
  /> 

   <typeMapping 
  	  qname="ns:AuthorityBean"
  	  xmlns:ns="ZNWService"
  	  type="java:com.wensi.service.server.AuthorityBean"
  	  deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"   
	  encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
	  serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
  /> 
	 
  <arrayMapping 
      qname="ns:ArrayOfAuthorityBean"
      xmlns:ns="ZNWService"
      type="java:com.wensi.service.server.AuthorityBean[]"
      innerType="ns:AuthorityBean"
      xmlns:ns2="ZNWService"
      deserializer="org.apache.axis.encoding.ser.ArrayDeserializerFactory"   
	  encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
	  serializer="org.apache.axis.encoding.ser.ArraySerializerFactory"
	  
 /> 
 
  <typeMapping 
  	  qname="ns:LoginResponse"
  	  xmlns:ns="ZNWService"
  	  type="java:com.wensi.service.server.LoginResponse"
  	  deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"   
	  encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
	  serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
  />  
  
   </service>
 <transport name="http">      
    <requestFlow>      
        <handler type="URLMapper"/>      
    </requestFlow>      
  </transport> 
</deployment>

메모: < transport name = "http" >     
         
             
   
     
 
이 설정 이 없 으 면 브 라 우 저 에 wdl 상세 정 보 를 표시 할 수 없습니다.

화해시키다
 
        

차단기 에 해당 하 는 기능 을 실현 하 는 것 입 니 다. 클 라 이언 트 는 서버 의 인 터 페 이 스 를 호출 하기 전에 이 방법 으로 처리 해 야 합 니 다.
여기 서 권한 검증 차단 기 를 썼 습 니 다. 코드 는 다음 과 같 습 니 다.
package com.wensi.service.server;

import org.apache.axis.AxisFault;   
import org.apache.axis.Message;   
import org.apache.axis.MessageContext;   
import org.apache.axis.handlers.BasicHandler;   
import javax.xml.soap.SOAPException;   
import javax.xml.soap.SOAPHeader;   
import org.apache.axis.message.SOAPHeaderElement;   
import org.apache.axis.message.SOAPEnvelope;   
import org.apache.axis.message.MessageElement;   

import com.wensi.common.Util;

import javax.xml.namespace.QName;   

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.Map;

@SuppressWarnings("unchecked")
public class BSHeaderHandler extends BasicHandler {   
    private static final long serialVersionUID = 1L; 
    private String operNum;//     
    private String checkNum;//   
    private String time;//       
    String endpoint = ServiceConstant.endpoint;//webservice     
    Map map = ServiceConstant.checkMap;//        map
    
    //    service    handler   
    // invoke()      ,   SOAP       msgContext      
    public void invoke(MessageContext msgContext) throws AxisFault {   
        boolean processedHeader = false;   
        try {   
            //    Request   SOAP      
            Message msg = msgContext.getRequestMessage();   
            SOAPEnvelope envelope = msg.getSOAPEnvelope();   
            SOAPHeader header = envelope.getHeader();   
            Iterator it = header.examineAllHeaderElements();   
            SOAPHeaderElement hel;   
            while (it.hasNext()) {   
                hel = (SOAPHeaderElement) it.next();   
                String headerName = hel.getNodeName();   
                if (headerName.equals("cp:MessageHeader")) {   
                    //    mustUnderstand    true   Header,     
                    //            "    ",   service   
                    //     Did not understand "MustUnderstand"   
                    hel.setProcessed(true);   
                    checkUser(hel);   
                    processedHeader = true;   
                }   
            }   
        } catch (SOAPException e) {   
            throw new AxisFault("     SOAP Header.", e);   
        }   
        if (!processedHeader) {   
            throw new AxisFault("   SOAP Header   ");   
        }   
    }   
    private void checkUser(SOAPHeaderElement hel) throws AxisFault { 
    	String current = Util.dateToString(new Date(), "yyyy-MM-dd HH:mm:ss");//       
        MessageElement element1 = hel.getChildElement(new QName(   
        		endpoint, "isLogin"));   
      
        MessageElement element2 = hel.getChildElement(new QName(   
        		endpoint, "operNum"));
        
        MessageElement element3 = hel.getChildElement(new QName(   
        		endpoint, "checkNum"));   
   
        MessageElement element4 = hel.getChildElement(new QName(   
        		endpoint, "time"));   
        
        
        //           ,        
        if(null == element1 && null != element2 && null != element3 && null != element4){
        	operNum = element2.getValue();
        	checkNum = element3.getValue();
        	time = element4.getValue();
        	Boolean flag1 = false;
        	if(map.keySet().contains(operNum)){
        		CheckNumBean check = (CheckNumBean) map.get(operNum);
        		System.out.println(check.getCheckNum());
        		if(check.getCheckNum().equals(checkNum)){
        			flag1 = true;
        		}
        	}
        		
        	Boolean flag2 = false;
        	if(flag1){
        		//        soapHeader        
        		Long between = countTime(time,current);
        		//         ,   
        		if(Math.abs(between) < 3600L){
        			flag2 = true;
        		}
        	}
        	
        	if(!(flag1 && flag2)){
        		throw new AxisFault("    ");
        	}
        	
        	//  map   
        	CheckNumBean check = (CheckNumBean) map.get(operNum);
        	check.setLastTime(check.getCurrentTime());
        	check.setCurrentTime(current);	
        } else if(null == element1 && (null == element2 || null == element3 || null == element4)){
        	throw new AxisFault("    ");
        }
    } 
    
    //     
    private Long countTime(String str1, String str2){
	  SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");   
	  Date begin = null;
	  Date end = null;
	try {
		begin = df.parse(str1);
		end = df.parse(str2);
	} catch (ParseException e) {
		e.printStackTrace();
	}   
	  long between=(end.getTime()-begin.getTime())/1000;//  1000        
	  return between;
    }
}  

클 라 이언 트 는 핸드 메 이 드 이 고 이쪽 클 라 이언 트 는 자바 ssh 구조 이기 때문에 사용자 정 보 를 저장 하고 메모리 에 의 해 완성 할 수 있 습 니 다.
클 라 이언 트 가 호출 될 때 soap Header 에 인증 정 보 를 넣 어야 합 니 다.
클 라 이언 트 코드 는 다음 과 같 습 니 다.
package com.wensi.service.client;


import java.net.MalformedURLException;
import java.net.URL;
import java.rmi.RemoteException;
import java.util.Date;

import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import javax.xml.rpc.ServiceException;
import javax.xml.rpc.encoding.XMLType;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPException;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.ser.ArrayDeserializerFactory;
import org.apache.axis.encoding.ser.ArraySerializerFactory;
import org.apache.axis.encoding.ser.BeanDeserializerFactory;
import org.apache.axis.encoding.ser.BeanSerializerFactory;
import org.apache.axis.message.SOAPHeaderElement;

import com.wensi.common.Util;
import com.wensi.service.server.AccountCustomerBean;
import com.wensi.service.server.AccountFlag;
import com.wensi.service.server.AccountResponse;
import com.wensi.service.server.AuthorityBean;
import com.wensi.service.server.LoginResponse;
import com.wensi.service.server.OperatorBean;
import com.wensi.service.server.ServiceConstant;


public class ZNWServiceClient {
	String endpoint = ServiceConstant.endpoint;//webservice     
	Service service = new Service();//  service  
	
	public LoginResponse login(String userName,String password) throws Exception{
		SOAPHeaderElement cpHeader = new SOAPHeaderElement(endpoint,"MessageHeader");
		cpHeader.setPrefix("cp");
		cpHeader.setMustUnderstand(true);   
		SOAPElement ele = null;
		ele = cpHeader.addChildElement("isLogin");
		ele.addTextNode("true");
		
		//  call  
		Call call = (Call) service.createCall();
		// webservice        call   ,  call       
		URL url = new URL(endpoint);
		call.setTargetEndpointAddress(url);
		//  webservice    
		call.setOperationName("login");
		//     
		QName qn1 = new QName("urn:ZNWService","OperatorBean");
		call.registerTypeMapping(OperatorBean.class, qn1, new BeanSerializerFactory(OperatorBean.class,qn1), new BeanDeserializerFactory(OperatorBean.class,qn1));
		
		QName qn2 = new QName("urn:ZNWService","AuthorityBean");
		call.registerTypeMapping(AuthorityBean.class, qn2, new BeanSerializerFactory(AuthorityBean.class,qn2), new BeanDeserializerFactory(AuthorityBean.class,qn2));
	
		QName qn3 = new QName("urn:ZNWService","ArrayOfAuthorityBean");
		call.registerTypeMapping(AuthorityBean[].class, qn3,new ArraySerializerFactory(),new ArrayDeserializerFactory());
		
		QName qn4 = new QName("urn:ZNWService","LoginResponse");
		call.registerTypeMapping(LoginResponse.class, qn4, new BeanSerializerFactory(LoginResponse.class,qn4), new BeanDeserializerFactory(LoginResponse.class,qn4));

		call.addParameter("userName", org.apache.axis.Constants.XSD_STRING,ParameterMode.IN);
		call.addParameter("password", org.apache.axis.Constants.XSD_STRING,ParameterMode.IN);
		call.setReturnType(qn1, LoginResponse.class);
		
		call.addHeader(cpHeader);
		
		LoginResponse loginRes = (LoginResponse) call.invoke(new Object[]{userName,password});
		return loginRes;
	}	
}

좋은 웹페이지 즐겨찾기