`
log_cd
  • 浏览: 1089124 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

JDK6开发WebService及用户认证

阅读更多
一、编写服务端并发布
1、定义接口
public interface EchoService {

	 public String echo(String name);
	
}

2、接口实现
@WebService(name="wsecho",portName="echoServicePort", serviceName="echoService",targetNamespace="http://ws.logcd.net/") 
@SOAPBinding(style = Style.DOCUMENT,use = Use.LITERAL)//Style.DOCUMENT为默认值
@HandlerChain(file="handle-chain.xml")
public class EchoServiceImpl implements EchoService{

	@WebMethod()
	public String echo(//指定参数名及命名空间
			@WebParam(name="userName", targetNamespace="http://ws.logcd.net/") String name) {
		return "hello, " + name;
	}

}

3、处理用户身份认证类
public class AuthValidatorHandler implements SOAPHandler<SOAPMessageContext> {

	public static final String TARGET_NAMESPACE = "http://ws.logcd.net/";
	
	public static final String AUTH_HEADER_NAME = "AuthHeader";
	
	public static final Map<String,String> cacheAcountMap = new HashMap<String,String>();
	
	static{
		cacheAcountMap.put("510028", "123456");
	}
	
	@SuppressWarnings("unchecked")
	public boolean handleMessage(SOAPMessageContext ctx) {
    	
       Boolean isResponsed=(Boolean)ctx.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
       if(!isResponsed){
           SOAPMessage msg=ctx.getMessage();
           try {
        	  
        	   String id = "", pwd = "";
        	   SOAPHeader header = msg.getSOAPHeader();
              Iterator<SOAPHeaderElement> it = header.getChildElements(new QName(TARGET_NAMESPACE, AUTH_HEADER_NAME));
              
              if(it.hasNext()){
            	  SOAPHeaderElement headElem = (SOAPHeaderElement)it.next();
            	  Iterator<SOAPElement> eleIt = headElem.getChildElements();
            	  
            	  while(eleIt.hasNext()){
            		  SOAPElement ele = eleIt.next();
            		  String key = ele.getLocalName();
            		  
            		  if(key.toUpperCase().equals("ACCOUNT")){
            			  String val = ele.getValue();
            			  String[] arr = val.split("/");
            			  if(arr.length == 2){
	            			  id = arr[0]; 
	            			  pwd = arr[1];
            			  }
            			  break;
            		  }
            	  }
              }
              System.out.println("id="+id+",pwd="+pwd);
              if(StringUtils.isEmpty(id) || StringUtils.isEmpty(pwd)){
            	 throw new SOAPFaultException(new QName(TARGET_NAMESPACE, "-1"),
            			 "User Acount Err!", "id or pwd is empty.", null);
              }
              
              return authValidate(id, pwd);
           } catch (SOAPException e) {
              throw new RuntimeException(e);
           }
       }
       return false;
    }
    
    /*
     * 验证用户名和密码
     */
    private boolean authValidate(String id, String pwd){
    	if(cacheAcountMap.containsKey(id) 
    				&& ((String)cacheAcountMap.get(id)).equals(pwd)){
    		return true;
    	}else{
       	 	throw new SOAPFaultException(new QName(TARGET_NAMESPACE, "-2"),
    			 "Unauthorized Visit!", "id or pwd incorrect.", null);
    	}
    }
   
	@Override
	public void close(MessageContext arg0) {
		
	}

	@Override
	public boolean handleFault(SOAPMessageContext arg0) {
		return false;
	}

	@Override
	public Set<QName> getHeaders() {
		return null;
	}
}

4、请求处理链(handle-chain.xml)
<?xml version="1.0" encoding="UTF-8"?>
<javaee:handler-chains xmlns:javaee="http://java.sun.com/xml/ns/javaee"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    
    <javaee:handler-chain>
    
       <javaee:handler>
       
           <javaee:handler-class>com.cdmcs.jws.auth.AuthValidatorHandler</javaee:handler-class>
           
       </javaee:handler>
       
    </javaee:handler-chain>
    
</javaee:handler-chains>

5、发布WS服务
public class WSPublisher {

	public static void main(String[] args){
		
		Endpoint.publish("http://localhost:8099/echoService", new EchoServiceImpl()); 	
		System.out.println("publish all services...");
		
	}
	
}

二、编写调用WS的客户端
public class Jdk6WsAxisClient {

	public static void main(String[] args) {  
        try {  
            String endpoint = "http://localhost:8099/echoService";  
            String nameSpace = "http://ws.logcd.net/";   
  
			Service service = new Service();           
            Call call = (Call) service.createCall();  
            call.setTargetEndpointAddress(endpoint);  
            call.setOperationName(new QName(nameSpace, "echo"));  
  
            //参数名为WebParam中指定的参数名,未指定参数名时传arg0-argN
            //call.addParameter("userName", XMLType.XSD_STRING, ParameterMode.IN); //Style.DOCUMENT,且方法参数没有指定命名空间或Style.RPC 
            call.addParameter(new QName(nameSpace, "userName"), XMLType.XSD_STRING, ParameterMode.IN);//Style.DOCUMENT指定了命名空间
            
            call.setUseSOAPAction(true);  
            call.setReturnType(org.apache.axis.Constants.XSD_STRING);  
            call.setSOAPActionURI(nameSpace+"echoService"); 
            
            SOAPHeaderElement soapHeaderElement = new SOAPHeaderElement(nameSpace, "AuthHeader"); 
            soapHeaderElement.addChildElement("ACCOUNT").setValue("510028/123456");    
            call.addHeader(soapHeaderElement);
            
            String result = (String) call.invoke(new Object[] {"frank"});  
              
            System.out.println(result);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  	
	
}
分享到:
评论

相关推荐

    Java源码 SpringMVC Mybatis Shiro Bootstrap Rest Webservice

    集成Webservice平台,包括jaxws服务、CXF框架,配置双加密的权限认证。使服务集成更加安全。 9. Bootstrap html5提供了两套前台开环境,包括CMS和电子商务网站,使您的开发更加的简洁。 技术点: 1. Springmvc ...

    Jmeter接口测试+压力测试

    因为jmeter是java开发的,所以运行的时候必须先要安装jdk才可以。jmeter是免安装的,拿到安装包之后直接解压就可以使用,同时它在linux/windows/macos上都可以使用。jmeter可以做接口测试和压力测试。其中接口测试的...

    最新Java面试宝典pdf版

    JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类? 49 73、字节流与字符流的区别 50 74、什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。 51 75、描述一下JVM加载...

    Java面试宝典2010版

    10、在weblogic管理制台中对一个应用域(或者说是一个网站,Domain)进行jms及ejb或连接池等相关信息进行配置后,实际保存在什么文件中? 11、说说weblogic中一个Domain的缺省目录结构?比如要将一个简单的helloWorld.jsp...

    Java面试笔试资料大全

    JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类? 49 73、字节流与字符流的区别 50 74、什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。 51 75、描述一下JVM加载...

    JAVA面试宝典2010

    JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类? 49 73、字节流与字符流的区别 50 74、什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。 51 75、描述一下JVM加载...

    Java面试宝典-经典

    JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类? 49 73、字节流与字符流的区别 50 74、什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。 51 75、描述一下JVM加载...

    Java面试宝典2012版

    19、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串? 90 20.现在输入n个数字,以逗号,分开;然后可选择升或者降序排序;按提交键就在另一页面显示按什么排序...

    java面试题大全(2012版)

    JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类? 49 73、字节流与字符流的区别 50 74、什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。 51 75、描述一下JVM加载...

    java面试宝典2012

    JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类? 54 73、字节流与字符流的区别 54 74、什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。 56 75、描述一下JVM加载...

    Java面试宝典2012新版

    JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类? 49 73、字节流与字符流的区别 50 74、什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。 51 75、描述一下JVM加载...

    Java 面试宝典

    6、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? ....................... 9 7、char 型变量中能不能存贮一个中文汉字?为什么? ................................................ 10 8...

Global site tag (gtag.js) - Google Analytics